unit fs02iop_00_lib; interface Uses SysUtils; Type EMyError = class(Exception); //raise EMyError.create('Для вставки новой строки - воспользуйтесь соотв. кнопкой'); Var MainDir:string; //Нормализовать мнемокод function MnemoCode_Normalize(sMnemo:string):string; //Заменить в строке заданные символы - на один (заданный) function Replace_CharsInString(Sx : String; CharsForRepl:String; StrRepl:String=' '; YesIn:boolean=true) : String; //Замена символов в строке function ReplaceSymbol(str: string; oldsym, newsym: string): String; //нормализовать строку для SQL-запроса function PrepareForSQL(Str: String): String; //Удалить лишние (заданные) символы из строки (2 и более) function String_ExcessChar_Delete(Sx : String; Ch:char) : String; //Удалить лишние пробелы из строки (2 и более) function String_ExcessSpace_Delete(Sx : String) : String; //Конвертировать String в BOOLEAN function spStrToBool(Sx: String; Def: boolean=false) : boolean; //аналог стандартной функции IfThen (StrUTILS) function IfThen(V:boolean;sTrue:string='true';sFalse:string='false'):string; //Получить слово из строки Sx по номеру NumWord. UnChar - множество разделителей function Get_Word_From_String(Sx : String; NumWord : integer; UnChar: String=' '; YesAllTrim_Before: boolean=true) : String; //Определить кол-во слов в строке Sx. UnChar - множество разделителей function Get_CountWords_In_String(Sx : String; UnChar: String=' '; YesAllTrim_Before: boolean=true) : integer; //округление function RoundTo(V:extended;iRoundTo:integer=2):extended; implementation function MnemoCode_Normalize(sMnemo:string):string; //Нормализовать мнемокод begin Result:=''; sMnemo:=trim(sMnemo); if sMnemo<>'' then begin Result := ReplaceSymbol(sMnemo, #9, #32); Result := ReplaceSymbol(Result, #39, #32); Result := ReplaceSymbol(Result, '"', #32); Result := ReplaceSymbol(Result, '`', #32); Result:=trim(String_ExcessSpace_Delete(Result)); Result:=trim(Replace_CharsInString(Result, //#32+#39+'~`"!@#$%^&*+={}[]\|/?><.,', #32+'~!@#$%^&*+={}[]\|/?><.,', '_', true)); Result := ReplaceSymbol(Result, '№', 'N'); Result := ReplaceSymbol(Result, 'ё', 'е'); Result := ReplaceSymbol(Result, 'Ё', 'Е'); Result := trim(Result); end; end; function Replace_CharsInString(Sx : String; CharsForRepl:String; StrRepl:String=' '; YesIn:boolean=true) : String; //Заменить в строке заданные символы - на один (заданный) Var i : integer; begin Result:=''; if (length(Sx)>0) and (length(CharsForRepl)>0) and (length(StrRepl)>0) then begin for i:=1 to length(Sx) do begin if POS((Sx[i]),CharsForRepl)>0 then begin if YesIn then begin Result:=Result+StrRepl; //заменяем end else begin Result:=Result+Sx[i]; end; end else begin if YesIn then begin Result:=Result+Sx[i]; end else begin Result:=Result+StrRepl; //заменяем end; end; end; end; end; function String_ExcessChar_Delete(Sx : String; Ch:char) : String; //Удалить лишние (заданные) символы из строки (2 и более) Var N: integer; begin Result:=trim(Sx); N:=1; while N>0 do begin N:=POS(Ch+Ch, Result); if N>0 then begin Result:=trim(ReplaceSymbol(Result, Ch+Ch, Ch)); end; end; end; function String_ExcessSpace_Delete(Sx : String) : String; //Удалить лишние пробелы из строки (2 и более) begin Result:=trim(String_ExcessChar_Delete(Sx, #32)); end; function PrepareForSQL(Str: String): String; //нормализовать строку для SQL-запроса begin Result := ReplaceSymbol(Str, '''', ''''''); end; function ReplaceSymbol(str: string; oldsym, newsym: string): String; //Замена символов в строке var i, j: integer; repstr, R: string; s1, s2: String; begin s1 := oldsym; s2 := Str; i := pos(s1, s2); if i > 0 then begin R := ''; RepStr := Str; while i > 0 do begin R := R + copy(Repstr, 1, i - 1) + newsym; repstr := copy(repstr, i + length(oldsym), length(Repstr)); i := pos(oldsym, Repstr); end; Result := R + RepStr; end else Result := Str; end; function spStrToBool(Sx: String; Def: boolean=false) : boolean; //Конвертировать String в BOOLEAN begin Result:=FALSE; Sx:=Trim(Sx); if Length(Sx)>0 then begin Sx:=AnsiUpperCase(Sx); if Sx='Y' then Result:=TRUE; if Sx='YES' then Result:=TRUE; if Sx='YE' then Result:=TRUE; if Sx='Д' then Result:=TRUE; if Sx='ДА' then Result:=TRUE; if Sx='TRUE' then Result:=TRUE; if Sx='T' then Result:=TRUE; if Sx='ИСТИНА' then Result:=TRUE; //if Sx='1' then Result:=TRUE; if not Result then begin if StrToIntDef(Trim(Sx),0)>0 then Result:=true; end; end else begin Result:=Def; end; end; function Get_Word_From_String(Sx : String; NumWord : integer; UnChar: String=' '; YesAllTrim_Before: boolean=true) : String; //Получить слово из строки Sx по номеру NumWord. UnChar - множество разделителей //YesAllTrim_Before - если TRUE, то перед анализом удалить из строки левые и правые пробелы Var InWord : byte; NumWordCur, i : integer; begin Result:=''; if YesAllTrim_Before then Sx:=trim(Sx); if length(Sx)>0 then begin if NumWord>0 then begin InWord := 0; NumWordCur:=0; i:=0; while i<length(Sx) do begin i:=i+1; if POS(Sx[i],UnChar)<=0 then begin //этот символ - НЕ разделитель if InWord<=0 then NumWordCur:=NumWordCur+1; //мы - на начале слова InWord:=1; //Мы внутри слова if NumWordCur=NumWord then begin //Это - наше слово Result:=Result+Sx[i]; //и мы его выдираем из строки end; end else begin //этот символ - разделитель InWord:=0; //Мы снаружи слова if NumWordCur=NumWord then begin //Это было - наше слово i:=length(Sx)+1; //поэтому, выходим из цикла и функции end; end; end; end; end; end; function Get_CountWords_In_String(Sx : String; UnChar: String=' '; YesAllTrim_Before: boolean=true) : integer; //Определить кол-во слов в строке Sx. UnChar - множество разделителей var InWord : byte; i : integer; begin Result:=0; if YesAllTrim_Before then Sx:=trim(Sx); if length(Sx)>0 then begin InWord := 0; i:=0; while i<length(Sx) do begin i:=i+1; if POS(Sx[i],UnChar)<=0 then begin //этот символ - НЕ разделитель if InWord<=0 then Result:=Result+1; //переход на начало слова InWord:=1; //Мы внутри слова end else begin //этот символ - разделитель InWord:=0; //Мы снаружи слова end; end; end; end; function IfThen(V:boolean;sTrue:string='true';sFalse:string='false'):string; //аналог стандартной функции IfThen (StrUTILS) begin sTrue:=trim(sTrue); sFalse:=trim(sFalse); if length(sTrue)<=0 then sTrue:='true'; if length(sFalse)<=0 then sFalse:='false'; if V then begin Result:=sTrue; end else begin Result:=sFalse; end; end; function iPower_10(N:integer):int64; //Вспомогательная для RoundTo //вычисление 10 в степени N (без проверок на переполнение) Var i:integer; begin Result:=0; if n>0 then begin Result:=1; for i:=1 to N do begin Result:=Result*10; end; end; end; function RoundTo(V:extended;iRoundTo:integer=2):extended; //округление Var Sx:string; N,iRes : int64; begin Result:=V; if iRoundTo>0 then begin N:=iPower_10(iRoundTo); if N>0 then begin iRes:=round(Result*N); Result:=iRes/N; end; end else begin Result:=round(V); end; end; end.