界面如下:
label1  edit1          label2  edit2
label4  edit4          label3  edit3 
我想请教各位大侠,只要其中一个文本框中有输入查询条件就可以进行查询,也可以输入两个,三个,或者四个,这样的查询要如何实现呢?

解决方案 »

  1.   

    来个简单的,复杂需变化的自已动脑筋!
    说明:
    edit1代表字段x_a
    edit2代表字段x_b
    edit3代表字段x_c
    edit4代表字段 x_dprocedure TForm1.Button1Click(Sender: TObject);
    const str='select * from x_eng where 1=1';
    var
    s1,s2,s3,s4:string;
    begin if trim(edit1.Text)<>'' then s1:=' and x_a='+QuotedStr(trim(edit1.Text)) else s1:='';
     if trim(edit2.Text)<>'' then s2:=' and x_b='+QuotedStr(trim(edit2.Text)) else s2:='';
     if trim(edit3.Text)<>'' then s3:=' and x_c='+QuotedStr(trim(edit3.Text)) else s3:='';
     if trim(edit4.Text)<>'' then s4:=' and x_d='+QuotedStr(trim(edit4.Text)) else s4:=''; if (s1<>'') or (s2<>'') or (s3<>'') or (s4<>'') then
     with adoquery1 do begin
      close;
      sql.Text:=str+s1+s2+s3+4;
      open;
     end;end;
      

  2.   

    响应每个EDIT的ONKEYPRESS事件,如果在EDIT里按回车键就开始查询,查询条件就是将所有EDIT里的内容作为查询条件就行了,也可以只写一个EDIT的ONKEYPRESS事件,其他EDIT按回车键时就自动响应这个EDIT的ONKEYPRESS事件就行了。
    procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
    begin
      if key in[#13] then
      with query1 do
      begin
        active:=false;
        if trim(EDIT1.text)<>'' then
          parambyname('a').asstring:=trim(edit1.text)
        else
          parambyname('a').asstring:='%';
        if trim(EDIT2.text)<>'' then
          parambyname('b').asstring:=trim(edit2.text)
        else
          parambyname('b').asstring:='%';
        if trim(EDIT3.text)<>'' then
          parambyname('c').asstring:=trim(edit3.text)
        else
          parambyname('c').asstring:='%';
        active:=true; 
      end;
    end;  然后让其他EDIT的ONKEYPRESS响应EDIT1的ONKEYPRESS事件
      

  3.   

    回复GDTOPONE: str='select * from x_eng where 1=1';
    ?????这个是什么?如果改成这样的代码,有什么问题吗?
    procedure TForm1.Button1Click(Sender: TObject);
    var
    s1,s2,s3,s4:string;
    Content   :   string;
    begin if trim(edit1.Text)<>'' then s1:=' and x_a='+QuotedStr(trim(edit1.Text)) else s1:='';
     if trim(edit2.Text)<>'' then s2:=' and x_b='+QuotedStr(trim(edit2.Text)) else s2:='';
     if trim(edit3.Text)<>'' then s3:=' and x_c='+QuotedStr(trim(edit3.Text)) else s3:='';
     if trim(edit4.Text)<>'' then s4:=' and x_d='+QuotedStr(trim(edit4.Text)) else s4:=''; if (s1<>'') or (s2<>'') or (s3<>'') or (s4<>'') then
     ADOQuery1.Close;
            Content:='select * from 产品采购表 where   ';
        ADOQuery1.SQL.Clear;
        ADOQuery1.SQL.Add(Content+s1+s2+s3+s4);
        ADOQuery1.Open; 
     end;end;
      

  4.   


    procedure TForm1.Button1Click(Sender: TObject);
    var
    s1,s2,s3,s4:string;
    Content:string;
    begin if trim(edit1.Text) <>'' then s1:=' and x_a like '+QuotedStr('%'+trim(edit1.Text)+'%') else s1:='';
     if trim(edit2.Text) <>'' then s2:=' and x_b like '+QuotedStr('%'+trim(edit2.Text)+'%') else s2:='';
     if trim(edit3.Text) <>'' then s3:=' and x_c like '+QuotedStr('%'+trim(edit3.Text)+'%') else s3:='';
     if trim(edit4.Text) <>'' then s4:=' and x_d like '+QuotedStr('%'+trim(edit4.Text)+'%') else s4:=''; if (s1 <>'') or (s2 <>'') or (s3 <>'') or (s4 <>'') then  begin   with adoquery1 do begin
         Content:='select * from 产品采购表 where 1=1';
         Close;
         sql.Text:=Content+s1+s2+s3+s4;
         open;
       end; end;end;
      

  5.   

    如果:
    Content:='select * from 产品采购表' 不加条件1=1
    随便你在一个EDIT中输入值,SQL语句就会变成:select * from 产品采购表 and 字段=值 {-------出错--------} 但:
    Content:='select * from 产品采购表 where 1=1'
    随便你在一个EDIT中输入值,SQL语句就会变成:select * from 产品采购表 where 1=1 and 字段=值{----------不会出错}
      

  6.   

    GDTOPONE 的意见是正确的,如果是想编辑框回车时触发查询,按 sa036的方法就可以了;如果想编辑框内容一变化就做查询的话,
    procedure TForm1.Edit1OnChange(Sender: TObject; var Key: Char); 
    begin 
    //
    end;另外建议查询写一方法:
    procedure TForm1.Search;
    begin
    //
    end;这样编辑框内容变化时,直接调用Search方法就可以了:
    procedure TForm1.Edit1OnChange(Sender: TObject; var Key: Char); 
    begin 
      Search;
    end;procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char); 
    begin 
      if key in[#13] then 
        Search;
    end;这样会简洁一些,特别是调用查询较多的时候。