|
|
#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); |
|
|