
Давайте сейчас подробно рассмотрим эту задачу...
Сейчас мы будем вырезать часть не функционального кода, к примеру того, что между "{" і "}" при условии что "{" не есть, к примеру, между кавычками ("{123}")
Вот примерный код:
type
TArrayOfTStrings4 = array [0..3] of TStrings;
TSetOfSym = set of #1..#255;
если задавать параметры прямо около функции, то эти типы не являются обьязательными
Код:
private
function CutNotFuncCode(Param:TArrayOfTStrings4;
const Code:PChar; const NotSym : TSetOfSym;
const WriteElseText:boolean):String; overload;
function CutNotFuncCode(Code:PChar):string; overload;//вспомогательная функция
Код:
function TMainForm.CutNotFuncCode(Code: PChar): string;
var
Param: TArrayOfTStrings4;
NotSym:TSetOfSym;
i:integer;
begin
NotSym:=[#$D,#$A,#9]; //символы, которые безусловно вирезаются
for i := 0 to 3 do
param[i]:= TStringList.Create; //TString необходимо сотворить, чтобы потом иметь возможность с ним работать
param[0].Add('{'); //список начал не функционального кода
param[1].add('}'); //список окончаний не функционального кода
param[2].add('"'); //список начал кода, в котором не проверяется наличие не функционального кода
param[3].Add('"'); //список окончаний кода, в котором не проверяется наличие не функционального кода
Result:=PChar(CutNotFuncCode(Param,Code,NotSym,true));
//последний параметр указывает на то, что делать с текстом, который не является "не функциональним" (ибо этот вырезается) и не является кодом, который не проверяется (потому что этот остается), если true тогда остается, если же false - вирезает
end;
а вот и сама функция
function TMainForm.CutNotFuncCode(Param: TArrayOfTStrings4; const Code: PChar;
const NotSym:TSetOfSym; const WriteElseText:boolean): String;
function Equality(SearchStr,InStr:PChar):boolean;
var
I:integer;
begin
result:=false;
for I := 0 to length(SearchStr)-1 do
if SearchStr[i]<>InStr[i] then exit;
result:=true;
end;
var
i,j:integer;
expected:array [0..1] of integer;
code1:PChar;
ready:boolean;
begin
result:=''; ready:=true;
code1:=Code;
expected[0]:=0; expected[1]:=0;
while Code1^<>#0 do
begin
for J := 1 downto 0 do
begin
if ((j=1) and (expected[0]=0)) or ((j=0) and (expected[1]=0)) then
if expected[j]=0 then
begin
for I := 0 to Param[j*2].Count-1 do
if Equality(PChar(Param[j*2].Strings[i]),code1) then
begin
expected[j]:=i+1;
inc(Code1,Length(Param[j*2].Strings[i]));
Continue;
end;
end
else
if expected[j]>0 then
if Equality(PChar(Param[j*2+1].Strings[expected[j]-1]),code1) then
begin
inc(Code1,Length(Param[j*2+1].Strings[expected[j]-1])-1);
expected[j]:=0;
ready:=false;
continue;
end;
end;
if ready and (expected[0]=0) and (not(Code1^ in NotSym))
then if WriteElseText then result:=result+Code1^
else if expected[1]<>0 then result:=result+Code1^;
ready:=true;
inc(code1);
end;
end;
П.С. Нужно еще отметить что приведенная више функция отличается быстродействием...
Спонсор поста: ищете самые дешевые сервисные центры в России по ремонту мобильников? На интернет-сайте expertgsm.ru, Вы можете ознакомится с ценами на ремонт iphone 3gs в москве, а также отремонтировать другие модели телефонов.