📄 ufunctions.pas
字号:
unit UFunctions;
interface
uses Windows, Messages, SysUtils, Variants, Classes,forms;
type
TMutex = class(TObject)
protected
FHandle: THandle;
public
constructor Create(const Name: string);
destructor Destroy; override;
function Get(TimeOut: Integer): Boolean;
function Release: Boolean;
property Handle: THandle read FHandle;
end;
procedure Delay(aTimeOut:longint);
procedure Delay2(aTimeOut:longint);
function PosEnd(Substr,S: string): Integer;
function PosN(Substr,S: string; N : Integer): Integer;
function PosCount(SubStr,S : string) : Integer;
function StrToTstr(OriginStr:String;DestTstr:Tstrings;Splitter:String =','):Integer;
function SplitStrToTstr(OriginStr:String;DestTstr:Tstrings;Splitter:String =','):Integer;
implementation
{ TMutex }
constructor TMutex.Create(const Name: string);
begin
FHandle := CreateMutex(nil, False, PChar(Name));
if FHandle = 0 then abort;
end;
destructor TMutex.Destroy;
begin
if FHandle <> 0 then
CloseHandle(FHandle);
end;
function TMutex.Get(TimeOut: Integer): Boolean;
begin
Result := WaitForSingleObject(FHandle, TimeOut) = WAIT_OBJECT_0;
end;
function TMutex.Release: Boolean;
begin
Result := ReleaseMutex(FHandle);
end;
procedure Delay(aTimeOut:longint);
var
dwHandleSignaled:DWORD;
WatiForEvenTimeOut:integer;
aClosehandel:THandle;
begin
aClosehandel:=CreateEvent( nil, True, False, nil );
WatiForEvenTimeOut:=aTimeOut;
dwHandleSignaled := WaitForSingleObject(aClosehandel,WatiForEvenTimeOut);
closeHandle(aClosehandel);
end;
procedure Delay2(aTimeOut:longint);
var aTickCount:longint;
dwHandleSignaled:DWORD;
WatiForEvenTimeOut:integer;
aClosehandel:THandle;
begin
aTickCount:=GetTickcount+aTimeout+100;
aClosehandel:=CreateEvent( nil, True, False, nil );
while GetTickcount<=aTickCount do
begin
WatiForEvenTimeOut:=500;
dwHandleSignaled := WaitForSingleObject(aClosehandel,WatiForEvenTimeOut);
application.ProcessMessages;
end;
closeHandle(aClosehandel);
end;
/////////////////////////////////////////////////////////////////////////////////
function PosOffset(const SubStr, S: string; Offset: Cardinal = 1): Integer;
var
I,X: Integer;
Len, LenSubStr: Integer;
begin
if Offset = 1 then
Result := Pos(SubStr, S)
else
begin
I := Offset;
LenSubStr := Length(SubStr);
Len := Length(S) - LenSubStr + 1;
while I <= Len do
begin
if S[I] = SubStr[1] then
begin
X := 1;
while (X < LenSubStr) and (S[I + X] = SubStr[X + 1]) do
Inc(X);
if (X = LenSubStr) then
begin
Result := I;
exit;
end;
end;
Inc(I);
end;
Result := 0;
end;
end;
function PosEnd(Substr,S: string): Integer;
var
i : integer;
begin
i := 0;
repeat
result := i;
i := i + 1;
i := PosOffset(SubStr,S,i)
until i <= 0
end;
function PosN(Substr,S: string; N : Integer): Integer;
var
i: integer;
begin
result := 0;
For i := 1 to N do
begin
result := result + 1;
result := PosOffset(SubStr,S,result);
end;
end;
function PosCount(SubStr,S : string) : Integer;
var
i : integer;
begin
i := 0;
result := -1;
repeat
result := result + 1;
i := i + 1;
i := PosOffset(SubStr,S,i)
until i <= 0
end;
function FirstDelimiter(const Delimiters, S: string): Integer;
var
P: PChar;
len:integer;
begin
Result := 0;
len:=length(s);
P := PChar(Delimiters);
while (Result <len) do
begin
inc(Result);
if (S[Result] <> #0) and (StrScan(P, S[Result]) <> nil) then
if (ByteType(S, Result) = mbLeadByte) then
inc(Result) //双字节中的第一个,跳过不作为分隔符处理
else
break;
end;
if Result>=len then result:=0;
end;
function NextDelimiter(const Delimiters, S: string;StartIndex:integer=1): Integer;
var
P: PChar;
i:integer;
begin
Result := max(StartIndex-1,0);
len:=length(s);
P := PChar(Delimiters);
while (Result <len) do
begin
inc(Result);
if (S[Result] <> #0) and (StrScan(P, S[Result]) <> nil) then
if (ByteType(S, Result) = mbLeadByte) then
inc(Result) //双字节中的第一个,跳过不作为分隔符处理
else
break;
end;
if Result>=len then result:=0;
end;
function StrToTstr(OriginStr:String;DestTstr:Tstrings;Splitter:String =','):Integer;
var
i,iRet:integer;
tmpStr:String;
begin
tmpStr:='';
iRet:=0;
DestTStr.Clear;
for i:=1 to length(OriginStr) do
begin
if (OriginStr[i]<>Splitter) then
tmpStr:=tmpStr+OriginStr[i];
if OriginStr[i]=Splitter then
if tmpStr<>'' then
begin
DestTStr.Add(tmpStr);
iRet:=iRet+1;
tmpStr:='';
end;
end;
if tmpStr<>'' then
begin
DestTStr.Add(tmpStr);
iRet:=iRet+1;
tmpStr:='';
end;
Result:=iRet;
end;
function SplitStrToTstr(OriginStr:String;DestTstr:Tstrings;Splitter:String =','):Integer;
var
i,iRet:integer;
tmpStr:String;
begin
tmpStr:='';
iRet:=0;
DestTStr.Clear;
for i:=1 to length(OriginStr) do
begin
if IsDelimiter(Splitter,OriginStr,i)
if (OriginStr[i]<>Splitter) then
tmpStr:=tmpStr+OriginStr[i];
if OriginStr[i]=Splitter then
if tmpStr<>'' then
begin
DestTStr.Add(tmpStr);
iRet:=iRet+1;
tmpStr:='';
end;
end;
if tmpStr<>'' then
begin
DestTStr.Add(tmpStr);
iRet:=iRet+1;
tmpStr:='';
end;
Result:=iRet;
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -