Вверх ↑
Этот топик читают: Гость
Ответов: 1341
Рейтинг: 31
#1: 2020-05-21 16:14:31 ЛС | профиль | цитата
Что то вообще запутался с этой штукой

Есть маска где нужно узнавать неизвестные символы по вхождению в определённую группу, тоесть одна группа это 1-F, а вторая группа это 1-8

взял за основу код StrMask, поменял группу на одну из своих, всё работает, а вот в попытках засунуть вторую группу, ничего не работает

function _StrCmp(Str, Msk: PChar): Boolean;
begin
while (Str^ ‹› #0) and (Msk^ ‹› #0) do
begin
if Msk^ = '*' then
begin
if _StrCmp(Str, Msk + 1) then
begin
Result := True;
exit;
end;
end
else
if Msk^ = '#' then
begin
if Str^ in ['1'..'F'] then Inc(Msk)
else break;
end
else
if (Msk^ = '?') or (Msk^ = Str^) then Inc(Msk)
else break;
Inc(Str);
end;
Result := (Str^ = #0) and (Msk^ = #0);
end;

function StrCmp(Str, Msk: string): Boolean;
begin
Result := _StrCmp(PChar(Str), PChar(Msk));
end;


пример маски ##000000##000^00, где # это один из символов входящих в группу 1-F, а ^ это один из символов входящих в группу 1-8



.
Оооооочень много логики напихано для меня

Редактировалось 3 раз(а), последний 2020-05-21 16:29:22
карма: 2

0
vip
#1.1контекстная реклама от партнеров
Ответов: 8887
Рейтинг: 823
#2: 2020-05-21 17:01:08 ЛС | профиль | цитата
Rysik, ну как всегда, без экстрасенсов не обойтись
Угадал?


Add(MainForm,1686861,196,35)
{
Height=103
Position=1
}
Add(Edit,775967,273,35)
{
Left=20
Top=5
Width=140
Text="123456789ABCDEFGHJ"
ClearAfterEnter=1
Point(doSelectAll)
link(onEnter,16003841:doEvent1,[])
}
Add(InlineCode,9782296,364,42)
{
WorkPoints=#6:doTest|
EventPoints=#5:onRes|
Code=#15:unit HiAsmUnit;|0:|9:interface|0:|21:uses kol,Share,Debug;|0:|4:type|28: THiAsmClass = class(TDebug)|10: private|0:|9: public|4: |24: onRes : THI_Event;|51: PROCEDURE doTest(var _Data:TData; Index:Word);|0:|5: end;|0:|14:implementation|0:|29:PROCEDURE THiAsmClass.doTest;|31:var s,ss1,sss1,ss2,sss2:string;|14: i:integer;|5:BEGIN|10: ss1:='';|10: ss2:='';|11: sss1:='';|11: sss2:='';|21: s:=toString(_Data);|2: |26: for i:=1 to Length(s) do|8: begin|77: if s[i] in ['A'..'F','1'..'9'] then ss1:= ss1+ s[i] else ss2:= ss2 + s[i];|72: if s[i] in ['1'..'8'] then sss1:= sss1+ s[i] else sss2:= sss2 + s[i];|6: end;|51: _hi_onEvent(onRes,ss1+';'+ss2+';'+sss1+';'+sss2);|4:END;|4:end.|
link(onRes,5477732:doText,[])
}
Add(Hub,16003841,322,42)
{
link(onEvent1,9782296:doTest,[])
link(onEvent2,775967:doSelectAll,[(347,55)(347,74)(261,74)(261,55)])
}
Add(Edit,5477732,420,42)
{
Left=20
Top=40
Width=355
Text=""
}

карма: 19

0
Ответов: 1341
Рейтинг: 31
#3: 2020-05-21 17:06:05 ЛС | профиль | цитата
Леонид писал(а):
Rysik, ну как всегда, без экстрасенсов не обойтись


вроде нет)

нужен аналог компонента StrMask, только в IС в качестве функции с указанием строки и маски

например у компонента есть мануал:

Маска для сравнения со строкой (* - любые символы, ? - один любой символ, # - одна любая цифра)

а должен быть такой (# - один любой символ от 1 до F, ^ - один любой символ от 1 до 8)

--- Добавлено в 2020-05-21 17:07:48

что то не понятное:


function _StrCmp(Str, Msk: PChar): Boolean;
begin
while (Str^ <> #0) and (Msk^ <> #0) do
begin

if Msk^ = '#' then
begin
if Str^ in ['1'..'F'] then Inc(Msk)
end;

if Msk^ = '^' then
begin
if Str^ in ['1'..'8'] then Inc(Msk)
else break;
end;


Inc(Str);
end;

Result := (Str^ = #0) and (Msk^ = #0);
end;

function StrCmp(Str, Msk: string): Boolean;
begin
Result := _StrCmp(PChar(Str), PChar(Msk));
end;


использование:


StrCmp(RM8, '##000000##000^00')

Редактировалось 1 раз(а), последний 2020-05-21 17:07:48
карма: 2

0
Ответов: 207
Рейтинг: 14
#4: 2020-05-21 18:02:00 ЛС | профиль | цитата
Rysik, Чем RE_Check не устроил?

Add(MainForm,2953706,133,126)
{
}
Add(RE_Check,1518977,280,245)
{
Point(Expression)
link(onMatch,5824562:doData,[])
link(onDismatch,9660562:doData,[])
link(Str,4796771:Text,[(286,205)(237,205)])
link(Expression,16432300:Result,[])
}
Add(Button,13180880,133,189)
{
Left=10
Top=15
link(onClick,3825079:doEvent1,[])
}
Add(RichEdit,12035139,434,245)
{
Left=5
Top=40
Width=375
Height=215
}
Add(MultiReplace,16432300,287,189)
{
ReplaceList="#=[1-9a-fA-F];\r\n^=[1-8];"
link(Text,5287939:Text,[])
}
Add(Edit,5287939,287,133)
{
Left=245
Top=15
Width=125
Text="##000000##000^00"
}
Add(Hub,3825079,182,189)
{
link(onEvent1,16432300:doMultiReplace,[])
link(onEvent2,1518977:doCheck,[(226,202)(226,251)])
}
Add(Edit,4796771,231,133)
{
Left=80
Top=15
Width=155
Text="1f0000002a000300"
}
Add(DoData,5824562,336,245)
{
Data=String(Да)
link(onEventData,14068057:doWork2,[])
}
Add(DoData,9660562,336,252)
{
Data=String(Нет)
link(onEventData,14068057:doWork3,[(389,258)])
}
Add(HubEx,14068057,385,245)
{
link(onEvent,12035139:doAdd,[])
}
карма: 2

0
Ответов: 1341
Рейтинг: 31
#5: 2020-05-21 19:17:31 ЛС | профиль | цитата
Щас затестим, кто быстрее работает)
карма: 2

0
Ответов: 1341
Рейтинг: 31
#6: 2020-05-22 00:09:47 ЛС | профиль | цитата
вроде заработало))



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

function StrCmp(Str, Msk: string): Boolean;
begin
Result := _StrCmp(PChar(Str), PChar(Msk));
end;
карма: 2

0
Ответов: 8887
Рейтинг: 823
#7: 2020-05-22 01:34:54 ЛС | профиль | цитата
Rysik, а вот чистый Паскаль
Паскаль


Add(MainForm,1686861,126,77)
{
Width=449
Height=390
Position=1
link(onCreate,12197831:doWork1,[(166,97)(166,153)])
}
Add(Edit,775967,245,77)
{
Left=260
Top=5
Width=110
Text="123^567#9AB#DEF"
Point(doSelectAll)
}
Add(InlineCode,9782296,238,154)
{
WorkPoints=#6:doTest|
EventPoints=#46:onRes=Строка при совпадении с маской, иначе -1|
DataPoints=#33:Str=Строка для сравнения с маской|80:Mask=Маска, где # - один любой символ от 1 до F, ^ - один любой символ от 1 до 8|
Code=#15:unit HiAsmUnit;|0:|9:interface|0:|21:uses kol,Share,Debug;|0:|4:type|28: THiAsmClass = class(TDebug)|10: private|0:|9: public|26: _data_Data:THI_Event;|60: Str:THI_Event; //Строка для сравнения с Маской|109: Mask:THI_Event; //Маска, где # - один любой символ от 1 до F, ^ - один любой символ от 1 до 8 |24: onRes : THI_Event;|51: PROCEDURE doTest(var _Data:TData; Index:Word);|5: end;|0:|14:implementation|0:|29:PROCEDURE THiAsmClass.doTest;|21:var s,StrMask:string;|28: i,j,k,LenS,LenM:integer;|21: Res,Temp:boolean;|5:BEGIN|20: Res:=true; //false|32: s:=ReadString(_Data, Str, '');|39: StrMask:=ReadString(_Data, Mask, '');|47: if ((StrMask='') or (s='')) then Res:=false;|24: LenM:=length(StrMask);|24: LenS:=length(s)-LenM; |29: if LenS<0 then Res:=false;|0:|14: if Res then|9: begin|24: for i:=1 to LenS do|11: begin|12: j:=1;|13: repeat|19: Temp:=true;|37: if s[i+j-1]<>StrMask[j] then|15: begin|23: Temp:=false;|77: if StrMask[j]='#' then Temp:= (s[i+j-1] in ['A'..'F','1'..'9']); |67: if StrMask[j]='^' then Temp:= (s[i+j-1] in ['1'..'8']);|8: end;|38: if Temp then j:=j+1 else j:=LenM+1;|17: until j>LenM;|26: if Temp then break;|12: end; |8: end;|64: if Temp then _hi_onEvent(onRes,s) else _hi_onEvent(onRes,-1);|4:END;|4:end.|
link(onRes,12210695:doString,[])
link(Mask,8909342:Var2,[])
}
Add(Button,8738940,119,154)
{
Left=5
Top=5
link(onClick,12197831:doWork2,[])
}
Add(Edit,4570180,175,77)
{
Left=70
Top=5
Text="1000"
DataType=2
}
Add(StringTable,6102780,343,154)
{
Top=35
Width=430
Height=310
Columns=#10:Строка=205|13:Результат=205|
Grid=0
}
Add(FormatStr,12210695,294,154)
{
Mask="%1;%2"
link(onFString,6102780:doAdd,[])
link(Str1,12197831:Var1,[(300,142)(221,142)(221,191)(181,191)])
}
Add(GetDataEx,8909342,245,126)
{
link(Data,775967:Text,[])
}
Add(MultiElement,12197831,175,147)
{
link(onEvent1,6102780:doClear,[(279,153)(279,167)])
link(onEvent2,9782296:doTest,[])
link(Data1,4570180:Text,[])
link(Data2,8909342:Var1,[(188,131)])
link(onEvent3,1686861:doCaption,[(219,167)(219,125)(114,125)(114,83)])
}
BEGIN_SDK
Add(EditMulti,2416732,21,21)
{
EventCount=3
WorkCount=2
DataCount=2
VarCount=1
Width=622
Height=347
link(doWork1,5993116:doRandomize,[(265,27)(265,125)])
link(doWork2,7161636:doEvent1,[(42,34)(42,97)])
link(Var1,6396398:Value,[(27,354)(496,354)])
}
Add(For,7818562,112,105)
{
link(onEvent,11680134:doEvent1,[])
link(onStop,4259486:doStop,[(163,118)(163,62)])
link(End,2416732:Data1,[(125,42)(27,42)])
}
Add(Random,5993116,273,112)
{
Min=48
Max=75
link(onRandom,8035443:doConvert,[])
}
Add(Hub,7161636,63,91)
{
OutCount=4
link(onEvent1,2416732:onEvent1,[(360,97)(360,27)])
link(onEvent2,4259486:doStart,[(129,104)(129,55)])
link(onEvent3,7818562:doFor,[])
}
Add(TimeCounter,4259486,182,49)
{
link(onStop,4492718:doStrCat,[])
}
Add(For,1423395,210,112)
{
End=4
link(onEvent,5993116:doRandom,[])
link(onStop,4335433:doData,[(255,125)(255,160)])
}
Add(Convertor,8035443,322,112)
{
Mode=4
link(onResult,12708901:doWork2,[])
}
Add(Hub,11680134,168,105)
{
OutCount=3
link(onEvent1,13799969:doClear,[(378,111)(378,125)])
link(onEvent2,1423395:doFor,[])
link(onEvent3,6078785:doFor,[(200,125)(200,202)])
}
Add(Random,8659064,322,252)
{
Min=48
Max=75
link(onRandom,12391323:doConvert,[])
}
Add(For,597781,210,252)
{
End=2
link(onEvent,16125775:doCalc,[])
link(onStop,9952110:doReplace,[(268,265)(268,314)])
}
Add(Convertor,12391323,364,252)
{
Mode=4
link(onResult,14335108:doValue,[])
}
Add(Random,1020798,280,196)
{
Min=48
Max=75
link(onRandom,13983155:doConvert,[])
}
Add(For,6078785,217,196)
{
End=4
link(onEvent,1020798:doRandom,[])
link(onStop,597781:doFor,[(261,209)(261,233)(198,233)(198,258)])
}
Add(Convertor,13983155,322,196)
{
Mode=4
link(onResult,7363545:doWork3,[(361,202)])
}
Add(StrCat,13799969,406,112)
{
Point(doClear)
link(onStrCat,5071152:doWork2,[])
link(Str1,13799969:Result,[(412,100)(400,100)(400,156)(412,156)])
}
Add(DoData,4335433,308,154)
{
link(onEventData,7363545:doWork2,[])
link(Data,2416732:Data2,[(314,33)(34,33)])
}
Add(HubEx,12708901,357,112)
{
link(onEvent,13799969:doStrCat,[])
}
Add(HubEx,7363545,357,154)
{
Angle=3
link(onEvent,12708901:doWork3,[])
}
Add(MathParse,16125775,273,252)
{
DataCount=1
MathStr="%1*4 + 9"
ResultType=0
link(onResult,8659064:doRandom,[])
}
Add(Insert,5503329,518,252)
{
link(onInsert,5071152:doWork3,[(560,258)(560,190)(452,190)])
link(SubStr,14335108:Value,[(531,243)(510,243)(510,294)(419,294)])
link(Position,5704627:Var3,[(538,233)])
}
Add(Memory,1419153,462,112)
{
}
Add(Delete,7596451,462,252)
{
Count=1
link(onDelete,5503329:doInsert,[])
link(Str,15473944:Var2,[])
link(Position,5704627:Var2,[])
}
Add(GetDataEx,5704627,469,228)
{
Angle=3
link(Data,16125775:Result,[(404,233)(404,296)(279,296)])
}
Add(Memory,14335108,413,252)
{
link(onData,7596451:doDelete,[])
}
Add(HubEx,5071152,448,112)
{
link(onEvent,1419153:doValue,[])
}
Add(Replace,9952110,448,308)
{
SubStr=";"
DestStr="E"
link(onReplace,6396398:doValue,[])
link(Str,15473944:Var1,[(454,215)])
}
Add(GetDataEx,15473944,462,210)
{
link(Data,1419153:Value,[])
}
Add(StrCat,4492718,224,56)
{
Str2=" мсек"
link(onStrCat,2416732:onEvent3,[(428,62)(428,41)])
}
Add(Memory,6396398,490,308)
{
link(onData,2416732:onEvent2,[(574,314)(574,34)])
}
END_SDK

карма: 19

0
7
Сообщение
...
Прикрепленные файлы
(файлы не залиты)