Вверх ↑
Ответов: 1341
Рейтинг: 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