📄 hutil32.pas
字号:
const DropTags: array of string; var RsltStr: string): string;
const
BUF_SIZE = $7FFF;
var
Buf : array[0..BUF_SIZE] of Char;
BufCount, SrcCount, srclen, {AfterLen, BeforeLen,} DropCount, i: Integer;
ArrestNow : Boolean;
begin
try
//EnterCriticalSection (CSUtilLock);
RsltStr := ''; {result string}
srclen := length(Source);
if srclen > BUF_SIZE then
begin
Result := '';
exit;
end;
BufCount := 0;
SrcCount := 1;
ArrestNow := False;
DropCount := SizeOf(DropTags) div SizeOf(string);
if (SearchAfter = '') then
ArrestNow := True;
//GetMem (Buf, BUF_SIZE);
while True do
begin
if SrcCount > srclen then
break;
if not ArrestNow then
begin
if IsInB(Source, SrcCount, SearchAfter) then
ArrestNow := True;
end
else
begin
Buf[BufCount] := Source[SrcCount];
if IsInB(Source, SrcCount, ArrestBefore) or (BufCount >= BUF_SIZE - 2)
then
begin
BufCount := BufCount - length(ArrestBefore);
Buf[BufCount + 1] := #0;
RsltStr := string(Buf);
BufCount := 0;
break;
end;
for i := 0 to DropCount - 1 do
begin
if IsInB(Source, SrcCount, DropTags[i]) then
begin
BufCount := BufCount - length(DropTags[i]);
break;
end;
end;
Inc(BufCount);
end;
Inc(SrcCount);
end;
if (ArrestNow) and (BufCount <> 0) then
begin
Buf[BufCount] := #0;
RsltStr := string(Buf);
end;
Result := Copy(Source, SrcCount + 1, srclen - SrcCount);
{result is remain string}
finally
//LeaveCriticalSection (CSUtilLock);
end;
end;
function ArrestStringEx(Source, SearchAfter, ArrestBefore: string; var
ArrestStr: string): string;
var
srclen : Integer;
GoodData : Boolean;
i, n : Integer;
begin
ArrestStr := ''; {result string}
if Source = '' then
begin
Result := '';
exit;
end;
try
srclen := length(Source);
GoodData := False;
if srclen >= 2 then
if Source[1] = SearchAfter then
begin
// Source := Copy(Source, 2, srclen - 1);
Delete(Source,1,1);
srclen := length(Source);
GoodData := True;
end
else
begin
n := Pos(SearchAfter, Source);
if n > 0 then
begin
Source := Copy(Source, n + 1, srclen - (n));
srclen := length(Source);
GoodData := True;
end;
end;
// Fin := False;
if GoodData then
begin
n := Pos(ArrestBefore, Source);
if n > 0 then
begin
ArrestStr := Copy(Source, 1, n - 1);
Result := Copy(Source, n + 1, srclen - n);
end
else
begin
Result := SearchAfter + Source;
end;
end
else
begin
for i := 1 to srclen do
begin
if Source[i] = SearchAfter then
begin
Result := Copy(Source, i, srclen - i + 1);
break;
end;
end;
end;
except
ArrestStr := '';
Result := '';
end;
end;
function SkipStr(Src: string; const Skips: array of Char): string;
var
i, Len, C : Integer;
NowSkip : Boolean;
begin
Len := length(Src);
// Count := sizeof(Skips) div sizeof (Char);
for i := 1 to Len do
begin
NowSkip := False;
for C := Low(Skips) to High(Skips) do
if Src[i] = Skips[C] then
begin
NowSkip := True;
break;
end;
if not NowSkip then
break;
end;
Result := Copy(Src, i, Len - i + 1);
end;
function GetStrToCoords(str: string): TRect;
var
temp : string;
begin
str := GetValidStr3(str, temp, [',', ' ']);
Result.Left := Str_ToInt(temp, 0);
str := GetValidStr3(str, temp, [',', ' ']);
Result.Top := Str_ToInt(temp, 0);
str := GetValidStr3(str, temp, [',', ' ']);
Result.Right := Str_ToInt(temp, 0);
GetValidStr3(str, temp, [',', ' ']);
Result.Bottom := Str_ToInt(temp, 0);
end;
function CombineDirFile(SrcDir, TargName: string): string;
begin
if (SrcDir = '') or (TargName = '') then
begin
Result := SrcDir + TargName;
exit;
end;
if SrcDir[length(SrcDir)] = '\' then
Result := SrcDir + TargName
else
Result := SrcDir + '\' + TargName;
end;
function CompareLStr(Src, targ: string; compn: Integer): Boolean;
var
i : Integer;
begin
Result := False;
if compn <= 0 then
exit;
if length(Src) < compn then
exit;
if length(targ) < compn then
exit;
Result := True;
for i := 1 to compn do
if UpCase(Src[i]) <> UpCase(targ[i]) then
begin
Result := False;
break;
end;
end;
function CompareBuffer(p1, p2: Pbyte; Len: Integer): Boolean;
var
i : Integer;
begin
Result := True;
for i := 0 to Len - 1 do
if Pbyte(Integer(p1) + i)^ <> Pbyte(Integer(p2) + i)^ then
begin
Result := False;
break;
end;
end;
function CompareBackLStr(Src, targ: string; compn: Integer): Boolean;
var
i, slen, tLen : Integer;
begin
Result := False;
if compn <= 0 then
exit;
if length(Src) < compn then
exit;
if length(targ) < compn then
exit;
slen := length(Src);
tLen := length(targ);
Result := True;
for i := 0 to compn - 1 do
if UpCase(Src[slen - i]) <> UpCase(targ[tLen - i]) then
begin
Result := False;
break;
end;
end;
function IsEnglish(ch: Char): Boolean;
begin
Result := False;
if ((ch >= 'A') and (ch <= 'Z')) or ((ch >= 'a') and (ch <= 'z')) then
Result := True;
end;
function IsEngNumeric(ch: Char): Boolean;
begin
Result := False;
if IsEnglish(ch) or ((ch >= '0') and (ch <= '9')) then
Result := True;
end;
function IsFloatNumeric(str: string): Boolean;
begin
if Trim(str) = '' then
begin
Result := False;
exit;
end;
try
StrToFloat(str);
Result := True;
except
Result := False;
end;
end;
procedure PCharSet(P: PChar; n: Integer; ch: Char);
var
i : Integer;
begin
for i := 0 to n - 1 do
(P + i)^ := ch;
end;
function ReplaceChar(Src: string; srcchr, repchr: Char): string;
var
i, Len : Integer;
begin
if Src <> '' then
begin
Len := length(Src);
for i := 1 to Len do
if Src[i] = srcchr then
Src[i] := repchr;
end;
Result := Src;
end;
function IsUniformStr(Src: string; ch: Char): Boolean;
var
i, Len : Integer;
begin
Result := True;
if Src <> '' then
begin
Len := length(Src);
for i := 1 to Len do
if Src[i] = ch then
begin
Result := False;
break;
end;
end;
end;
function CreateMask(Src: PChar; TargPos: Integer): string;
function IsNumber(Chr: Char): Boolean;
begin
if (Chr >= '0') and (Chr <= '9') then
Result := True
else
Result := False;
end;
var
intFlag, Loop : Boolean;
Cnt, IntCnt, srclen : Integer;
ch, Ch2 : Char;
begin
intFlag := False;
Loop := True;
Cnt := 0;
IntCnt := 0;
srclen := StrLen(Src);
while Loop do
begin
ch := PChar(LongInt(Src) + Cnt)^;
case ch of
#0:
begin
Result := '';
break;
end;
' ':
begin
end;
else
begin
if not intFlag then
begin { Now Reading char }
if IsNumber(ch) then
begin
intFlag := True;
Inc(IntCnt);
end;
end
else
begin { If, now reading integer }
if not IsNumber(ch) then
begin { XXE+3 }
case UpCase(ch) of
'E':
begin
if (Cnt >= 1) and (Cnt + 2 < srclen) then
begin
ch := PChar(LongInt(Src) + Cnt - 1)^;
if IsNumber(ch) then
begin
ch := PChar(LongInt(Src) + Cnt + 1)^;
Ch2 := PChar(LongInt(Src) + Cnt + 2)^;
if not ((ch = '+') and (IsNumber(Ch2))) then
begin
intFlag := False;
end;
end;
end;
end;
'+':
begin
if (Cnt >= 1) and (Cnt + 1 < srclen) then
begin
ch := PChar(LongInt(Src) + Cnt - 1)^;
Ch2 := PChar(LongInt(Src) + Cnt + 1)^;
if not ((UpCase(ch) = 'E') and (IsNumber(Ch2))) then
begin
intFlag := False;
end;
end;
end;
'.':
begin
if (Cnt >= 1) and (Cnt + 1 < srclen) then
begin
ch := PChar(LongInt(Src) + Cnt - 1)^;
Ch2 := PChar(LongInt(Src) + Cnt + 1)^;
if not ((IsNumber(ch)) and (IsNumber(Ch2))) then
begin
intFlag := False;
end;
end;
end;
else
intFlag := False;
end;
end;
end; {end of case else}
end; {end of Case}
end;
if (intFlag) and (Cnt >= TargPos) then
begin
Result := '%' + format('%d', [IntCnt]);
exit;
end;
Inc(Cnt);
end;
end;
function GetValueFromMask(Src: PChar; Mask: string): string;
function Positon(str: string): Integer;
var
str2 : string;
begin
str2 := Copy(str, 2, length(str) - 1);
Result := StrToIntDef(str2, 0);
if Result <= 0 then
Result := 1;
end;
function IsNumber(ch: Char): Boolean;
begin
case ch of
'0'..'9': Result := True;
else
Result := False;
end;
end;
var
intFlag, Loop, Sign : Boolean;
Buf : Str256;
BufCount, Pos, LocCount, TargLoc, srclen: Integer;
ch, Ch2 : Char;
begin
srclen := StrLen(Src);
LocCount := 0;
BufCount := 0;
Pos := 0;
intFlag := False;
Loop := True;
Sign := False;
if Mask = '' then
Mask := '%1';
TargLoc := Positon(Mask);
while Loop do
begin
if Pos >= srclen then
break;
ch := PChar(Src + Pos)^;
if not intFlag then
begin {now reading chars}
if LocCount < TargLoc then
begin
if IsNumber(ch) then
begin
intFlag := True;
BufCount := 0;
Inc(LocCount);
end
else
begin
if not Sign then
begin {default '+'}
if ch = '-' then
Sign := True;
end
else
begin
if ch <> ' ' then
Sign := False;
end;
end;
end
else
begin
break;
end;
end;
if intFlag then
begin {now reading numbers}
Buf[BufCount] := ch;
Inc(BufCount);
if not IsNumber(ch) then
begin
case ch of
'E', 'e':
begin
if (Pos >= 1) and (Pos + 2 < srclen) then
begin
ch := PChar(Src + Pos - 1)^;
if IsNumber(ch) then
begin
ch := PChar(Src + Pos + 1)^;
Ch2 := PChar(Src + Pos + 2)^;
if not ((ch = '+') or (ch = '-') and (IsNumber(Ch2))) then
begin
Dec(BufCount);
intFlag := False;
end;
end;
end;
end;
'+', '-':
begin
if (Pos >= 1) and (Pos + 1 < srclen) then
begin
ch := PChar(Src + Pos - 1)^;
Ch2 := PChar(Src + Pos + 1)^;
if not ((UpCase(ch) = 'E') and (IsNumber(Ch2))) then
begin
Dec(BufCount);
intFlag := False;
end;
end;
end;
'.':
begin
if (Pos >= 1) and (Pos + 1 < srclen) then
begin
ch := PChar(Src + Pos - 1)^;
Ch2 := PChar(Src + Pos + 1)^;
if not ((IsNumber(ch)) and (IsNumber(Ch2))) then
begin
Dec(BufCount);
intFlag := False;
end;
end;
end;
else
begin
intFlag := False;
Dec(BufCount);
end;
end;
end;
end;
Inc(Pos);
end;
if LocCount = TargLoc then
begin
Buf[BufCount] := #0;
if Sign then
Result := '-' + StrPas(Buf)
else
Result := StrPas(Buf);
end
else
Result := '';
end;
procedure GetDirList(path: string; fllist: TStringList);
var
SearchRec : TSearchRec;
begin
if FindFirst(path, faAnyFile, SearchRec) = 0 then
begin
fllist.AddObject(SearchRec.Name, TObject(SearchRec.Time));
while True do
begin
if FindNext(SearchRec) = 0 then
begin
fllist.AddObject(SearchRec.Name, TObject(SearchRec.Time));
end
else
begin
SysUtils.FindClose(SearchRec);
break;
end;
end;
end;
end;
function GetFileDate(FileName: string): Integer; //DOS format file date..
var
SearchRec : TSearchRec;
begin
Result := 0; //jacky
if FindFirst(FileName, faAnyFile, SearchRec) = 0 then
begin
Result := SearchRec.Time;
SysUtils.FindClose(SearchRec);
end;
end;
procedure ShlStr(Source: PChar; Count: Integer);
var
i, Len : Integer;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -