root/trunk/ExtraFunctions.pas

Revision 2, 29.1 kB (checked in by sagrer, 10 months ago)
  1. Вымаран старый механизм хранения версии в вендовом ресурсе.
  2. Подключен новый механизм хранения версии.
  3. Заодно подключены файлеги паскалевские, обеспечивающие этот самый механизм.
  • Property svnmailer:content-charset set to cp1251
Line 
1 ///////////////////////////////////////////////////////////
2 //                    ExtraFunctions                     //
3 //    Ìîäóëü ñ ñàìîïàëüíûìè ôóíêöèÿìè è ïðî÷èì îáùåãî    //
4 //                       íàçíà÷åíèÿ.                     //
5 //             Copyright (C) 2007 Gipat Group            //
6 //              Ðàñïðîñòðàíÿåòñÿ íà óñëîâèÿõ             //
7 //                      LGPL v2.1                        //
8 //                                                       //
9 //                   www.gipatgroup.org                  //
10 ///////////////////////////////////////////////////////////
11
12 //Ê ðàáîòå íàä äàííûì ôàéëîì ïðèëîæèëè ðóêè, íîãè.... êîðî÷å àôôòàðû:
13 // 1) Sagrer (sagrer@yandex.ru)
14
15 ////////////////////////////////////////////////////////////////////////
16
17 unit ExtraFunctions;
18
19 {$IFDEF FPC} 
20   {$mode objfpc}
21 {$ENDIF FPC}
22
23 {$H+}
24
25 interface
26
27 uses
28   Classes, SysUtils, Windows, Registry
29   {$IFDEF FPC}, crc{$ELSE}, crc_32{$ENDIF FPC}
30   {$IFNDEF LCL}, Messages, StrUtils {$ENDIF LCL};
31
32 const
33   DoDebugOutput = true;            //Âûâîäèòü ëè äåáàæíûå ìåññàãè.
34
35   //Òèïî èäåíòèôèêàòîðû...
36  
37   //EnvPathAdd
38   EnvPathAdd_User = 0;
39   EnvPathAdd_Global = 1;
40
41 Function StrRPos(str1,str2 : pchar) : pchar;  //Íà îñíîâå ôóíêöèè èç FPC. Èùåò ïåðâîå âõîæäåíèå str2 â str1, íî ñ êîíöà ñòðîêè.
42 Function Parse( var S : AnsiString; const Separators : AnsiString ) : AnsiString;   //Ôóíêöèÿ äëÿ ïàðñèíãà ñòðîê, ñäåëàíî íà îñíîâå ôóíêöèè èç KOL.
43 Function ParseTail( var S : AnsiString; const Separators : AnsiString ) : AnsiString;   //Àíîëîãè÷íî òîìó ÷òî âûøå, íî ðàáîòàåò ñ õâîñòà.
44 Function ParseNumericHead(var S : AnsiString) : AnsiString;    //Ïàðñèò ñ÷èòàÿ çà ðàçäåëèòåëü ïåðâûé ïîïàâøèéñÿ ñèìâîë íå-öèôðó.
45 Function IsNumericStr (Str : string) : boolean;      //À ýòà ôóíêà äîëæíà îïðåäåëÿòü, ñîñòîèò ëè ñòðîêà òîëüêî èç öèôð.
46 Function IsVersionStr (Str : string) : boolean;      //ßâëÿåòñÿ ëè ñòðîêà íîìåðîì âåðñèè.
47 Function IsNewVersion(OldVer, NewVer : string) : boolean;     //Ôóíêà äîëæíà ïðîâåðÿòü, íîâåå ëè âåðñèÿ.
48 Procedure ParsePathString(const PathString : string; var PathStringList : TStringList);  //Ïàðñèò ñòðîêó ñ ïóòÿìè è çàãîíÿåò èíôó â TStringList.
49 Function CombinePathString(const PathStringList : TStringList) : string;  //Ãåíåðèò èç TStringList ñòðîêó òèïà Path.
50 Function EnvPathExists(const PathStr : string; const CheckUser, CheckGlobal : boolean) : boolean;   //Ïðîâåðÿåò, ñóùåñòâóåò ëè òàêîé path â óêàçàííûõ ïåðåìåííûõ.
51 Function EnvPathRemove(const PathStr : string; const CheckUser, CheckGlobal : boolean) : boolean;   //Óäàëÿåò ñòðîêó ïóòè èç óêàçàííûõ PATH. Ðåçóëüòàò - true åñëè ÷åãî-òî áûëî óäàëåíî.
52 Function EnvPathAdd(const PathStr : string; const Target : integer; const ForceRemoveDoubles : boolean = true; const ForceCreateLocal : boolean = false) : boolean;     //Äîáàâëÿåò ïóòü â óêàçàííûå PATH.
53 Function TrimExLeft(const InputStr, TrimChars : string) : string;   //Òðèìàåò ñèìâîëû ñëåâà.
54 Function TrimExRight(const InputStr, TrimChars : string) : string;   //Òðèìàåò ñèìâîëû ñïðàâà.
55 Function TrimEx(const InputStr, TrimChars : string) : string;   //Òðèìàåò ñèìâîëû ñî âñåõ ñòîðîí.
56 Function FileToCRC32(const FileName : string; const ConsoleOutput : boolean = false) : cardinal;   //Âû÷èñëèòü CRC32 äëÿ ôàéëà, åñëè íàäî ñ èíäèêàöèåé ïðîöåññà â êîíñîëü.
57 Function CheckCharNum(const Ch : char) : boolean;    //Ïðîâåðèòü - ÿâëÿåòñÿ ëè ñèìâîë öèôðîé
58 Function CheckStrInt(const St : string) : boolean;    //Ïðîâåðèòü - ÿâëÿåòñÿ ëè ñòðîêà ïðåäñòàâëåíèåì öåëî÷èñëåííîãî çíà÷åíèÿ
59 Function CheckStrFloat(const St : string) : boolean;   //Ïðîâåðèòü - ÿâëÿåòñÿ ëè ñòðîêà ïðåäñòàâëåíèåì äðîáíîãî çíà÷åíèÿ
60 Function IntToBool(const InputInt : Integer) : boolean;   //Ïðåâðàòèòü Integer â Boolean
61 Function StrToBool(const InputStr : AnsiString) : boolean;  //Ïðåâðàòèòü String â Boolean
62 Function BoolToInt(const InputBool : boolean) : Integer;  //Ïðåâðàòèòü Boolean â Integer
63 Function BoolToStr(const InputBool : boolean) : AnsiString;   //Ïðåâðàòèòü Boolean â String
64 Function ReadFirstLineFromStr(const InputStr : AnsiString) : AnsiString;  //Ýëåìåíòàðíî ñêîïèðîâàòü ñòðîêó îò íà÷àëà äî áàéòà #13 èëè #10 åñëè #13 íå îáíàðóæèòñÿ.
65
66 implementation
67
68 uses
69   ExtraFileUtils;
70
71 Function StrRPos(str1,str2 : pchar) : pchar;
72 //Íà îñíîâå ôóíêöèè èç FPC.
73 //Èùåò ïåðâîå âõîæäåíèå str2 â str1, íî ñ êîíöà ñòðîêè.
74 var
75    p : pchar;
76    lstr2 : LongInt;
77 begin
78    StrRPos:=nil;
79    if (str1 = nil) or (str2 = nil) then
80      exit;
81    p:=strrscan(str1,str2^);
82    if p=nil then
83      exit;
84    lstr2:=strlen(str2);
85    while p<>nil do
86      begin
87         if strlcomp(p,str2,lstr2)=0 then
88           begin
89              StrRPos:=p;
90              exit;
91           end;
92         dec(p);
93         p:=strrscan(p,str2^);
94      end;
95 end;
96
97 Function Parse( var S : AnsiString; const Separators : AnsiString ) : AnsiString;
98 //Ôóíêöèÿ äëÿ ïàðñèíãà ñòðîê, ñäåëàíî íà îñíîâå ôóíêöèè èç KOL.
99 var Pos : Integer;
100
101 begin
102   Pos := Longint( StrPos( PChar(S), PChar(Separators) ) - LongInt(S) + 1 ) ;
103   if Pos <= 0 then
104      Pos := Length( S ) + Length(Separators);
105   Result := S;
106   S := Copy( Result, Pos + Length(Separators), MaxInt );
107   Result := Copy( Result, 1, Pos - 1 );
108 end;
109
110 Function ParseTail( var S : AnsiString; const Separators : AnsiString ) : AnsiString;
111 //Àíîëîãè÷íî òîìó ÷òî âûøå, íî ðàáîòàåò ñ õâîñòà.
112 var Pos : Integer;
113
114 begin
115   Pos := Longint( StrRPos( PChar(S), PChar(Separators) ) - LongInt(S) + 1 ) ;
116   Result := S;
117   S := Copy(Result, 1, Pos-1);
118   Result := Copy(Result, Pos+Length(Separators), Length(Result)-(Pos+Length(Separators))+1);
119 end;
120
121 Function ParseNumericHead(var S : AnsiString) : AnsiString;
122 //Ïàðñèò ñ÷èòàÿ çà ðàçäåëèòåëü ïåðâûé ïîïàâøèéñÿ ñèìâîë íå-öèôðó.
123 var
124   Pos : Integer;
125   Finded : Boolean;
126
127 begin
128   //Èíèöèàëèçàöèÿ.
129   Pos := 0;
130   Finded := false;
131  
132   //Èùåì ïåðâóþ "íå-öèôðó"
133   repeat
134     Pos := Pos+1;
135     if Pos <= Length(S) then begin
136       if IsNumericStr(S[Pos]) = false then begin
137         //Íàøëè.
138         Finded := true;
139         Pos := Pos-1;
140       end;
141     end;
142   until (Pos = Length(S)) or (Finded = true);
143  
144   //Íó è, ñîáñíî ïàðñåíã.
145   Result := Copy(S,1,Pos);
146   Delete(S,1,Pos);
147 end;
148
149 Function IsNumericStr (Str : string) : boolean;
150 var
151   I, StrLength : integer;
152   FindedChar : boolean;
153 begin
154   //À ýòà ôóíêà äîëæíà îïðåäåëÿòü, ñîñòîèò ëè ñòðîêà òîëüêî èç öèôð.
155
156   Result := true;  //Óìîë÷àëüíûé ðåçóëüòàò.
157
158   StrLength := Length(Str);
159   If StrLength > 0 then begin
160     //Åñëè â ñòðîêå ÷åòà åñòü òî ìîæíî ïðèñòóïàòü.
161     For I := 1 to StrLength do begin
162       FindedChar := true;
163       If Str[I] = '1' then FindedChar := false;  //Äîñòàòî÷íî âûïîëíèòñÿ 1 ïðîâåðêå - è ÷àð áóäåò íå íàéäåí :)
164       If Str[I] = '2' then FindedChar := false;
165       If Str[I] = '3' then FindedChar := false;
166       If Str[I] = '4' then FindedChar := false;
167       If Str[I] = '5' then FindedChar := false;
168       If Str[I] = '6' then FindedChar := false;
169       If Str[I] = '7' then FindedChar := false;
170       If Str[I] = '8' then FindedChar := false;
171       If Str[I] = '9' then FindedChar := false;
172       If Str[I] = '0' then FindedChar := false;
173
174       //È åñëè áûë îáíàðóæåí ñèìâîë-íå öèôðà - îáëîìèòü âñå íàôèã.
175       If FindedChar = true then Result := false;
176     end;
177   end
178   else begin
179     Result := false;  //Òèïà ñòðîêà ïóñòàÿ.
180   end;
181 end;
182
183 Function IsVersionStr (Str : string) : boolean;
184 var
185   I, StrLength : integer;
186   FindedChar, WasPoint : boolean;
187 begin
188   //ßâëÿåòñÿ ëè ñòðîêà íîìåðîì âåðñèè.
189
190   Result := true;  //Óìîë÷àëüíûé ðåçóëüòàò.
191
192   StrLength := Length(Str);
193   If StrLength > 0 then begin
194     //Åñëè â ñòðîêå ÷åòà åñòü òî ìîæíî ïðèñòóïàòü.
195     WasPoint := false;
196     For I := 1 to StrLength do begin
197       FindedChar := true;
198       If Str[I] = '1' then begin
199         FindedChar := false;
200         WasPoint := false;
201       end;
202       If Str[I] = '2' then begin
203         FindedChar := false;
204         WasPoint := false;
205       end;
206       If Str[I] = '3' then begin
207         FindedChar := false;
208         WasPoint := false;
209       end;
210       If Str[I] = '4' then begin
211         FindedChar := false;
212         WasPoint := false;
213       end;
214       If Str[I] = '5' then begin
215         FindedChar := false;
216         WasPoint := false;
217       end;
218       If Str[I] = '6' then begin
219         FindedChar := false;
220         WasPoint := false;
221       end;
222       If Str[I] = '7' then begin
223         FindedChar := false;
224         WasPoint := false;
225       end;
226       If Str[I] = '8' then begin
227         FindedChar := false;
228         WasPoint := false;
229       end;
230       If Str[I] = '9' then begin
231         FindedChar := false;
232         WasPoint := false;
233       end;
234       If Str[I] = '0' then begin
235         FindedChar := false;
236         WasPoint := false;
237       end;
238       If Str[I] = '.' then begin
239         FindedChar := false;
240         If WasPoint = true then begin
241           //Åñëè äî ýòîãî óæå áûëà òî÷êà - òî àáëîîîì.
242           FindedChar := true;
243         end;
244         WasPoint := true;
245       end;
246
247       //È åñëè áûë îáíàðóæåí ñèìâîë-íå öèôðà è íå òî÷êà - îáëîìèòü âñå íàôèã.
248       If FindedChar = true then Result := false;
249     end;
250   end
251   else begin
252     Result := false;  //Òèïà ñòðîêà ïóñòàÿ.
253   end;
254 end;
255
256 Function IsNewVersion(OldVer, NewVer : string) : boolean;
257 var
258   CurrVerLevels, I,
259   OldVerLevels, MaxLevel : integer;
260   TempStr, TempStr2,
261   OldVerTemp, NewVerTemp : string;
262 begin
263   //Ôóíêà äîëæíà ïðîâåðÿòü, íîâåå ëè âåðñèÿ.
264
265   Result := false;  //Òèïà óìîë÷àëüíîå çíà÷åíèå.
266   OldVerTemp := OldVer;
267   NewVerTemp := NewVer;
268
269
270   If (IsVersionStr(OldVer) = true) and (IsVersionStr(NewVer) = true) then begin
271     //Òîëüêî åñëè â îáîèõ ñòðîêàõ - âåðñèè.
272
273     //Äëÿ íà÷àëà - ïîñìîòðåòü ñêîëüêî óðîâíåé âåðñèè â ñòàðîé âåðñèè.
274     TempStr := NewVerTemp;
275     TempStr2 := '';      //Ïåðåìåííàÿ èíèöèàëèçèðóåòñÿ ÷èñòî ÷òîá íå âûëàçèë õèíò ïðè Parse îò êîìïèëåðà.
276     CurrVerLevels := 1;  //Åñòü êàê ìèíèìóì 1 óðîâåíü.
277     repeat
278       If Pos('.',TempStr) <> 0 then begin
279         CurrVerLevels := CurrVerLevels + 1;   //Åñòü ìèíèìóì åùå 1 óðîâåíü.
280         TempStr2 := Parse(TempStr,'.');
281       end;
282     until Pos('.',TempStr) = 0;
283
284     //È â íîâîé.
285     TempStr := OldVerTemp;
286     OldVerLevels := 1;  //Åñòü êàê ìèíèìóì 1 óðîâåíü.
287     repeat
288       If Pos('.',TempStr) <> 0 then begin
289         OldVerLevels := OldVerLevels + 1;   //Åñòü ìèíèìóì åùå 1 óðîâåíü.
290         TempStr2 := Parse(TempStr,'.');
291       end;
292     until Pos('.',TempStr) = 0;
293
294     //Òåïåðü âû÷èñëèòü ìàêñèìàëüíûé óðîâåíü.
295     If CurrVerLevels > OldVerLevels then begin
296       MaxLevel := CurrVerLevels;
297     end
298     else begin
299       MaxLevel := OldVerLevels;
300     end;
301
302     //Òåïåðü - ê òîé âåðñèè ÷òî ñàìàÿ ìàëîóðîâíåâàÿ - äîáàâèòü íóëåé.
303     If CurrVerLevels < MaxLevel then begin
304       For I := 1 to MaxLevel - CurrVerLevels do begin
305         NewVerTemp := NewVerTemp+'.0';
306       end;
307     end;
308     If OldVerLevels < MaxLevel then begin
309       For I := 1 to MaxLevel - OldVerLevels do begin
310         OldVerTemp := OldVerTemp+'.0';
311       end;
312     end;
313
314     //Íó à òåïåðü - ñîáñíî ñðàâíåíèå íàêîíåöòî.
315     I := 0;
316     repeat
317       I := I+1;
318       TempStr := Parse(OldVerTemp,'.');
319       TempStr2 := Parse(NewVerTemp,'.');
320       If StrToInt(TempStr2) > StrToInt(TempStr) then Result := true;
321     until (I = MaxLevel) or (Result = true);
322   end;
323 end;
324
325
326
327 Procedure ParsePathString(const PathString : string; var PathStringList : TStringList);
328 //Ïàðñèò ñòðîêó ñ ïóòÿìè è çàãîíÿåò èíôó â TStringList.
329 begin
330
331   //×èñòèì ñïèñîê.
332   PathStringList.Clear;
333  
334   //Ïàðñèì...
335   ExtractStrings([';'], [' '], PChar(PathString), PathStringList);
336 end;
337
338 Function CombinePathString(const PathStringList : TStringList) : string;
339 //Ãåíåðèò èç TStringList ñòðîêó òèïà Path.
340 var
341   I : integer;
342 begin
343
344   Result := '';
345  
346   if PathStringList.Count > 0 then begin
347     for I := 0 to PathStringList.Count-1 do begin
348       //Äîáàâèòü ñòðîêó...
349       Result := Result+PathStringList.Strings[I];
350       //È åñëè íàäî - ðàçäåëèòåëü.
351       if I < PathStringList.Count-1 then begin
352         Result := Result+';';
353       end;
354     end;
355   end;
356  
357 end;
358
359 Function EnvPathExists(const PathStr : string; const CheckUser, CheckGlobal : boolean) : boolean;
360 //Ïðîâåðÿåò, ñóùåñòâóåò ëè òàêîé path â óêàçàííûõ ïåðåìåííûõ.
361 var
362   Registr : TRegistry;
363   PathVar : string;
364   PathVarList : TStringList;
365   I : Integer;
366
367   Function SearcherCode : boolean;
368   begin
369     Result := false;
370
371     //Ïîëó÷àåì ïóòü...
372     PathVar := Registr.ReadString('PATH');
373     //Ïàðñèì ñòðî÷êó...
374     ParsePathString(PathVar,PathVarList);
375     if PathVarList.Count > 0 then begin
376       //Èùåì òàì âñå íàøè ïóòè. Òîëüêî åñëè åñòü ãäå èñêàòü åññíî.
377       I := -1;
378       repeat
379         I := I+1;
380         if UpperCase(DelLastSlash(PathVarList.Strings[I])) = UpperCase(DelLastSlash(PathStr)) then begin
381           Result := true;   //×åòà íàøëè % ).
382         end;
383       until (I >= PathVarList.Count-1) or (Result = true);
384     end;
385   end;
386
387 begin
388
389   //Èíèöèàëèçàöèÿ..
390   Registr := TRegistry.Create;
391   PathVarList := TStringList.Create;
392   Result := false;
393
394   //×èñòèì
395   //Þçâåðÿ...
396   If CheckUser = true then begin
397     Registr.RootKey := HKEY_CURRENT_USER;
398     Registr.OpenKey('\Environment',false);
399     Result := SearcherCode();
400   end;
401
402   //Ãëîáàëüíî...
403   If CheckGlobal = true then begin
404     Registr.RootKey := HKEY_LOCAL_MACHINE;
405     Registr.OpenKey('\SYSTEM\CurrentControlSet\Control\Session Manager\Environment',false);
406     Result := Result or SearcherCode();
407   end;
408
409   //×èñòèì ìóñîð...
410   Registr.Free;
411   PathVarList.Free;
412
413 end;
414
415 Function EnvPathRemove(const PathStr : string; const CheckUser, CheckGlobal : boolean) : boolean;
416 //Óäàëÿåò ñòðîêó ïóòè èç óêàçàííûõ PATH. Ðåçóëüòàò - true åñëè ÷åãî-òî áûëî óäàëåíî.
417 var
418   Registr : TRegistry;
419   PathVar : string;
420   PathVarList : TStringList;
421   I : Integer;
422   Finded : boolean;
423  
424   Function RemoverCode : boolean;
425   begin
426     Result := false;
427
428     //Ïîëó÷àåì ïóòü...
429     PathVar := Registr.ReadString('PATH');
430     //Ïàðñèì ñòðî÷êó...
431     ParsePathString(PathVar,PathVarList);
432     if PathVarList.Count > 0 then begin
433       //Èùåì òàì âñå íàøè ïóòè è óäàëÿåì. Òîëüêî åñëè åñòü ãäå èñêàòü åññíî.
434       I := -1;
435       Finded := false;    //Íàøëè ëè ìû òàì íóæíûé ïóòü...
436       repeat
437         I := I+1;
438         if UpperCase(DelLastSlash(PathVarList.Strings[I])) = UpperCase(DelLastSlash(PathStr)) then begin
439           PathVarList.Delete(I);
440           I := I-1;
441           Finded := true;   //×åòà íàøëè % ).
442         end;
443       until I >= PathVarList.Count-1;
444
445       //Âåðíåì ñòðî÷êó îáðàòíî â ïåðåìåííóþ...
446       //Åññíî ýòî ñðàáîòàåò òîëüêî åñëè â ïåðåìåííîé õîòü ÷òî-òî áûëî è òåì áîëåå åñëè
447       //òàì óäàëîñü íàéòè èñêîìîå...
448       if Finded = true then begin
449         //Ãåíåðèì ñòðî÷êó...
450         PathVar := CombinePathString(PathVarList);
451         if DoDebugOutput = true then begin
452           //Writeln('New path will be: '+PathVar);
453         end;
454         //È ñîáñíî çàïèñûâàåì íîâîå çíà÷åíèå...
455         Registr.WriteString('PATH',PathVar);           //Âðåìåííî çàêîììåí÷åíî - íà âðåìÿ îòëàäêè.
456         //Ðåçóëüòàò.
457         Result := true;
458       end;
459
460     end;
461   end;
462  
463 begin
464
465   //Èíèöèàëèçàöèÿ..
466   Registr := TRegistry.Create;
467   PathVarList := TStringList.Create;
468   Result := false;
469  
470   //×èñòèì
471   //Þçâåðÿ...
472   If CheckUser = true then begin
473     Registr.RootKey := HKEY_CURRENT_USER;
474     Registr.OpenKey('\Environment',false);
475     Result := RemoverCode();
476     Registr.CloseKey;
477   end;
478  
479   //Ãëîáàëüíî...
480   If CheckGlobal = true then begin
481     Registr.RootKey := HKEY_LOCAL_MACHINE;
482     Registr.OpenKey('\SYSTEM\CurrentControlSet\Control\Session Manager\Environment',false);
483     Result := Result or RemoverCode();
484     Registr.CloseKey;
485   end;
486  
487   //Ñîîáùàåì äðóãèì ïðîãàì ÷òî ùåé-òî ïîìåíÿëîñü...
488   if Result = true then begin
489     SendMessage( HWND_BROADCAST, WM_SETTINGCHANGE, 0, LPARAM(LPCSTR('Environment')) );
490   end;
491  
492   //×èñòèì ìóñîð...
493   Registr.Free;
494   PathVarList.Free;
495
496 end;
497
498 Function EnvPathAdd(const PathStr : string; const Target : integer; const ForceRemoveDoubles : boolean = true; const ForceCreateLocal : boolean = false) : boolean;
499 //Äîáàâëÿåò ïóòü â óêàçàííûå PATH.
500 var
501   Registr : TRegistry;
502   UserPathVar, GlobalPathVar : string;
503   UserPathVarList, GlobalPathVarList : TStringList;
504   Finded : boolean;
505  
506 begin
507   //Èíèöèàëèçàöèÿ..
508   Registr := TRegistry.Create;
509   Result := false;
510  
511   //Èòàê, â çàâèñèìîñòè îò òîãî êóäà ñîáèðàåìñÿ äîáàâëÿòü...
512   if Target = EnvPathAdd_Global then begin
513     //Â ãëîáàëêó äîáàâëÿåì
514    
515     //Èùåì åñòü ëè ýòîò ïóòü â ëîêàëêå. Åñëè åñòü - óäàëÿåì.
516     EnvPathRemove(PathStr, true, false);
517    
518     //Òåïåðü ïðîâåðèì - åñòü ëè â ãëîáàëêå òàêîé ïóòü óæå...
519     Finded := EnvPathExists(PathStr, false, true);
520    
521     //Åñëè íèôèãà íå íàøëè - äîáàâëÿåì ïåðåìåííóþ. Åñëè íàøëè - íè÷å òðîãàòü íå íàäî %).
522     if Finded = false then begin
523       Registr.RootKey := HKEY_LOCAL_MACHINE;
524       Registr.OpenKey('\SYSTEM\CurrentControlSet\Control\Session Manager\Environment',true);
525       //Ïîëó÷àåì ïóòü...
526       GlobalPathVar := Registr.ReadString('PATH');
527       //Ïàðñèì ñòðî÷êó...
528       GlobalPathVarList := TStringList.Create;
529       ParsePathString(GlobalPathVar,GlobalPathVarList);
530       //Äîáàâëÿåì çíà÷åíèå...
531       GlobalPathVarList.Add(PathStr);
532       GlobalPathVar := CombinePathString(GlobalPathVarList);
533       //Ïèøåì âñå îáðàòíî.
534       if DoDebugOutput = true then begin
535         //Writeln('New global path will be: '+GlobalPathVar);
536       end;
537       //È ñîáñíî çàïèñûâàåì íîâîå çíà÷åíèå...
538       Registr.WriteString('PATH',GlobalPathVar);           //Âðåìåííî çàêîììåí÷åíî - íà âðåìÿ îòëàäêè.
539       Registr.CloseKey;
540       //Ñîîáùàåì äðóãèì ïðîãàì ÷òî ùåé-òî ïîìåíÿëîñü...
541       SendMessage( HWND_BROADCAST, WM_SETTINGCHANGE, 0, LPARAM(LPCSTR('Environment')) );
542       //×èñòèì ìóñîð...
543       GlobalPathVarList.Free;
544     end;
545   end
546   else if Target = EnvPathAdd_User then begin
547     //Â ëîêàëêó äîáàâëÿåì
548
549     //Ïðîâåðÿåì, åñòü ëè â ãëîáàëêå òàêîé ïóòü (åñëè íå ôîðñèì äîáàâëåíèå â ëîêàëêó),
550     //ëèáî åñëè ñêàçàíî óäàëÿòü â ãëîáàëêå - óäàëÿåì.
551     Finded := false;
552     if ForceRemoveDoubles = true then begin
553       //Óäàëÿåì ãëîáàëêó
554       EnvPathRemove(PathStr, false, true);
555     end
556     else if ForceCreateLocal = false then begin
557       //Ïðîâåðÿåì åñòü ëè ÷òî-òî â ãëîáàëêå - åñëè åñòü òî â ëîêàëêó äîáàâëÿòüñÿ íå áóäåò.
558       Finded := EnvPathExists(PathStr, false, true);
559     end;
560    
561     //Åñëè ïîêà åñòü ïðè÷èíû ïðîäîëæàòü - ïðîâåðÿåì, åñòü ëè â ëîêàëêå òàêîé ïóòü...
562     if Finded = false then begin
563       Finded := EnvPathExists(PathStr, true, false);
564     end;
565    
566     //È òåïåðü, åñëè òàêè íóæíî äîáàâèòü íîâîå çíà÷åíèå â ïåðåìåííóþ - äîáàâëÿåì.
567     Registr.RootKey := HKEY_CURRENT_USER;
568     Registr.OpenKey('\Environment',true);
569     //Ïîëó÷àåì ïóòü...
570     UserPathVar := Registr.ReadString('PATH');
571     //Ïàðñèì ñòðî÷êó...
572     UserPathVarList := TStringList.Create;
573     ParsePathString(UserPathVar,UserPathVarList);
574     //Äîáàâëÿåì çíà÷åíèå...
575     UserPathVarList.Add(PathStr);
576     UserPathVar := CombinePathString(UserPathVarList);
577     //Ïèøåì âñå îáðàòíî.
578     if DoDebugOutput = true then begin
579       //Writeln('New user path will be: '+UserPathVar);
580     end;
581     //È ñîáñíî çàïèñûâàåì íîâîå çíà÷åíèå...
582     Registr.WriteString('PATH',UserPathVar);           //Âðåìåííî çàêîììåí÷åíî - íà âðåìÿ îòëàäêè.
583     Registr.CloseKey;
584     //Ñîîáùàåì äðóãèì ïðîãàì ÷òî ùåé-òî ïîìåíÿëîñü...
585     SendMessage( HWND_BROADCAST, WM_SETTINGCHANGE, 0, LPARAM(LPCSTR('Environment')) );
586     //×èñòèì ìóñîð...
587     UserPathVarList.Free;
588   end;
589
590   //×èñòèì ìóñîð...
591   Registr.Free;
592 end;
593
594 Function TrimExLeft(const InputStr, TrimChars : string) : string;
595 //Òðèìàåò ñèìâîëû ñëåâà.
596 var
597   FindedTrimChar, FindedNoTrimChar : boolean;
598   I, J : Integer;
599  
600 begin
601
602   //Óìîë÷àëüíîå âîçâðàùàåìîå çíà÷åíèå.
603   Result := '';
604  
605   //Åñòü ëè âî âõîäíîé ñòðîêå õîòü ÷òî-òî....
606   if Length(InputStr) > 0 then begin
607     //Åñòü. Çíà÷èò ñ÷èòàåì êîëè÷åñòâî ñèìâîëîâ ñ íà÷àëà ñòðîêè ñîâïàäàþùèå ñ TrimChars...
608     I := 0;
609     FindedNoTrimChar := false;
610     repeat
611       //Öèêë ñîáñòâåííî ïîäñ÷åòà êîëè÷åñòâà òðèìàåìûõ ñèìâîëîâ.
612       //Ùåëêàåì ñ÷åò÷èêîì è îáíóëÿåì èíäèêàòîð ïðîâåðêè ñèìâîëà.
613       I := I+1;
614       FindedTrimChar := false;
615      
616       //Ïðîâåðÿåì ñèìâîë
617       for J := 1 to Length(TrimChars) do begin
618         //Öèêë ïðîâåðêè ÿâëÿåòñÿ ëè ñèìâîë òðèìàåìûì %).
619         if InputStr[I] = TrimChars[J] then begin
620           FindedTrimChar := true;     //Íàøëè òàêîé ñèìâîë.
621         end;
622       end;
623      
624       //Ñìîòðèì ðåçóëüòàò ïðîâåðêè.
625       if FindedTrimChar = false then begin
626         //Òàêè ñèìâîë îêàçàëñÿ íå òðèìàåìûì - ïîäñ÷åò çàâåðøåí, îòìå÷àåì ÷òî ïåðâûé íå-òðèì ñèìâîë íàéäåí.
627         FindedNoTrimChar := true;
628       end;
629      
630     until (I = Length(InputStr)) or (FindedNoTrimChar = true);
631    
632     //Òåïåðü â çàâèñèìîñòè îò òîãî ÷òî íàøëè...
633     If FindedNoTrimChar = true then begin
634       //Åñëè â ñòðîêå åñòü ÷òî-òî ïîìèìî òðèìàåìûõ ñèìâîëîâ - áóäåì òðèìû óäàëÿòü.
635       //Åñëè áû òàì áûëè òîëüêî îíè - ìîæíî áûëî áû âîîáùå íè÷åãî íå äåëàòü - âåðíåòñÿ ïóñòàÿ ñòðîêà.
636       Result := RightStr(InputStr,Length(InputStr)-I+1);
637     end;
638   end;
639  
640 end;
641
642 Function TrimExRight(const InputStr, TrimChars : string) : string;
643 //Òðèìàåò ñèìâîëû ñïðàâà.
644 var
645   FindedTrimChar, FindedNoTrimChar : boolean;
646   I, J : Integer;
647
648 begin
649
650   //Óìîë÷àëüíîå âîçâðàùàåìîå çíà÷åíèå.
651   Result := '';
652
653   //Åñòü ëè âî âõîäíîé ñòðîêå õîòü ÷òî-òî....
654   if Length(InputStr) > 0 then begin
655     //Åñòü. Çíà÷èò ñ÷èòàåì êîëè÷åñòâî ñèìâîëîâ ñ êîíöà ñòðîêè ñîâïàäàþùèå ñ TrimChars...
656     I := Length(InputStr)+1;
657     FindedNoTrimChar := false;
658     repeat
659       //Öèêë ñîáñòâåííî ïîäñ÷åòà êîëè÷åñòâà òðèìàåìûõ ñèìâîëîâ.
660       //Ùåëêàåì ñ÷åò÷èêîì è îáíóëÿåì èíäèêàòîð ïðîâåðêè ñèìâîëà.
661       I := I-1;
662       FindedTrimChar := false;
663
664       //Ïðîâåðÿåì ñèìâîë
665       for J := 1 to Length(TrimChars) do begin
666         //Öèêë ïðîâåðêè ÿâëÿåòñÿ ëè ñèìâîë òðèìàåìûì %).
667         if InputStr[I] = TrimChars[J] then begin
668           FindedTrimChar := true;     //Íàøëè òàêîé ñèìâîë.
669         end;
670       end;
671
672       //Ñìîòðèì ðåçóëüòàò ïðîâåðêè.
673       if FindedTrimChar = false then begin
674         //Òàêè ñèìâîë îêàçàëñÿ íå òðèìàåìûì - ïîäñ÷åò çàâåðøåí, îòìå÷àåì ÷òî ïåðâûé íå-òðèì ñèìâîë íàéäåí.
675         FindedNoTrimChar := true;
676       end;
677
678     until (I = 1) or (FindedNoTrimChar = true);
679
680     //Òåïåðü â çàâèñèìîñòè îò òîãî ÷òî íàøëè...
681     If FindedNoTrimChar = true then begin
682       //Åñëè â ñòðîêå åñòü ÷òî-òî ïîìèìî òðèìàåìûõ ñèìâîëîâ - áóäåì òðèìû óäàëÿòü.
683       //Åñëè áû òàì áûëè òîëüêî îíè - ìîæíî áûëî áû âîîáùå íè÷åãî íå äåëàòü - âåðíåòñÿ ïóñòàÿ ñòðîêà.
684       Result := LeftStr(InputStr,I);
685     end;
686   end;
687
688 end;
689
690 Function TrimEx(const InputStr, TrimChars : string) : string;
691 //Òðèìàåò ñèìâîëû ñî âñåõ ñòîðîí.
692 begin
693   //Ïðîñòî âûçûâàåì îáå îòäåëüíûå ôóíêöèè.
694   Result := TrimExLeft(TrimExRight(InputStr, TrimChars), TrimChars);
695 end;
696
697 Function FileToCRC32(const FileName : string; const ConsoleOutput : boolean = false) : cardinal;
698 //Âû÷èñëèòü CRC32 äëÿ ôàéëà, åñëè íàäî ñ èíäèêàöèåé ïðîöåññà â êîíñîëü.
699 const
700   ReadBuffSize = 500000;              //Ïî 500 êá - äóìàþ òàêîé áóôôåð ïîéäåò äàæå íà ñàìîé äðåâíåé âåíäîâîé ñèñòåìå...
701                                       //... èëè íà âèðòóàëüíîì linux-õîñòå ñ wine.
702 var
703   CurrStream : TFileStream;
704   //Buffer : array [0..ReadBuffSize-1] of byte;    //Èççà áàãà, âîçìîæíî â fpc (â äåëüôå âñå ïàøåò) - ïðèõîäèòñÿ þçàòü äèíàìè÷åñêèé ìàññèâ.
705   Buffer : array of byte;
706   Readed, FullReaded : LongInt;
707  
708 begin
709
710   //Èíèöèàëèçèðóåì çíà÷åíèå CRC
711   Result := crc32(0, nil, 0);
712   //è âûäåëÿåì ïàìÿòü ïîä áóôôåð...
713   SetLength(Buffer,ReadBuffSize-1);
714
715   //Ñóùåñòâóåò ëè ôàéëåã...
716   if FileExists(FileName) = true then begin
717     //Åñëè åñòü ÷òî âûñ÷èòûâàòü - ñ÷èòàåì...
718    
719     //Ñ÷åò÷èêè ÷òåíèÿ...
720     Readed := 0;
721     FullReaded := 0;
722    
723     //Îòêðûâàåì ôàéë...
724     CurrStream := TFileStream.Create(FileName,fmOpenRead);
725    
726     //Åñëè íàäî - âûâîäèì èíôó î ïðîãðåññå â êîíñîëü.
727     if ConsoleOutput = true then begin
728       Write('CRC32: '+FileName+' -> ');
729     end;
730    
731     //Ñîáñíî ñ÷èòàåì. ×èòàåì ôàéë ïî êóñî÷êàì ïîêà ôàéë íå êîí÷èòñÿ.
732     repeat
733       Readed := CurrStream.Read(buffer[0],ReadBuffSize);
734       FullReaded := FullReaded+Readed;
735       Result := crc32(Result, @buffer[0], Readed);
736     until Readed = 0;
737    
738     //Ãîòîâî. Çàêðûòü ïðî÷èòàííûé ôàéë.
739     CurrStream.Free;
740     //È åñëè íàäî ñîîáùèòü íîâóþ CRC â êîíñîëü...
741     if ConsoleOutput = true then begin
742       Writeln(IntToHex(Result,8));
743     end;
744    
745   end;
746  
747   //×èñòèì ìóñîð
748   SetLength(Buffer,0);
749 end;
750
751 Function CheckCharNum(const Ch : char) : boolean;
752 //Ïðîâåðèòü - ÿâëÿåòñÿ ëè ñèìâîë öèôðîé
753 begin
754   result := false;
755   if Ch = '0' then result := true;
756   if Ch = '1' then result := true;
757   if Ch = '2' then result := true;
758   if Ch = '3' then result := true;
759   if Ch = '4' then result := true;
760   if Ch = '5' then result := true;
761   if Ch = '6' then result := true;
762   if Ch = '7' then result := true;
763   if Ch = '8' then result := true;
764   if Ch = '9' then result := true;
765 end;
766
767 Function CheckStrInt(const St : string) : boolean;
768 //Ïðîâåðèòü - ÿâëÿåòñÿ ëè ñòðîêà ïðåäñòàâëåíèåì öåëî÷èñëåííîãî çíà÷åíèÿ
769 var
770   ch : char;
771   I : integer;
772  
773 begin
774   If (st <> '') and (st<>'-') then begin
775     result := true;
776     I := 0;
777     If St[I+1] = '-' then I := I+1;
778     repeat
779       I := I+1;
780       Ch := St[I];
781       if ch <> #0 then if CheckCharNum(Ch) = false then result := false;
782     until Ch = #0;
783   end
784   else result := false;
785 end;
786
787 Function CheckStrFloat(const St : string) : boolean;
788 //Ïðîâåðèòü - ÿâëÿåòñÿ ëè ñòðîêà ïðåäñòàâëåíèåì äðîáíîãî çíà÷åíèÿ
789 var
790   zapatih, I : integer;
791   ch : char;
792  
793 begin
794   If (st <> '') and (st <> 'NAN') and (st<>'-') then begin
795     result := true;
796     zapatih := 1;
797     I := 0;
798     If St[I+1] = '-' then I := I+1;
799     repeat
800       I := I+1;
801       Ch := St[I];
802       If ch = '.' then zapatih := zapatih-1
803       else if ch <> #0 then if CheckCharNum(Ch) = false then result := false;
804     until Ch = #0;
805     if zapatih < 0 then result := false;
806   end
807   else begin
808     If St = 'NAN' then result := true
809     else Result := false;
810   end;
811 end;
812
813 Function IntToBool(const InputInt : Integer) : boolean;
814 //Ïðåâðàòèòü Integer â Boolean
815 begin
816   If InputInt = 1 then begin
817     Result := true;
818   end
819   else begin
820     Result := false;
821   end;
822 end;
823
824 Function StrToBool(const InputStr : AnsiString) : boolean;
825 //Ïðåâðàòèòü String â Boolean
826 begin
827   //Ïðîâåðèòü, èíòåãåðîâîå ÷èñëî ëè åòî.
828   If CheckStrInt(InputStr) = true then begin
829     //Åñëè êàêîå-òî ÷èñëî, òî âåðíóòü åãî çíà÷åíèå...
830     Result := IntToBool(StrToInt(InputStr));
831   end
832   else begin
833     //Åñëè òàì êàêàÿ-òî ôèãíÿ, òî âåðíóòü false
834     Result := false;
835   end;
836 end;
837
838 Function BoolToInt(const InputBool : boolean) : Integer;
839 //Ïðåâðàòèòü Boolean â Integer
840 begin
841   If InputBool = true then begin
842     //true
843     Result := 1;
844   end
845   else begin
846     //false
847     Result := 0;
848   end;
849 end;
850
851 Function BoolToStr(const InputBool : boolean) : AnsiString;
852 //Ïðåâðàòèòü Boolean â String
853 begin
854   Result := IntToStr(BoolToInt(InputBool));
855 end;
856
857 Function IsLocalPath(const PathStr : string) : boolean;
858 //Âîçâðàùàåò true åñëè ïóòü ëîêàëüíûé, è false åñëè íåò.
859 //Ïîä ëîêàëüíûì ïîíèìàåòñÿ ïóòü íà÷èíàþùèéñÿ ñ òî÷êè.
860 begin
861   Result := false;   //Ïî óìîë÷àíèþ ñ÷èòàåì ÷òî ïóòü ãëîáàëåí.
862  
863   if Length(PathStr) >= 1 then begin
864     if PathStr[1] = '.' then begin
865       Result := true;
866     end;
867   end;
868 end;
869
870 Function ReadFirstLineFromStr(const InputStr : AnsiString) : AnsiString;
871 //Ýëåìåíòàðíî ñêîïèðîâàòü ñòðîêó îò íà÷àëà äî áàéòà #13 èëè #10 åñëè #13 íå îáíàðóæèòñÿ.
872 var
873   EndStrPos13, EndStrPos10, EndStrPos : Integer;
874 begin
875   //Èíèöèàëèçàöèÿ.
876   Result := '';
877
878   //Îïðåäåëÿåì ïîçèöèþ êîíöà ñòðîêè ïî #13.
879   EndStrPos13 := Longint( StrPos( PChar(InputStr), PChar(#13) ) - LongInt(InputStr) + 1 ) ;
880   if EndStrPos13 <= 0 then begin
881     EndStrPos13 := Length( InputStr )+1;
882   end;
883   //È ïî #10
884   EndStrPos10 := Longint( StrPos( PChar(InputStr), PChar(#10) ) - LongInt(InputStr) + 1 ) ;
885   if EndStrPos10 <= 0 then begin
886     EndStrPos10 := Length( InputStr )+1;
887   end;
888   //Îïðåäåëÿåì ðåàëüíûé êîíåö ñòðîêè.
889   if EndStrPos10 < EndStrPos13 then begin
890     EndStrPos := EndStrPos10;
891   end
892   else begin
893     EndStrPos := EndStrPos13;
894   end;
895
896   //È ñîáñíî êîïèðóåì ðåçóëüòàò.
897   Result := Copy(InputStr,1,EndStrPos-1);
898 end;
899
900 // äîáàëÿåò ðàñøèðåíèå åñëè åãî åùå íåò.
901 function AddExtensionIfAbsent(const path, extension :String) :String;
902 var
903   ex :AnsiString;
904 begin
905   Result := path;
906   ex := ExtractFileExt(path);
907   if (ex = '') then begin
908     Result := path + extension;
909   end;
910 end;
911
912 // ÷èñòîå èìÿ ôàéëà, áåç ðàñøèðåíèÿ
913 function GetFileNameWithoutExtension(const path :String) :String;
914 var
915   fileName :String;
916   i        :Integer;
917 begin
918   fileName := ExtractFileName(path);
919   i := Length(FileName);
920   while (i > 0) and (FileName[i] <> '.') do Dec(i);
921
922   if (i > 0) then
923     Result := Copy(FileName, 1, i - 1)
924   else
925     Result := fileName;
926
927
928 end;
929
930 end.
931
Note: See TracBrowser for help on using the browser.