![]() |
#12 |
Участник
|
Интересный перебор. Правильно ли я понял, что надо создать функцию преобразующую исходный фильтр в противоположный?
Если да, то можно сваять что-то вроде: Код: //функция OppositeFilter(PFilter : Text[100]) : Text[100] CompleteFilter:=''; PFilter:=CONVERTSTR(PFilter,',','|'); WHILE STRPOS(PFilter,'|')<>0 DO BEGIN ORBlock:=COPYSTR(PFilter,1,STRPOS(PFilter,'|')-1); PFilter:=DELSTR(PFilter,1,STRPOS(PFilter,'|')); IF STRPOS(ORBlock,'..')<>0 THEN BEGIN BRange:=COPYSTR(ORBlock,1,STRPOS(ORBlock,'..')-1); ERange:=COPYSTR(ORBlock,STRPOS(ORBlock,'..')+2,STRLEN(ORBlock)); IF CompleteFilter<>'' THEN CompleteFilter+='&'; CompleteFilter+='('+'<'+BRange+'|'+'>'+ERange+')' END ELSE BEGIN IF CompleteFilter<>'' THEN CompleteFilter+='&'; CompleteFilter+='('+'<>'+ORBlock+')'; END; END; IF PFilter<>'' THEN BEGIN IF STRPOS(PFilter,'..')<>0 THEN BEGIN BRange:=COPYSTR(PFilter,1,STRPOS(PFilter,'..')-1); ERange:=COPYSTR(PFilter,STRPOS(PFilter,'..')+2,STRLEN(PFilter)); IF CompleteFilter<>'' THEN CompleteFilter+='&'; CompleteFilter+='('+'<'+BRange+'|'+'>'+ERange+')' END ELSE BEGIN IF CompleteFilter<>'' THEN CompleteFilter+='&'; CompleteFilter+='('+'<>'+PFilter+')'; END; END; EXIT(CompleteFilter); |
|