码农的笔记

Delphi虽好,但已不流行; 博客真好,可以做笔记

博客园 首页 新随笔 联系 订阅 管理

---------上篇

 

 

 -----------------上篇的简单介绍

 以下为此篇内容

【DBGrid的字体颜色控制之模拟条件的判断】

写到这里就算完成,项目的代码不会展示

这里只展示测试代码,试了好多方法,开发这个颜色控制的思路都在这里,代码的注解较少

--------------------------------------------

 

 

------------Unit

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
Button3: TButton;
Button4: TButton;
Edit1: TEdit;
Button5: TButton;
Label1: TLabel;
Button6: TButton;
Button7: TButton;
Memo1: TMemo;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Button4Click(Sender: TObject);
procedure Button5Click(Sender: TObject);
procedure Button6Click(Sender: TObject);
procedure Button7Click(Sender: TObject);
private
function GetWhereANDORBool(WhereANDORStr,WhereTFStr:string):Boolean;
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation
uses
Math;
const
Terms: array[0..12] of string = ('', '=', '<', '<=', '>', '>=', '<>', 'LLIKE', 'RLIKE', 'LIKE', 'NOTLIKE', 'ISNULL', 'ISNOTNULL');
AddSeparatorTerms: array[0..12] of string = ('', ';;=;;', ';;<;;', ';;<=;;', ';;>;;', ';;>=;;', ';;<>;;', ';;LLIKE;;', ';;RLIKE;;', ';;LIKE;;', ';;NOTLIKE;;', ';;ISNULL;;', ';;ISNOTNULL;;');

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
v01,v02,v03:string;
I01,I02,I03:Integer;
begin
v01:='AA';
v02:='AB';
v03:='AC';
if (v01='AQ') or (v02='AB') and (v03='AC') then
begin
ShowMessage('000');
end;
end;

procedure TForm1.Button2Click(Sender: TObject);
const
//test01='(ID<99 OR ID=666 AND ID=10000 AND ID=10111 OR ID=888) OR (COMM<''999'' OR COMM<''999'' AND COMM=''999'' OR COMM=''COM5'') AND (Test_boolean=1 OR Test_boolean<0)'
// +' AND (A01=888) AND (A02=888) OR (A03=888) OR (A04=888)' ;
test01='(ID;;<;;99 OR ID;;=;;666 AND ID;;=;;10000 AND ID;;=;;10111 OR ID;;=;;888) OR (COMM;;<;;''999'' OR COMM;;<;;''999'' AND COMM;;=;;''999'' OR COMM;;=;;''COM5'') AND (Test_boolean;;=;;1 OR Test_boolean;;<;;0)'
+' AND (A01;;=;;888) AND (A02;;=;;888) OR (A03;;=;;888) OR (A04;;=;;888)' ;
var
Vtest,VtestSort_FieldOut,VtestSort_FieldInt:string;
i,j,Pos_or,Pos_and,ANDORIndex:Integer;
VArrayFieldOut:array[0..151] of String;

ANDOR_FieldsOUT:array[0..150] of Integer ; //OR为0 ,AND为1 //字段之间的 //(COMM<''999'' AND COMM=''999'' OR COMM<''999'') AND (Test_boolean=1 OR Test_boolean<0)
ANDOR_FieldsIN:array[0..150,0..9] of Integer ; //OR为0 ,AND为1 //单个字段的 //(COMM<''999'' AND COMM=''999'' OR COMM<''999'')

Where_FieldsOUT:array[0..151] of String ;
Where_FieldsIN:array[0..151,0..10] of String ;
vBoolBegin:Boolean;
begin
{总结:经过测试,没办法实现排序,没办法把所有的AND置前,方向错误}
//逻辑与 优先级大于 逻辑或,为此重新整理顺序

Exit;
Vtest:=test01;
if Vtest='' then
Exit;
vBoolBegin:=True; //开始截取标志
ANDORIndex:=-1;
for i:=0 to 150 do
begin
ANDOR_FieldsOUT[i]:=-1;
for j:=0 to 9 do
begin
ANDOR_FieldsIN[i][j]:=-1;
end;
end;
//第一步,把括号以外的顺序先整理,把AND的置前
while Vtest<>'' do
begin
inc(ANDORIndex);
if not vBoolBegin then
begin

end
else
begin
vBoolBegin:=False;
Pos_and:=Pos(Vtest,') AND (');
Pos_or:=Pos(Vtest,') OR (');
if Pos_and>0 then //栏位之间存在AND
begin
if Pos_or>0 then //OR和AND同在的情况
begin
if Pos_and>Pos_or then //AND在后,
begin
//Where_FieldsOUT[ANDORCount]:=;
end
else//AND在前
begin

end;

//VtestSort_FieldOut:=
end
else //当全是AND时
begin
VtestSort_FieldOut:=Vtest;
Vtest:='';

end;
end
else//栏位之间不存在AND
begin
VtestSort_FieldOut:=Vtest;
Vtest:='';

end;
end;

end;

 

Vtest:=test01;
//第二步,把括号内的顺序先整理,把AND的置前
// while Pos(Vtest,') OR (')>0 do
begin
//Vtest
end;
end;

procedure TForm1.Button3Click(Sender: TObject);
const
test01='(COMM<''999'' AND COMM=''999'' OR COMM=''999'') AND (Test_boolean=1 OR Test_boolean<0) OR (ID=666 AND ID=10000 AND ID=10111 OR ID<99)' ;
var
Vtest,Vtest01:string;
Bool01:Boolean;
FieldWhereBool_TF:array[0..151] of Integer; //(COMM<''999'' AND COMM=''999'' OR COMM<''999'')的True或者False
pos_i,i,j:Integer;
ANDOR_FieldsOUT:array[0..150] of Integer ; //OR为0 ,AND为1 //字段之间的 //(COMM<''999'' AND COMM=''999'' OR COMM<''999'') AND (Test_boolean=1 OR Test_boolean<0)
ANDOR_FieldsIN:array[0..150,0..9] of Integer ; //OR为0 ,AND为1 //单个字段的 //(COMM<''999'' AND COMM=''999'' OR COMM<''999'')
Where_FieldsOUT:array[0..151] of String ;
Where_FieldsIN:array[0..151,0..10] of String ;
ArrayHaveValueCount:Integer; // ') OR (' 和 ') AND ('的总数量
VCOMM,VTest_boolean,VID:string;
vKeyValue,vKey,vValue:String;
begin
VCOMM:='999';
VTest_boolean:='-1';
VID:='66';

Vtest:= test01;
Bool01:=False;
ArrayHaveValueCount:=-1;
Vtest:=StringReplace(test01,'''''','',[rfReplaceAll]);
if Vtest='' then
Exit;
for i:=0 to 150 do
begin
FieldWhereBool_TF[i]:=-1;
ANDOR_FieldsOUT[i]:=-1;
for j:=0 to 9 do
begin
ANDOR_FieldsIN[i][j]:=-1;
end;
end;
FieldWhereBool_TF[151]:=-1;
while Vtest<>'' do
begin
inc(ArrayHaveValueCount);
if Pos(') AND (',Vtest)>0 then
begin
pos_i:=Pos(') AND (',Vtest);
Vtest01:=Copy(Vtest,1,pos_i);
Vtest:=Copy(Vtest,pos_i+6,20000);
ANDOR_FieldsOUT[ArrayHaveValueCount]:=1;
end
else
if Pos(') OR (',Vtest)>0 then
begin
pos_i:=Pos(') OR (',Vtest);
Vtest01:=Copy(Vtest,1,pos_i);
Vtest:=Copy(Vtest,pos_i+5,20000);
ANDOR_FieldsOUT[ArrayHaveValueCount]:=0;
end
else
begin
Vtest01:=Vtest;

 

