zoukankan      html  css  js  c++  java
  • DBGrid的字体颜色用户自定义之模拟条件的判断(近似的实现,都是测试代码)

    ---------上篇

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

     以下为此篇内容

    【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

  • 相关阅读:
    WCF+EntityFramework+mysql总结
    实现Win7远程桌面关机和重启
    EF 4.1 一些操作
    Ado.net利用反射执行SQL得到实体
    .net IL 指令速查
    VS2010 /VC/bin/rcdll.dll 无法找到资源编译器
    Win7下 httpRequest带证书请求https网站
    VS2010 自动关闭的问题解决方法
    Android 之 悬浮窗口
    论 Java 中获取一组不重复的随机数之性能问题
  • 原文地址:https://www.cnblogs.com/dmqhjp/p/14443278.html
Copyright © 2011-2022 走看看