Вверх ↑
Ответов: 1343
Рейтинг: 31
#1: 2021-01-23 01:57:18 ЛС | профиль | цитата
Joiner писал(а):
Rysik, И что не так



был уже такой вопрос, нашёл решение, взяв компонент из поста https://forum.hiasm.com/post/304292 , НО не компилилось, ругань на параметры ToString, заменил THIStrMask._work_doMask на ту что старая, в итоге всё заработало


не работало по маске 123*, там где неизвестные, отбор не проходил,......

вобщем итоговый код вышел такой


unit hiStrMask;

interface

uses Windows,Share,Debug;

type
  THIStrMask = class(TDebug)
   private
    FMask:string;
    procedure SetMask(msk:string);
   public
    _prop_CaseSensitive:byte;

    _data_Str:THI_Event;
    _event_onTrue:THI_Event;
    _event_onFalse:THI_Event;

    property _prop_Mask:string write SetMask;
    procedure _work_doCompare(var _Data:TData; Index:word);
    procedure _work_doMask(var _Data:TData; Index:word);
  end;

function StrCmp(Str,Msk:string):boolean;

implementation

function _StrCmp(Str,Msk:PChar):boolean;
begin
  while (Str^<>#0)and(Msk^<>#0) do begin
    if Msk^='*' then  begin
      Result := _StrCmp(Str,Msk+1);
      if Result then exit;
    end else begin
      if Msk^='#' then Result := Str^in['0'..'9']
      else Result := (Msk^='?')or(Msk^=Str^);
      if Result then Inc(Msk)
      else exit;
    end;
    Inc(Str);
  end;
  while Msk^ = '*' do inc(Msk);
  Result := (Str^=#0)and(Msk^=#0);
end;

function StrCmp(Str,Msk:string):boolean;
begin
  Result := _StrCmp(Pchar(Str),Pchar(Msk));
end;

procedure THIStrMask._work_doCompare;
var str:string;
begin
  str := ReadString(_Data,_data_Str);
  _hi_CreateEvent(_Data,@_event_onFalse,str);
  if (_prop_CaseSensitive = 1) then begin
    UniqueString(str);
    CharLower(pointer(str));
  end;
  if _StrCmp(PChar(str),PChar(FMask)) then
    _Data.Next := @_event_onTrue;
end;

procedure THIStrMask._work_doMask;
begin
  _prop_Mask := Share.ToString(_Data);
end;

procedure THIStrMask.SetMask;
begin
  FMask := msk;
  if (_prop_CaseSensitive = 1) then begin
    UniqueString(FMask);
    CharLower(pointer(FMask));
  end;
end;

end.
карма: 2

0