Vtest:='';//计算到最后要把这个置为空
end;
Where_FieldsOUT[ArrayHaveValueCount]:=Vtest01;
end;

 

for i:=Low( Where_FieldsOUT) to High(Where_FieldsOUT) do
begin
Vtest:=Where_FieldsOUT[i];
if Vtest='' then
Break;
Delete(Vtest,1,1);//删除左括号
Vtest:=Copy(Vtest,1,Length(Vtest)-1); //删除右括号
ArrayHaveValueCount:=-1;
while Vtest<>'' do
begin
inc(ArrayHaveValueCount);

if Pos(' AND ',Vtest)>0 then
begin
pos_i:=Pos(' AND ',Vtest);
Vtest01:=Copy(Vtest,1,pos_i);
Vtest:=Copy(Vtest,pos_i+4,20000);
ANDOR_FieldsIN[i][ArrayHaveValueCount]:=1;
end
else
if Pos(' OR ',Vtest)>0 then
begin
pos_i:=Pos(' OR ',Vtest);
Vtest01:=Copy(Vtest,1,pos_i);
Vtest:=Copy(Vtest,pos_i+3,20000);
ANDOR_FieldsIN[i][ArrayHaveValueCount]:=0;
end
else
begin
Vtest01:=Vtest;

 

Vtest:='';//计算到最后要把这个置为空
end;
Where_FieldsIN[i][ArrayHaveValueCount]:=Vtest01;
end;
end;

{
VCOMM:='999';
VTest_boolean:=-1;
VID:=66;
FieldWhereBool_TF
}
//循环判断
for i:=0 to 151 do //栏位数
begin
if Where_FieldsOut[i]='' then
Break;
for j:=0 to 10 do //单个栏位的逻辑运算个数
begin
if Where_FieldsIN[i][j]='' then
Break;
pos_i:=pos('=',Where_FieldsIN[i][j]);
vKey:=Copy(Where_FieldsIN[i][j],1,pos_i-1);
vValue:=Copy(Where_FieldsIN[i][j],pos_i+1,300);
if vKey='COMM' then
begin

end
else if vKey='Test_boolean' then
begin

end
else if vKey='ID' then
begin

end;
end;
end;

{以下测试时使用}
ShowMessage('000');
Vtest:='333';
end;

procedure TForm1.Button4Click(Sender: TObject);
begin

