来个简单的,复杂需变化的自已动脑筋! 说明: 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;
响应每个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事件
回复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;
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;
如果: Content:='select * from 产品采购表' 不加条件1=1 随便你在一个EDIT中输入值,SQL语句就会变成:select * from 产品采购表 and 字段=值 {-------出错--------} 但: Content:='select * from 产品采购表 where 1=1' 随便你在一个EDIT中输入值,SQL语句就会变成:select * from 产品采购表 where 1=1 and 字段=值{----------不会出错}
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;这样会简洁一些,特别是调用查询较多的时候。
说明:
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;
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事件
?????这个是什么?如果改成这样的代码,有什么问题吗?
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;
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;
Content:='select * from 产品采购表' 不加条件1=1
随便你在一个EDIT中输入值,SQL语句就会变成:select * from 产品采购表 and 字段=值 {-------出错--------} 但:
Content:='select * from 产品采购表 where 1=1'
随便你在一个EDIT中输入值,SQL语句就会变成:select * from 产品采购表 where 1=1 and 字段=值{----------不会出错}
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;这样会简洁一些,特别是调用查询较多的时候。