⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ufunctions.pas

📁 定时扫描局域网络中的电脑的Mac地址情况
💻 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 + -