edit1.Text:=StringReplace('''999''','''''','''',[]);
end;

procedure TForm1.Button5Click(Sender: TObject);
const
test01='(COMM=''999'' AND COMM=''96'' OR COMM=''999'') AND (Test_boolean=1 OR Test_boolean=0) OR (ID=666 AND ID=10000 AND ID=10111 OR ID=99)' ;
CTerms='<,<,=,=,<,=,=,=,<,';
var
Vtest,Vtest01:string;
Bool_FieldOut,Bool_FieldIn:Boolean;
FieldWhereBool_TF:array[0..151] of Integer; //(COMM<''999'' AND COMM=''999'' OR COMM<''999'')的True或者False
pos_i,i,j:Integer;
ANDOR_FieldsOUT:array[0..150] of Integer ; //OR为0 ,AND为1 //字段之间的 //(COMM<''999'' AND COMM=''999'' OR COMM<''999'') AND (Test_boolean=1 OR Test_boolean<0)
ANDOR_FieldsIN:array[0..150,0..9] of Integer ; //OR为0 ,AND为1 //单个字段的 //(COMM<''999'' AND COMM=''999'' OR COMM<''999'')
Where_FieldsOUT:array[0..151] of String ;
Where_FieldsIN:array[0..151,0..10] of String ;
vTerms:string;
TermsArray:array of string;
ArrayHaveValueCount:Integer; // ') OR (' 和 ') AND ('的总数量
TermsPos:Integer;//当前应该用哪个符号
VCOMM,VTest_boolean,VID:string;
vKeyValue,vKey,vValue:String;
begin
VCOMM:='9999';
VTest_boolean:='-1';
VID:='999';
vTerms:=CTerms;
Vtest:= test01;
ArrayHaveValueCount:=-1;
Vtest:=StringReplace(test01,'''''','',[rfReplaceAll]);
if Vtest='' then
Exit;
SetLength(TermsArray,1600);//Ceil(Length(CTerms)/2.0)
for i:=Low(TermsArray) to High(TermsArray) do
begin
pos_i:=Pos(',',vTerms);
TermsArray[i]:=Copy(vTerms,1,pos_i-1);
Delete(vTerms,1,pos_i);
//vTerms:=Copy(vTerms,3,1000);
end;
for i:=0 to 150 do
begin
FieldWhereBool_TF[i]:=-1;
ANDOR_FieldsOUT[i]:=-1;
for j:=0 to 9 do
begin
ANDOR_FieldsIN[i][j]:=-1;
end;
end;
FieldWhereBool_TF[151]:=-1;
while Vtest<>'' do
begin
inc(ArrayHaveValueCount);
if Pos(') AND (',Vtest)>0 then
begin
pos_i:=Pos(') AND (',Vtest);
Vtest01:=Copy(Vtest,1,pos_i);
Vtest:=Copy(Vtest,pos_i+6,20000);
ANDOR_FieldsOUT[ArrayHaveValueCount]:=1;
end
else
if Pos(') OR (',Vtest)>0 then
begin
pos_i:=Pos(') OR (',Vtest);
Vtest01:=Copy(Vtest,1,pos_i);
Vtest:=Copy(Vtest,pos_i+5,20000);
ANDOR_FieldsOUT[ArrayHaveValueCount]:=0;
end
else
begin
Vtest01:=Vtest;

 

Vtest:='';//计算到最后要把这个置为空
end;
Where_FieldsOUT[ArrayHaveValueCount]:=Vtest01;
end;

 

for i:=Low( Where_FieldsOUT) to High(Where_FieldsOUT) do
begin
Vtest:=Where_FieldsOUT[i];
if Vtest='' then
Break;
Delete(Vtest,1,1);//删除左括号
Vtest:=Copy(Vtest,1,Length(Vtest)-1); //删除右括号
ArrayHaveValueCount:=-1;
while Vtest<>'' do
begin
inc(ArrayHaveValueCount);

if Pos(' AND ',Vtest)>0 then
begin
pos_i:=Pos(' AND ',Vtest);
Vtest01:=Copy(Vtest,1,pos_i-1);
Vtest:=Copy(Vtest,pos_i+5,20000);
ANDOR_FieldsIN[i][ArrayHaveValueCount]:=1;
end
else
if Pos(' OR ',Vtest)>0 then
begin
pos_i:=Pos(' OR ',Vtest);
Vtest01:=Copy(Vtest,1,pos_i-1);
Vtest:=Copy(Vtest,pos_i+4,20000);
ANDOR_FieldsIN[i][ArrayHaveValueCount]:=0;
end
else
begin
Vtest01:=Vtest;

 

Vtest:='';//计算到最后要把这个置为空
end;
Where_FieldsIN[i][ArrayHaveValueCount]:=Vtest01;
end;
end;

{
VCOMM:='999';
VTest_boolean:=-1;
VID:=66;
FieldWhereBool_TF
}
//循环判断
Bool_FieldOut:=True;//初始化时为真
TermsPos:=-1;
for i:=0 to 151 do //栏位数
begin
if Where_FieldsOut[i]='' then
Break;
Bool_FieldIn:=True;//初始化时为真
for j:=0 to 10 do //单个栏位的逻辑运算个数
begin
if Where_FieldsIN[i][j]='' then
Break;
Inc(TermsPos);
pos_i:=pos('=',Where_FieldsIN[i][j]);
vKey:=Copy(Where_FieldsIN[i][j],1,pos_i-1);
vValue:=Copy(Where_FieldsIN[i][j],pos_i+1,300);
if vKey='COMM' then
begin
if TermsArray[TermsPos]='=' then
begin
if j=0 then
begin
Bool_FieldIn:=Bool_FieldIn and (VCOMM=vValue);
end
else
begin
if ANDOR_FieldsIN[i][j-1]=1 then
begin
Bool_FieldIn:=Bool_FieldIn and (VCOMM=vValue);
end
else if ANDOR_FieldsIN[i][j-1]=0 then
begin
Bool_FieldIn:=Bool_FieldIn or (VCOMM=vValue);
end;
end;
end
else if TermsArray[TermsPos]='<' then
begin
if j=0 then
begin
Bool_FieldIn:=Bool_FieldIn and (VCOMM<vValue);
end
else
begin
if ANDOR_FieldsIN[i][j-1]=1 then
begin
Bool_FieldIn:=Bool_FieldIn and (VCOMM<vValue);
end
else if ANDOR_FieldsIN[i][j-1]=0 then
begin
Bool_FieldIn:=Bool_FieldIn or (VCOMM<vValue);
end;
end;
end
else if TermsArray[TermsPos]='<=' then
begin

end
else if TermsArray[TermsPos]='>' then
begin

end
else if TermsArray[TermsPos]='>=' then
begin

end
else if TermsArray[TermsPos]='<>' then
begin

end//('', '=', '<', '<=', '>', '>=', '<>', 'LLIKE', 'RLIKE', 'LIKE', 'NOTLIKE', 'ISNULL', 'ISNOTNULL')
else if TermsArray[TermsPos]='LLIKE' then
begin

end
else if TermsArray[TermsPos]='RLIKE' then
begin

end
else if TermsArray[TermsPos]='LIKE' then
begin

end
else if TermsArray[TermsPos]='NOTLIKE' then
begin

end
else if TermsArray[TermsPos]='ISNULL' then
begin

end
else if TermsArray[TermsPos]='ISNOTNULL' then
begin

end;
end
else if vKey='Test_boolean' then
begin
if TermsArray[TermsPos]='=' then
begin
if j=0 then
begin
Bool_FieldIn:=Bool_FieldIn and (VTest_boolean=vValue);
end
else
begin
if ANDOR_FieldsIN[i][j-1]=1 then
begin
Bool_FieldIn:=Bool_FieldIn and (VTest_boolean=vValue);
end
else if ANDOR_FieldsIN[i][j-1]=0 then
begin
Bool_FieldIn:=Bool_FieldIn or (VTest_boolean=vValue);
end;
end;
//Bool_FieldIn:=Bool_FieldIn and (VTest_boolean=vValue);
end
else if TermsArray[TermsPos]='<' then
begin
if j=0 then
begin
Bool_FieldIn:=Bool_FieldIn and (VTest_boolean<vValue);
end
else
begin
if ANDOR_FieldsIN[i][j-1]=1 then
begin
Bool_FieldIn:=Bool_FieldIn and (VTest_boolean<vValue);
end
else if ANDOR_FieldsIN[i][j-1]=0 then
begin
Bool_FieldIn:=Bool_FieldIn or (VTest_boolean<vValue);
end;
end;
//Bool_FieldIn:=Bool_FieldIn and (VTest_boolean<vValue);
end;
end
else if vKey='ID' then
begin
if TermsArray[TermsPos]='=' then
begin
if j=0 then
begin
Bool_FieldIn:=Bool_FieldIn and (VID=vValue);
end
else
begin
if ANDOR_FieldsIN[i][j-1]=1 then
begin
Bool_FieldIn:=Bool_FieldIn and (VID=vValue);
end
else if ANDOR_FieldsIN[i][j-1]=0 then
begin
Bool_FieldIn:=Bool_FieldIn or (VID=vValue);
end;
end;
//Bool_FieldIn:=Bool_FieldIn and (VID=vValue);
end
else if TermsArray[TermsPos]='<' then
begin
if j=0 then
begin
Bool_FieldIn:=Bool_FieldIn and (VID<vValue);
end
else
begin
if ANDOR_FieldsIN[i][j-1]=1 then
begin
Bool_FieldIn:=Bool_FieldIn and (VID<vValue);
end
else if ANDOR_FieldsIN[i][j-1]=0 then
begin
Bool_FieldIn:=Bool_FieldIn or (VID<vValue);
end;
end;
//Bool_FieldIn:=Bool_FieldIn and (VID<vValue);
end;
end;
end;
if i=0 then
begin
Bool_FieldOut:=Bool_FieldOut and Bool_FieldIn ;
end
else
begin
if ANDOR_FieldsOUT[i-1]=1 then
begin
Bool_FieldOut:=Bool_FieldOut and Bool_FieldIn ;
end
else if ANDOR_FieldsOUT[i-1]=0 then
begin
Bool_FieldOut:=Bool_FieldOut or Bool_FieldIn ;
end;
end;


end;

{以下测试时使用}
if Bool_FieldOut then
label1.caption:='111'
else
label1.caption:='000';
Vtest:='333';
end;

procedure TForm1.Button6Click(Sender: TObject);
const
//test01='(COMM=''999'' AND COMM=''96'' OR COMM=''999'') AND (Test_boolean=1 OR Test_boolean=0) OR (ID=666 AND ID=10000 AND ID=10111 OR ID=99)' ;
//test01='(ID=99 OR ID=666 AND ID=10000 AND ID=10111 OR ID=888) OR (COMM=''999'' OR COMM=''999'' AND COMM=''999'' OR COMM=''COM5'') AND (Test_boolean=1 OR Test_boolean=0)'
// +' AND (A01=888) AND (A02=888) OR (A03=888) OR (A04=888) AND (A05=8888)';
//CTerms='<,<,=,=,<,=,=,=,<,=,=,=,=,=,=,=';
test01='(ID=99 OR ID=666 AND ID=10000 AND ID=10111 OR ID=888) OR (COMM=''999'' OR COMM=''999'' AND COMM=''999'' OR COMM=''COM5'')'
+' AND (Test_boolean=1 OR Test_boolean=0)';
CTerms='<,<,=,=,<,=,=,=,<,=,<,';

var
Vtest,Vtest01,VtestSub,VtestSub01:string;
Bool_FieldOut,Bool_FieldIn:Boolean;
FieldWhereBool_TF:array[0..151] of Integer; //(COMM<''999'' AND COMM=''999'' OR COMM<''999'')的True或者False
pos_i,i,j,Pos_or,Pos_and,Pos_CurrOrAnd:Integer;
ANDOR_FieldsOUT:array[0..150] of Integer ; //OR为0 ,AND为1 //字段之间的 //(COMM<''999'' AND COMM=''999'' OR COMM<''999'') AND (Test_boolean=1 OR Test_boolean<0)
ANDOR_FieldsIN:array[0..150,0..9] of Integer ; //OR为0 ,AND为1 //单个字段的 //(COMM<''999'' AND COMM=''999'' OR COMM<''999'')
Where_FieldsOUT:array[0..151] of String ;
Where_FieldsIN:array[0..151,0..10] of String ;
vTerms:string;
TermsArray:array of string;
ArrayHaveValueCount:Integer; // ') OR (' 和 ') AND ('的总数量
TermsPos:Integer;//当前应该用哪个符号
VCOMM,VTest_boolean,VID:string;
vKeyValue,vKey,vValue:String;
begin
VID:='999';
VCOMM:='9999';
VTest_boolean:='-1';
vTerms:=CTerms;
Vtest:= test01;
ArrayHaveValueCount:=-1;
Vtest:=StringReplace(test01,'''''','',[rfReplaceAll]);
if Vtest='' then
Exit;
SetLength(TermsArray,1600);//Ceil(Length(CTerms)/2.0)
for i:=Low(TermsArray) to High(TermsArray) do
begin
pos_i:=Pos(',',vTerms);
TermsArray[i]:=Copy(vTerms,1,pos_i-1);
Delete(vTerms,1,pos_i);
//vTerms:=Copy(vTerms,3,1000);
end;
for i:=0 to 150 do
begin
FieldWhereBool_TF[i]:=-1;
ANDOR_FieldsOUT[i]:=-1;
for j:=0 to 9 do
begin
ANDOR_FieldsIN[i][j]:=-1;
end;
end;
FieldWhereBool_TF[151]:=-1;

//ANDOR_FieldsOUT
while Vtest<>'' do
begin
//Pos_or,Pos_and,Pos_CurrOrAnd
inc(ArrayHaveValueCount);
if Pos(') AND (',Vtest)>0 then
begin
pos_i:=Pos(') AND (',Vtest);
Vtest01:=Copy(Vtest,1,pos_i);
Vtest:=Copy(Vtest,pos_i+6,20000);
VtestSub:=Vtest01;
if Pos(') OR (',VtestSub)>0 then
begin
while VtestSub<>'' do
begin
pos_i:=Pos(') OR (',VtestSub);
if pos_i>0 then
begin
VtestSub01:=Copy(VtestSub,1,pos_i);
VtestSub:=Copy(VtestSub,pos_i+5,20000);
ANDOR_FieldsOUT[ArrayHaveValueCount]:=0;
Where_FieldsOUT[ArrayHaveValueCount]:=VtestSub01;
Inc(ArrayHaveValueCount);
end
else
begin
Vtest01:=VtestSub;
ANDOR_FieldsOUT[ArrayHaveValueCount]:=1;
VtestSub:='';//计算到最后要把这个置为空
end;

end;

end
else
begin
//Vtest:=Copy(Vtest,pos_i+6,20000);
ANDOR_FieldsOUT[ArrayHaveValueCount]:=1;
end;

end
else
if Pos(') OR (',Vtest)>0 then
begin
pos_i:=Pos(') OR (',Vtest);
Vtest01:=Copy(Vtest,1,pos_i);
Vtest:=Copy(Vtest,pos_i+5,20000);
ANDOR_FieldsOUT[ArrayHaveValueCount]:=0;
end
else
begin
Vtest01:=Vtest;

 

Vtest:='';//计算到最后要把这个置为空
end;
Where_FieldsOUT[ArrayHaveValueCount]:=Vtest01;
//Pos_or:=Pos(') OR (',Vtest);


{if Pos(') AND (',Vtest)>0 then
begin
pos_i:=Pos(') AND (',Vtest);
Vtest01:=Copy(Vtest,1,pos_i);
Vtest:=Copy(Vtest,pos_i+6,20000);
ANDOR_FieldsOUT[ArrayHaveValueCount]:=1;
end
else
if Pos(') OR (',Vtest)>0 then
begin
pos_i:=Pos(') OR (',Vtest);
Vtest01:=Copy(Vtest,1,pos_i);
Vtest:=Copy(Vtest,pos_i+5,20000);
ANDOR_FieldsOUT[ArrayHaveValueCount]:=0;
end
else
begin
Vtest01:=Vtest;

 

Vtest:='';//计算到最后要把这个置为空
end;
Where_FieldsOUT[ArrayHaveValueCount]:=Vtest01; }
end;
//Exit;

//ANDOR_FieldsIN
for i:=Low( Where_FieldsOUT) to High(Where_FieldsOUT) do
begin
Vtest:=Where_FieldsOUT[i];
if Vtest='' then
Break;
Delete(Vtest,1,1);//删除左括号
Vtest:=Copy(Vtest,1,Length(Vtest)-1); //删除右括号
ArrayHaveValueCount:=-1;
while Vtest<>'' do
begin
inc(ArrayHaveValueCount);
if Pos(' AND ',Vtest)>0 then
begin
pos_i:=Pos(' AND ',Vtest);
Vtest01:=Copy(Vtest,1,pos_i);
Vtest:=Copy(Vtest,pos_i+5,20000);
VtestSub:=Vtest01;
if Pos(' OR ',VtestSub)>0 then
begin
while VtestSub<>'' do
begin
pos_i:=Pos(' OR ',VtestSub);
if pos_i>0 then
begin
VtestSub01:=Copy(VtestSub,1,pos_i);
VtestSub:=Copy(VtestSub,pos_i+4,20000);
ANDOR_FieldsIN[i][ArrayHaveValueCount]:=0;
Where_FieldsIN[i][ArrayHaveValueCount]:=VtestSub01;
Inc(ArrayHaveValueCount);
end
else
begin
Vtest01:=VtestSub;
ANDOR_FieldsIN[i][ArrayHaveValueCount]:=1;
VtestSub:='';//计算到最后要把这个置为空
end;

end;

end
else
begin
//Vtest:=Copy(Vtest,pos_i+6,20000);
ANDOR_FieldsIN[i][ArrayHaveValueCount]:=1;
end;

end
else
if Pos(' OR ',Vtest)>0 then
begin
pos_i:=Pos(' OR ',Vtest);
Vtest01:=Copy(Vtest,1,pos_i);
Vtest:=Copy(Vtest,pos_i+4,20000);
ANDOR_FieldsIN[i][ArrayHaveValueCount]:=0;
end
else
begin
Vtest01:=Vtest;

 

Vtest:='';//计算到最后要把这个置为空
end;
Where_FieldsIN[i][ArrayHaveValueCount]:=Vtest01;
{
while Vtest<>'' do
begin
inc(ArrayHaveValueCount);

if Pos(' AND ',Vtest)>0 then
begin
pos_i:=Pos(' AND ',Vtest);
Vtest01:=Copy(Vtest,1,pos_i-1);
Vtest:=Copy(Vtest,pos_i+5,20000);
ANDOR_FieldsIN[i][ArrayHaveValueCount]:=1;
end
else
if Pos(' OR ',Vtest)>0 then
begin
pos_i:=Pos(' OR ',Vtest);
Vtest01:=Copy(Vtest,1,pos_i-1);
Vtest:=Copy(Vtest,pos_i+4,20000);
ANDOR_FieldsIN[i][ArrayHaveValueCount]:=0;
end
else
begin
Vtest01:=Vtest;

 

Vtest:='';//计算到最后要把这个置为空
end;
Where_FieldsIN[i][ArrayHaveValueCount]:=Vtest01;
end;
}

end;
end;

{
VCOMM:='999';
VTest_boolean:=-1;
VID:=66;
FieldWhereBool_TF
}
//循环判断所有的条件
Bool_FieldOut:=True;//初始化时为真
TermsPos:=-1;
for i:=0 to 151 do //栏位数
begin
if Where_FieldsOut[i]='' then
Break;
Bool_FieldIn:=True;//初始化时为真
for j:=0 to 10 do //单个栏位的逻辑运算个数
begin
if Where_FieldsIN[i][j]='' then
Break;
Inc(TermsPos);
pos_i:=pos('=',Where_FieldsIN[i][j]);
vKey:=Copy(Where_FieldsIN[i][j],1,pos_i-1);
vValue:=Copy(Where_FieldsIN[i][j],pos_i+1,300);
if vKey='COMM' then
begin
if TermsArray[TermsPos]='=' then
begin
if j=0 then
begin
Bool_FieldIn:=Bool_FieldIn and (VCOMM=vValue);
end
else
begin
if ANDOR_FieldsIN[i][j-1]=1 then
begin
Bool_FieldIn:=Bool_FieldIn and (VCOMM=vValue);
end
else if ANDOR_FieldsIN[i][j-1]=0 then
begin
Bool_FieldIn:=Bool_FieldIn or (VCOMM=vValue);
end;
end;
end
else if TermsArray[TermsPos]='<' then
begin
if j=0 then
begin
Bool_FieldIn:=Bool_FieldIn and (VCOMM<vValue);
end
else
begin
if ANDOR_FieldsIN[i][j-1]=1 then
begin
Bool_FieldIn:=Bool_FieldIn and (VCOMM<vValue);
end
else if ANDOR_FieldsIN[i][j-1]=0 then
begin
Bool_FieldIn:=Bool_FieldIn or (VCOMM<vValue);
end;
end;
end;
end
else if vKey='Test_boolean' then
begin
if TermsArray[TermsPos]='=' then
begin
if j=0 then
begin
Bool_FieldIn:=Bool_FieldIn and (VTest_boolean=vValue);
end
else
begin
if ANDOR_FieldsIN[i][j-1]=1 then
begin
Bool_FieldIn:=Bool_FieldIn and (VTest_boolean=vValue);
end
else if ANDOR_FieldsIN[i][j-1]=0 then
begin
Bool_FieldIn:=Bool_FieldIn or (VTest_boolean=vValue);
end;
end;
//Bool_FieldIn:=Bool_FieldIn and (VTest_boolean=vValue);
end
else if TermsArray[TermsPos]='<' then
begin
if j=0 then
begin
Bool_FieldIn:=Bool_FieldIn and (VTest_boolean<vValue);
end
else
begin
if ANDOR_FieldsIN[i][j-1]=1 then
begin
Bool_FieldIn:=Bool_FieldIn and (VTest_boolean<vValue);
end
else if ANDOR_FieldsIN[i][j-1]=0 then
begin
Bool_FieldIn:=Bool_FieldIn or (VTest_boolean<vValue);
end;
end;
//Bool_FieldIn:=Bool_FieldIn and (VTest_boolean<vValue);
end;
end
else if vKey='ID' then
begin
if TermsArray[TermsPos]='=' then
begin
if j=0 then
begin
Bool_FieldIn:=Bool_FieldIn and (VID=vValue);
end
else
begin
if ANDOR_FieldsIN[i][j-1]=1 then
begin
Bool_FieldIn:=Bool_FieldIn and (VID=vValue);
end
else if ANDOR_FieldsIN[i][j-1]=0 then
begin
Bool_FieldIn:=Bool_FieldIn or (VID=vValue);
end;
end;
//Bool_FieldIn:=Bool_FieldIn and (VID=vValue);
end
else if TermsArray[TermsPos]='<' then
begin
if j=0 then
begin
Bool_FieldIn:=Bool_FieldIn and (VID<vValue);
end
else
begin
if ANDOR_FieldsIN[i][j-1]=1 then
begin
Bool_FieldIn:=Bool_FieldIn and (VID<vValue);
end
else if ANDOR_FieldsIN[i][j-1]=0 then
begin
Bool_FieldIn:=Bool_FieldIn or (VID<vValue);
end;
end;
//Bool_FieldIn:=Bool_FieldIn and (VID<vValue);
end;
end;
end;
if i=0 then
begin
Bool_FieldOut:=Bool_FieldOut and Bool_FieldIn ;
end
else
begin
if ANDOR_FieldsOUT[i-1]=1 then
begin
Bool_FieldOut:=Bool_FieldOut and Bool_FieldIn ;
end
else if ANDOR_FieldsOUT[i-1]=0 then
begin
Bool_FieldOut:=Bool_FieldOut or Bool_FieldIn ;
end;
end;
end;

{以下测试时使用}
if Bool_FieldOut then
label1.caption:='111'
else
label1.caption:='000';
Vtest:='333';
end;

procedure TForm1.Button7Click(Sender: TObject);
const
//test01='(COMM=''999'' AND COMM=''96'' OR COMM=''999'') AND (Test_boolean=1 OR Test_boolean=0) OR (ID=666 AND ID=10000 AND ID=10111 OR ID=99)' ;
//test01='(ID=99 OR ID=666 AND ID=10000 AND ID=10111 OR ID=888) OR (COMM=''999'' OR COMM=''999'' AND COMM=''999'' OR COMM=''COM5'') AND (Test_boolean=1 OR Test_boolean=0)'
// +' AND (A01=888) AND (A02=888) OR (A03=888) OR (A04=888) AND (A05=8888)';
//CTerms='<,<,=,=,<,=,=,=,<,=,=,=,=,=,=,=';
test01='(ID=99 OR ID=666 AND ID=10000 AND ID=10111 OR ID=888) OR (COMM=''999'' OR COMM=''999'' AND COMM=''999'' OR COMM=''COM5'')'
+' AND (Test_boolean=1 OR Test_boolean=0)';
CTerms='<,<,=,=,<,=,=,=,<,=,<,';
//VID:='66';
//VCOMM:='9';
// VTest_boolean:='-1';

var
Vtest,Vtest01,VtestSub,VtestSub01:string;
Bool_FieldOut,Bool_FieldIn:Boolean;
//FieldWhereBoolOut_TF:array[0..151] of Integer; //(COMM<''999'' AND COMM=''999'' OR COMM<''999'')的True或者False
//FieldWhereBoolIn_TF:array[0..150,0..9] of Integer ;//(COMM<''999'' AND COMM=''999'' OR COMM<''999'')中的 COMM<''999''这个真假值
pos_i,i,j,Pos_or,Pos_and,Pos_CurrOrAnd:Integer;
ANDOR_FieldsOUT:array[0..150] of Integer ; //OR为0 ,AND为1 //字段之间的 //(COMM<''999'' AND COMM=''999'' OR COMM<''999'') AND (Test_boolean=1 OR Test_boolean<0)
ANDOR_FieldsIN:array[0..150,0..9] of Integer ; //OR为0 ,AND为1 //单个字段的 //(COMM<''999'' AND COMM=''999'' OR COMM<''999'')
Where_FieldsOUT:array[0..151] of String ;
Where_FieldsIN:array[0..151,0..10] of String ;
vTerms:string;
TermsArray:array of string;
ArrayHaveValueCount:Integer; // ') OR (' 和 ') AND ('的总数量
TermsPos:Integer;//当前应该用哪个符号
VCOMM,VTest_boolean,VID:string;
vKeyValue,vKey,vValue:String;
FieldWhereBoolOut_TFStr,FieldWhereBoolIn_TFStr:string;
FieldWhereBoolOut_ANDORStr,FieldWhereBoolIn_ANDORStr:string;
begin
{VID:='999';
VCOMM:='9999';
VTest_boolean:='-1'; }
VID:='66';
VCOMM:='9';
VTest_boolean:='-1';
vTerms:=CTerms;
Vtest:= test01;
ArrayHaveValueCount:=-1;
Vtest:=StringReplace(test01,'''''','',[rfReplaceAll]);
if Vtest='' then
Exit;
SetLength(TermsArray,1600);//Ceil(Length(CTerms)/2.0)
for i:=Low(TermsArray) to High(TermsArray) do
begin
pos_i:=Pos(',',vTerms);
TermsArray[i]:=Copy(vTerms,1,pos_i-1);
Delete(vTerms,1,pos_i);
//vTerms:=Copy(vTerms,3,1000);
end;
for i:=0 to 150 do
begin
//FieldWhereBoolOut_TF[i]:=-1;

ANDOR_FieldsOUT[i]:=-1;
for j:=0 to 9 do
begin
ANDOR_FieldsIN[i][j]:=-1;
//FieldWhereBoolIn_TF[i][j]:=-1;
end;
end;
//FieldWhereBoolOut_TF[151]:=-1;

//ANDOR_FieldsOUT
while Vtest<>'' do
begin
//Pos_or,Pos_and,Pos_CurrOrAnd
inc(ArrayHaveValueCount);
if Pos(') AND (',Vtest)>0 then
begin
pos_i:=Pos(') AND (',Vtest);
Vtest01:=Copy(Vtest,1,pos_i);
Vtest:=Copy(Vtest,pos_i+6,20000);
VtestSub:=Vtest01;
if Pos(') OR (',VtestSub)>0 then
begin
while VtestSub<>'' do
begin
pos_i:=Pos(') OR (',VtestSub);
if pos_i>0 then
begin
VtestSub01:=Copy(VtestSub,1,pos_i);
VtestSub:=Copy(VtestSub,pos_i+5,20000);
ANDOR_FieldsOUT[ArrayHaveValueCount]:=0;
Where_FieldsOUT[ArrayHaveValueCount]:=VtestSub01;
Inc(ArrayHaveValueCount);
end
else
begin
Vtest01:=VtestSub;
ANDOR_FieldsOUT[ArrayHaveValueCount]:=1;
VtestSub:='';//计算到最后要把这个置为空
end;

end;

end
else
begin
//Vtest:=Copy(Vtest,pos_i+6,20000);
ANDOR_FieldsOUT[ArrayHaveValueCount]:=1;
end;

end
else
if Pos(') OR (',Vtest)>0 then
begin
pos_i:=Pos(') OR (',Vtest);
Vtest01:=Copy(Vtest,1,pos_i);
Vtest:=Copy(Vtest,pos_i+5,20000);
ANDOR_FieldsOUT[ArrayHaveValueCount]:=0;
end
else
begin
Vtest01:=Vtest;

 

Vtest:='';//计算到最后要把这个置为空
end;
Where_FieldsOUT[ArrayHaveValueCount]:=Vtest01;
//Pos_or:=Pos(') OR (',Vtest);


{if Pos(') AND (',Vtest)>0 then
begin
pos_i:=Pos(') AND (',Vtest);
Vtest01:=Copy(Vtest,1,pos_i);
Vtest:=Copy(Vtest,pos_i+6,20000);
ANDOR_FieldsOUT[ArrayHaveValueCount]:=1;
end
else
if Pos(') OR (',Vtest)>0 then
begin
pos_i:=Pos(') OR (',Vtest);
Vtest01:=Copy(Vtest,1,pos_i);
Vtest:=Copy(Vtest,pos_i+5,20000);
ANDOR_FieldsOUT[ArrayHaveValueCount]:=0;
end
else
begin
Vtest01:=Vtest;

 

Vtest:='';//计算到最后要把这个置为空
end;
Where_FieldsOUT[ArrayHaveValueCount]:=Vtest01; }
end;
//Exit;

//ANDOR_FieldsIN
for i:=Low( Where_FieldsOUT) to High(Where_FieldsOUT) do
begin
Vtest:=Where_FieldsOUT[i];
if Vtest='' then
Break;
Delete(Vtest,1,1);//删除左括号
Vtest:=Copy(Vtest,1,Length(Vtest)-1); //删除右括号
ArrayHaveValueCount:=-1;
while Vtest<>'' do
begin
inc(ArrayHaveValueCount);
if Pos(' AND ',Vtest)>0 then
begin
pos_i:=Pos(' AND ',Vtest);
Vtest01:=Copy(Vtest,1,pos_i);
Vtest:=Copy(Vtest,pos_i+5,20000);
VtestSub:=Vtest01;
if Pos(' OR ',VtestSub)>0 then
begin
while VtestSub<>'' do
begin
pos_i:=Pos(' OR ',VtestSub);
if pos_i>0 then
begin
VtestSub01:=Copy(VtestSub,1,pos_i);
VtestSub:=Copy(VtestSub,pos_i+4,20000);
ANDOR_FieldsIN[i][ArrayHaveValueCount]:=0;
Where_FieldsIN[i][ArrayHaveValueCount]:=VtestSub01;
Inc(ArrayHaveValueCount);
end
else
begin
Vtest01:=VtestSub;
ANDOR_FieldsIN[i][ArrayHaveValueCount]:=1;
VtestSub:='';//计算到最后要把这个置为空
end;

end;

end
else
begin
//Vtest:=Copy(Vtest,pos_i+6,20000);
ANDOR_FieldsIN[i][ArrayHaveValueCount]:=1;
end;

end
else
if Pos(' OR ',Vtest)>0 then
begin
pos_i:=Pos(' OR ',Vtest);
Vtest01:=Copy(Vtest,1,pos_i);
Vtest:=Copy(Vtest,pos_i+4,20000);
ANDOR_FieldsIN[i][ArrayHaveValueCount]:=0;
end
else
begin
Vtest01:=Vtest;

 

Vtest:='';//计算到最后要把这个置为空
end;
Where_FieldsIN[i][ArrayHaveValueCount]:=Vtest01;
{
while Vtest<>'' do
begin
inc(ArrayHaveValueCount);

if Pos(' AND ',Vtest)>0 then
begin
pos_i:=Pos(' AND ',Vtest);
Vtest01:=Copy(Vtest,1,pos_i-1);
Vtest:=Copy(Vtest,pos_i+5,20000);
ANDOR_FieldsIN[i][ArrayHaveValueCount]:=1;
end
else
if Pos(' OR ',Vtest)>0 then
begin
pos_i:=Pos(' OR ',Vtest);
Vtest01:=Copy(Vtest,1,pos_i-1);
Vtest:=Copy(Vtest,pos_i+4,20000);
ANDOR_FieldsIN[i][ArrayHaveValueCount]:=0;
end
else
begin
Vtest01:=Vtest;

 

Vtest:='';//计算到最后要把这个置为空
end;
Where_FieldsIN[i][ArrayHaveValueCount]:=Vtest01;
end;
}

end;
end;

{
VCOMM:='999';
VTest_boolean:=-1;
VID:=66;
FieldWhereBool_TF
}
//循环判断所有的条件
//Bool_FieldOut:=True;//初始化时为真

//FieldWhereBoolOut_TFStr,FieldWhereBoolIn_TFStr:string;
//FieldWhereBoolOut_ANDORStr,FieldWhereBoolIn_ANDORStr:string;
Memo1.Clear;
TermsPos:=-1;
FieldWhereBoolOut_TFStr:='';
FieldWhereBoolOut_ANDORStr:='';
for i:=0 to 151 do //栏位数
begin
if Where_FieldsOut[i]='' then
Break;
Bool_FieldIn:=True;//初始化时为真
FieldWhereBoolIn_TFStr:='';
FieldWhereBoolIn_ANDORStr:='';
for j:=0 to 10 do //单个栏位的逻辑运算个数
begin
if Where_FieldsIN[i][j]='' then
Break;
Inc(TermsPos);
pos_i:=pos('=',Where_FieldsIN[i][j]);
vKey:=Copy(Where_FieldsIN[i][j],1,pos_i-1);
vValue:=Copy(Where_FieldsIN[i][j],pos_i+1,300);
if vKey='COMM' then
begin
if TermsArray[TermsPos]='=' then
begin
if j=0 then
begin
if VCOMM=vValue then
FieldWhereBoolIn_TFStr:=FieldWhereBoolIn_TFStr+'1'
else
FieldWhereBoolIn_TFStr:=FieldWhereBoolIn_TFStr+'0';
//Bool_FieldIn:=Bool_FieldIn and (VCOMM=vValue);
end
else
begin
FieldWhereBoolIn_ANDORStr:=FieldWhereBoolIn_ANDORStr+Inttostr(ANDOR_FieldsIN[i][j-1]);
if VCOMM=vValue then
FieldWhereBoolIn_TFStr:=FieldWhereBoolIn_TFStr+'1'
else
FieldWhereBoolIn_TFStr:=FieldWhereBoolIn_TFStr+'0';
end;
end
else if TermsArray[TermsPos]='<' then
begin
if j=0 then
begin
if VCOMM<vValue then
FieldWhereBoolIn_TFStr:=FieldWhereBoolIn_TFStr+'1'
else
FieldWhereBoolIn_TFStr:=FieldWhereBoolIn_TFStr+'0';
//Bool_FieldIn:=Bool_FieldIn and (VCOMM=vValue);
end
else
begin
FieldWhereBoolIn_ANDORStr:=FieldWhereBoolIn_ANDORStr+Inttostr(ANDOR_FieldsIN[i][j-1]);
if VCOMM<vValue then
FieldWhereBoolIn_TFStr:=FieldWhereBoolIn_TFStr+'1'
else
FieldWhereBoolIn_TFStr:=FieldWhereBoolIn_TFStr+'0';
end;
{if j=0 then
begin
Bool_FieldIn:=Bool_FieldIn and (VCOMM<vValue);
end
else
begin
if ANDOR_FieldsIN[i][j-1]=1 then
begin
Bool_FieldIn:=Bool_FieldIn and (VCOMM<vValue);
end
else if ANDOR_FieldsIN[i][j-1]=0 then
begin
Bool_FieldIn:=Bool_FieldIn or (VCOMM<vValue);
end;
end; }
end;
end
else if vKey='Test_boolean' then
begin
if TermsArray[TermsPos]='=' then
begin
if j=0 then
begin
if VTest_boolean=vValue then
FieldWhereBoolIn_TFStr:=FieldWhereBoolIn_TFStr+'1'
else
FieldWhereBoolIn_TFStr:=FieldWhereBoolIn_TFStr+'0';
//Bool_FieldIn:=Bool_FieldIn and (VCOMM=vValue);
end
else
begin
FieldWhereBoolIn_ANDORStr:=FieldWhereBoolIn_ANDORStr+Inttostr(ANDOR_FieldsIN[i][j-1]);
if VTest_boolean=vValue then
FieldWhereBoolIn_TFStr:=FieldWhereBoolIn_TFStr+'1'
else
FieldWhereBoolIn_TFStr:=FieldWhereBoolIn_TFStr+'0';
end;
{if j=0 then
begin
Bool_FieldIn:=Bool_FieldIn and (VTest_boolean=vValue);
end
else
begin
if ANDOR_FieldsIN[i][j-1]=1 then
begin
Bool_FieldIn:=Bool_FieldIn and (VTest_boolean=vValue);
end
else if ANDOR_FieldsIN[i][j-1]=0 then
begin
Bool_FieldIn:=Bool_FieldIn or (VTest_boolean=vValue);
end;
end;

//Bool_FieldIn:=Bool_FieldIn and (VTest_boolean=vValue);
}
end
else if TermsArray[TermsPos]='<' then
begin
if j=0 then
begin
if VTest_boolean<vValue then
FieldWhereBoolIn_TFStr:=FieldWhereBoolIn_TFStr+'1'
else
FieldWhereBoolIn_TFStr:=FieldWhereBoolIn_TFStr+'0';
//Bool_FieldIn:=Bool_FieldIn and (VCOMM=vValue);
end
else
begin
FieldWhereBoolIn_ANDORStr:=FieldWhereBoolIn_ANDORStr+Inttostr(ANDOR_FieldsIN[i][j-1]);
if VTest_boolean<vValue then
FieldWhereBoolIn_TFStr:=FieldWhereBoolIn_TFStr+'1'
else
FieldWhereBoolIn_TFStr:=FieldWhereBoolIn_TFStr+'0';
end;
{if j=0 then
begin
Bool_FieldIn:=Bool_FieldIn and (VTest_boolean<vValue);
end
else
begin
if ANDOR_FieldsIN[i][j-1]=1 then
begin
Bool_FieldIn:=Bool_FieldIn and (VTest_boolean<vValue);
end
else if ANDOR_FieldsIN[i][j-1]=0 then
begin
Bool_FieldIn:=Bool_FieldIn or (VTest_boolean<vValue);
end;
end;
//Bool_FieldIn:=Bool_FieldIn and (VTest_boolean<vValue);
}
end;
end
else if vKey='ID' then
begin
if TermsArray[TermsPos]='=' then
begin
if j=0 then
begin
if VID=vValue then
FieldWhereBoolIn_TFStr:=FieldWhereBoolIn_TFStr+'1'
else
FieldWhereBoolIn_TFStr:=FieldWhereBoolIn_TFStr+'0';
//Bool_FieldIn:=Bool_FieldIn and (VCOMM=vValue);
end
else
begin
FieldWhereBoolIn_ANDORStr:=FieldWhereBoolIn_ANDORStr+Inttostr(ANDOR_FieldsIN[i][j-1]);
if VID=vValue then
FieldWhereBoolIn_TFStr:=FieldWhereBoolIn_TFStr+'1'
else
FieldWhereBoolIn_TFStr:=FieldWhereBoolIn_TFStr+'0';
end;
{if j=0 then
begin
Bool_FieldIn:=Bool_FieldIn and (VID=vValue);
end
else
begin
if ANDOR_FieldsIN[i][j-1]=1 then
begin
Bool_FieldIn:=Bool_FieldIn and (VID=vValue);
end
else if ANDOR_FieldsIN[i][j-1]=0 then
begin
Bool_FieldIn:=Bool_FieldIn or (VID=vValue);
end;
end;
//Bool_FieldIn:=Bool_FieldIn and (VID=vValue);
}
end
else if TermsArray[TermsPos]='<' then
begin
if j=0 then
begin
if VID<vValue then
FieldWhereBoolIn_TFStr:=FieldWhereBoolIn_TFStr+'1'
else
FieldWhereBoolIn_TFStr:=FieldWhereBoolIn_TFStr+'0';
//Bool_FieldIn:=Bool_FieldIn and (VCOMM=vValue);
end
else
begin
FieldWhereBoolIn_ANDORStr:=FieldWhereBoolIn_ANDORStr+Inttostr(ANDOR_FieldsIN[i][j-1]);
if VID<vValue then
FieldWhereBoolIn_TFStr:=FieldWhereBoolIn_TFStr+'1'
else
FieldWhereBoolIn_TFStr:=FieldWhereBoolIn_TFStr+'0';
end;
{if j=0 then
begin
Bool_FieldIn:=Bool_FieldIn and (VID<vValue);
end
else
begin
if ANDOR_FieldsIN[i][j-1]=1 then
begin
Bool_FieldIn:=Bool_FieldIn and (VID<vValue);
end
else if ANDOR_FieldsIN[i][j-1]=0 then
begin
Bool_FieldIn:=Bool_FieldIn or (VID<vValue);
end;
end;
//Bool_FieldIn:=Bool_FieldIn and (VID<vValue); }
end;
end;
end;
Memo1.Lines.Add('ANDOR:'+FieldWhereBoolIn_ANDORStr+' WhereValue:'+FieldWhereBoolIn_TFStr);


if i=0 then
begin
if GetWhereANDORBool(FieldWhereBoolIn_ANDORStr,FieldWhereBoolIn_TFStr) then
FieldWhereBoolOut_TFStr:=FieldWhereBoolOut_TFStr+'1'
else
FieldWhereBoolOut_TFStr:=FieldWhereBoolOut_TFStr+'0';
//Bool_FieldIn:=Bool_FieldIn and (VCOMM=vValue);
end
else
begin
FieldWhereBoolOut_ANDORStr:=FieldWhereBoolOut_ANDORStr+Inttostr(ANDOR_FieldsOUT[i-1]);
if GetWhereANDORBool(FieldWhereBoolIn_ANDORStr,FieldWhereBoolIn_TFStr) then
FieldWhereBoolOut_TFStr:=FieldWhereBoolOut_TFStr+'1'
else
FieldWhereBoolOut_TFStr:=FieldWhereBoolOut_TFStr+'0';
end;
{if i=0 then
begin
Bool_FieldOut:=Bool_FieldOut and Bool_FieldIn ;
end
else
begin
if ANDOR_FieldsOUT[i-1]=1 then
begin
Bool_FieldOut:=Bool_FieldOut and Bool_FieldIn ;
end
else if ANDOR_FieldsOUT[i-1]=0 then
begin
Bool_FieldOut:=Bool_FieldOut or Bool_FieldIn ;
end;
end; }
end;
Memo1.Lines.Add('------------------------------------------------------');
Memo1.Lines.Add('ANDOR:'+FieldWhereBoolOut_ANDORStr+' WhereValue:'+FieldWhereBoolOut_TFStr);

{以下测试时使用}
if GetWhereANDORBool(FieldWhereBoolOut_ANDORStr,FieldWhereBoolOut_TFStr) then
label1.caption:='真'
else
label1.caption:='假';
Vtest:='333';
end;

function TForm1.GetWhereANDORBool(WhereANDORStr,
WhereTFStr: string): Boolean;
var
vStringMast,vValueString,ANDORString:string;
ANDORS,vStringValues:array of Integer;
ANDORCount,i:Integer;
TF_AND,TF_OR,TF_ANDOR,TF_ANDORCurr,TF_ANDORNext:Integer;//0和1代表的是False和True
ANDORCurr,ANDORNext:Integer;//0和1代表的是OR和AND//ANDORPrevious
begin
Result:=False;
if WhereTFStr='' then
Exit;

if (WhereANDORStr='') then
begin
Result:=WhereTFStr='1';
Exit;
end;
vValueString:=WhereTFStr;
ANDORString:=WhereANDORStr ;

ANDORCount:=Length(ANDORString);
SetLength(ANDORS,ANDORCount);
SetLength(vStringValues,ANDORCount+1);
for i:=0 to ANDORCount-1 do
begin
ANDORS[i]:=StrToInt(ANDORString[i+1]);
vStringValues[i]:=StrToInt(vValueString[i+1]);
end;
//vStringValues元素比 ANDORS多一个
vStringValues[ANDORCount]:=StrToInt(vValueString[ANDORCount+1]);

//ANDORPrevious:=-1;
if ANDORCount<2 then //只有一个AND或者OR的时候
begin
if ANDORS[0]=1 then
begin
TF_ANDOR:=vStringValues[0] and vStringValues[1];
end
else //当前是OR
begin
TF_ANDOR:=vStringValues[0] or vStringValues[1]
end;
Result:=TF_ANDOR=1;
Exit;
end;
TF_AND:=-1;
TF_OR:=-1;
TF_ANDOR:=1;
TF_ANDORCurr:=-1;
TF_ANDORNext:=-1;
//TF_ANDORPrevious:=-1;
ANDORCurr:=-1;
ANDORNext:=-1;
for i:=0 to ANDORCount-1 do //ANDORS循环
begin

ANDORCurr:=ANDORS[i]; //当前操作的ANDOR
if i=0 then
begin
ANDORNext:=ANDORS[i+1];
if ANDORCurr=1 then
begin
TF_ANDOR:=vStringValues[i] and vStringValues[i+1];
end
else //当前是OR
begin
if ANDORCurr=ANDORNext then //下一个也是OR
begin
TF_ANDOR:=vStringValues[i] or vStringValues[i+1];
end
else//下一个是AND
begin
TF_OR:=vStringValues[i];
end;
end;
end
else if i<>ANDORCount-1 then //ANDORCurr不是最后一个
begin
ANDORNext:=ANDORS[i+1];
TF_ANDORCurr:=vStringValues[i];
TF_ANDORNext:=vStringValues[i+1];
if ANDORCurr=ANDORNext then
begin
if ANDORCurr=1 then //当前操作的是AND
begin
if TF_OR>-1 then //保存真假值
begin
if TF_AND>-1 then//有值了
begin
TF_AND:= TF_AND and TF_ANDORNext;
end
else
begin
TF_AND:=TF_ANDORCurr and TF_ANDORNext;
end;
end
else
begin
TF_ANDOR:=TF_ANDOR and TF_ANDORNext;
end;

end
else
begin
TF_ANDOR:=TF_ANDOR or TF_ANDORNext;
end;
end
else
begin
if ANDORCurr=1 then //当前是AND
begin
if TF_OR>-1 then //上一个有保存
begin
//if then
TF_AND:= TF_AND and TF_ANDORNext;
TF_ANDOR:=TF_OR or TF_AND;
TF_OR:=-1;
TF_AND:=-1;
end
else
begin
TF_ANDOR:=TF_ANDOR and TF_ANDORNext;
end;
end
else//当前的OR
begin
TF_OR:=TF_ANDOR;//TF_ANDORCurr;
end;
end;
end
else //最后一个ANDOR的处理
begin
ANDORNext:=-1;
if ANDORCurr=1 then
begin
if TF_OR>-1 then //上一个有保存
begin
if TF_AND>-1 then
begin
TF_AND:= TF_AND and vStringValues[i+1];
TF_ANDOR:=TF_OR or TF_AND;
TF_OR:=-1;
TF_AND:=-1;
end
else
begin
TF_AND:=vStringValues[i] and vStringValues[i+1];
TF_ANDOR:=TF_OR or TF_AND;
TF_OR:=-1;
TF_AND:=-1;
end;
end
else
begin
//这个不存在的
end;
end
else
begin
TF_ANDOR:=TF_ANDOR or vStringValues[i+1];
end;
end;
end;
Result:= TF_ANDOR=1;
{if TF_ANDOR=1 then
Label1.Caption:='真'
else
Label1.Caption:='假'; }
end;

end.

--------------Form

object Form1: TForm1
Left = 644
Top = 544
Width = 784
Height = 368
Caption = 'Form1'
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'MS Sans Serif'
Font.Style = []
OldCreateOrder = False
PixelsPerInch = 96
TextHeight = 13
object Label1: TLabel
Left = 24
Top = 120
Width = 89
Height = 13
AutoSize = False
Caption = 'Label1'
end
object Button1: TButton
Left = 16
Top = 0
Width = 75
Height = 25
Caption = 'Button1'
TabOrder = 0
OnClick = Button1Click
end
object Button2: TButton
Left = 16
Top = 32
Width = 75
Height = 25
Caption = 'Button2'
TabOrder = 1
OnClick = Button2Click
end
object Button3: TButton
Left = 16
Top = 64
Width = 75
Height = 25
Caption = 'Button3'
TabOrder = 2
OnClick = Button3Click
end
object Button4: TButton
Left = 176
Top = 32
Width = 75
Height = 25
Caption = 'Button4'
TabOrder = 3
OnClick = Button4Click
end
object Edit1: TEdit
Left = 152
Top = 8
Width = 121
Height = 21
ImeName = '中文(简体) - 搜狗拼音输入法'
TabOrder = 4
Text = 'Edit1'
end
object Button5: TButton
Left = 16
Top = 136
Width = 75
Height = 25
Caption = 'Button5'
TabOrder = 5
OnClick = Button5Click
end
object Button6: TButton
Left = 112
Top = 136
Width = 75
Height = 25
Caption = 'Button6'
TabOrder = 6
OnClick = Button6Click
end
object Button7: TButton
Left = 80
Top = 184
Width = 75
Height = 25
Caption = 'Button7'
TabOrder = 7
OnClick = Button7Click
end
object Memo1: TMemo
Left = 312
Top = 8
Width = 409
Height = 305
ImeName = '中文(简体) - 搜狗拼音输入法'
ScrollBars = ssBoth
TabOrder = 8
end
end

 

posted on 2021-02-24 19:07  码农的笔记  阅读(54)  评论(0编辑  收藏  举报