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

📄 hutil32.pas

📁 乐都SQL版传奇全套代码,绝对可编译
💻 PAS
📖 第 1 页 / 共 5 页
字号:
      if Count <= srclen then
      begin
        ch := str[Count];
        for i := 0 to ArrCount - 1 do
          if ch = Divider[i] then
            goto CATCH_DIV;
      end;
      if (Count > srclen) then
      begin
        CATCH_DIV:
        if (BufCount > 0) or (ch <> ' ') then
        begin
          if BufCount <= 0 then
          begin
            Buf[0] := ch;
            Buf[1] := #0;
            ch := ' ';
          end
          else
            Buf[BufCount] := #0;
          Dest := string(Buf);
          if ch <> ' ' then
            Result := Copy(str, Count, srclen - Count + 1)
              //remain divider in rest-string,
          else
            Result := Copy(str, Count + 1, srclen - Count); //exclude whitespace
          break;
        end
        else
        begin
          if (Count > srclen) then
          begin
            Dest := '';
            Result := Copy(str, Count + 2, srclen - 1);
            break;
          end;
        end;
      end
      else
      begin
        if BufCount < BUF_SIZE - 1 then
        begin
          Buf[BufCount] := ch;
          Inc(BufCount);
        end
        else
          ShowMessage('BUF_SIZE overflow !');
      end;
      Inc(Count);
    end;
  finally
    //LeaveCriticalSection (CSUtilLock);
  end;
end;


function GetValidStrVal(str: string; var Dest: string; const Divider: array of
  Char): string;
//箭磊甫 盒府秦晨 ex) 12.30mV
const
  BUF_SIZE                              = 15600;
var
  Buf                                   : array[0..BUF_SIZE] of Char;
  BufCount, Count, srclen, i, ArrCount  : Longint;
  ch                                    : Char;
  currentNumeric                        : Boolean;
  hexmode                               : Boolean;
label
  CATCH_DIV;
begin
  ch := #0;                                                 //Jacky
  try
    //EnterCriticalSection (CSUtilLock);
    hexmode := False;
    srclen := Length(str);
    BufCount := 0;
    Count := 1;
    currentNumeric := False;

    if str = '' then
    begin
      Dest := '';
      Result := str;
      exit;
    end;
    ArrCount := SizeOf(Divider) div SizeOf(Char);

    while True do
    begin
      if Count <= srclen then
      begin
        ch := str[Count];
        for i := 0 to ArrCount - 1 do
          if ch = Divider[i] then
            goto CATCH_DIV;
      end;
      if not currentNumeric then
      begin
        if (Count + 1) < srclen then
        begin
          if (str[Count] = '0') and (UpCase(str[Count + 1]) = 'X') then
          begin
            Buf[BufCount] := str[Count];
            Buf[BufCount + 1] := str[Count + 1];
            Inc(BufCount, 2);
            Inc(Count, 2);
            hexmode := True;
            currentNumeric := True;
            Continue;
          end;
          if (ch = '-') and (str[Count + 1] >= '0') and (str[Count + 1] <= '9')
            then
          begin
            currentNumeric := True;
          end;
        end;
        if (ch >= '0') and (ch <= '9') then
        begin
          currentNumeric := True;
        end;
      end
      else
      begin
        if hexmode then
        begin
          if not (((ch >= '0') and (ch <= '9')) or
            ((ch >= 'A') and (ch <= 'F')) or
            ((ch >= 'a') and (ch <= 'f'))) then
          begin
            Dec(Count);
            goto CATCH_DIV;
          end;
        end
        else if ((ch < '0') or (ch > '9')) and (ch <> '.') then
        begin
          Dec(Count);
          goto CATCH_DIV;
        end;
      end;
      if (Count > srclen) then
      begin
        CATCH_DIV:
        if (BufCount > 0) then
        begin
          Buf[BufCount] := #0;
          Dest := string(Buf);
          Result := Copy(str, Count + 1, srclen - Count);
          break;
        end
        else
        begin
          if (Count > srclen) then
          begin
            Dest := '';
            Result := Copy(str, Count + 2, srclen - 1);
            break;
          end;
        end;
      end
      else
      begin
        if BufCount < BUF_SIZE - 1 then
        begin
          Buf[BufCount] := ch;
          Inc(BufCount);
        end
        else
          ShowMessage('BUF_SIZE overflow !');
      end;
      Inc(Count);
    end;
  finally
    //LeaveCriticalSection (CSUtilLock);
  end;
end;

{" " capture => CaptureString (source: string; var rdstr: string): string;
 ** 贸澜俊 " 绰 亲惑 盖 贸澜俊 乐促绊 啊沥
}

function GetValidStrCap(str: string; var Dest: string; const Divider: array of
  Char): string;
begin
  str := TrimLeft(str);
  if str <> '' then
  begin
    if str[1] = '"' then
      Result := CaptureString(str, Dest)
    else
    begin
      Result := GetValidStr3(str, Dest, Divider);
    end;
  end
  else
  begin
    Result := '';
    Dest := '';
  end;
end;


function IntToStrFill(num, len: Integer; fill: Char): string;
var
  i                                     : Integer;
  str                                   : string;
begin
  Result := '';
  str := IntToStr(num);
  for i := 1 to len - Length(str) do
    Result := Result + fill;
  Result := Result + str;
end;

function IntToStr2(INT: Integer): string;
begin
  if INT < 10 then
  begin
    Result := '0' + IntToStr(INT);
  end
  else
  begin
    Result := IntToStr(INT);
  end;
end;

function IsInB(Src: string; Pos: Integer; targ: string): Boolean;
var
  tLen, i                               : Integer;
begin
  Result := False;
  tLen := Length(targ);
  if Length(Src) < Pos + tLen then
    exit;
  for i := 0 to tLen - 1 do
    if UpCase(Src[Pos + i]) <> UpCase(targ[i + 1]) then
      exit;

  Result := True;
end;

function IsInRect(X, Y: Integer; Rect: TRect): Boolean;
begin
  if (X >= Rect.Left) and (X <= Rect.Right) and (Y >= Rect.Top) and (Y <=
    Rect.Bottom) then
    Result := True
  else
    Result := False;
end;

function IsStringNumber(str: string): Boolean;
var
  i                                     : Integer;
begin
  Result := True;
  for i := 1 to Length(str) do
    if (Byte(str[i]) < Byte('0')) or (Byte(str[i]) > Byte('9')) then
    begin
      Result := False;
      break;
    end;
end;


{Return : remain string}

function ArrestString(Source, SearchAfter, ArrestBefore: string;
  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, Fin                         : 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));
          Delete(Source,1,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);
       // Delete(Source,1,n);
       // Result:=Source;
         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;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -