下面是我写的一段程序,要实现在combobox中输入东西之后,自动从数据库中找出与输入内容相关的东西,显示在combobox的下来菜单中,通过设置dropdpwn:=true 使菜单自动产生,但是选中下拉菜单中的某项之后,combobox中的内容就被清空,始终显示不了想选中的内容,请大家给知道一下,最好各位尝试之后正确了在回答,谢谢。
procedure TForm3.ComboBox1Change(Sender: TObject);
var
i:integer;
str:string;
begin
str:=combobox1.Text;
combobox1.Items.Clear;
with dm.ADOQuery1 do
begin
Close;
SQL.Clear;
SQL.Add('select * from xue where index like '''+'%'+str+'%'+'''');
Open;
end;
while not(dm.ADOQuery1.Eof) do
begin
combobox1.Items.Add(dm.ADOQuery1.Fields[1].AsString);
dm.ADOQuery1.Next ;
end;
end;
procedure TForm3.ComboBox1Change(Sender: TObject);
var
i:integer;
str:string;
begin
str:=combobox1.Text;
combobox1.Items.Clear;
with dm.ADOQuery1 do
begin
Close;
SQL.Clear;
SQL.Add('select * from xue where index like '''+'%'+str+'%'+'''');
Open;
end;
while not(dm.ADOQuery1.Eof) do
begin
combobox1.Items.Add(dm.ADOQuery1.Fields[1].AsString);
dm.ADOQuery1.Next ;
end;
end;
Shift: TShiftState);
var
i:integer;
str:string;
begin
if key=VK_RETURN then begin
str:=combobox1.Text;
if trim(str)<>'' then begin
combobox1.Items.Clear;
with dm.ADOQuery1 do begin
Close;
SQL.text:='select * from xue where index like '''+'%'+str+'%'+'''';
Open;
while not eof do begin
combobox1.Items.Add(Fields[1].AsString);
Next ;
end;
end;
ComboBox1.Text:='';
end; end;
end;
1、AutoDropDown 属性:一键一提示;
2、OnChange 方法:当Text属性发生改变时,所触发的事件;
3、当 ComboBox1.Items.Clear; 以后,ComboBox1 下拉列表中的所有值都被清空,当重新填充后,也就没有被选中的内容了。
按照楼主的代码意思,只要在最后一句加上:
procedure TForm3.ComboBox1Change(Sender: TObject);
var
i:integer;
str:string;
begin
str:=combobox1.Text;
combobox1.Items.Clear;
with dm.ADOQuery1 do
begin
Close;
SQL.Clear;
SQL.Add('select * from xue where index like '''+'%'+str+'%'+'''');
Open;
end;
while not(dm.ADOQuery1.Eof) do
begin
combobox1.Items.Add(dm.ADOQuery1.Fields[1].AsString);
dm.ADOQuery1.Next ;
end;
dm.ADOQuery1.Close;
ComboBox1.Text:= str;end;
就可以了。
我感觉,楼主使用 OnExit 方法会更好一些.否则,每发生一次改变(输入或删除一个字符)都要去执行 OnChange 过程,岂不...
OnExit 方法:当控件失去焦点时发生.
改用KeyDown事件.
你想在combobox的onchange事件中实现,你没有想过,在你的代码中
while not(dm.ADOQuery1.Eof) do
begin
combobox1.Items.Add(dm.ADOQuery1.Fields[1].AsString);
dm.ADOQuery1.Next ;
end; 当代码执行时是没有问题的,但当其执行到我标识的这行时,会向combobox1中加入到你符后条件的信息,
问题就出在这里,这时又会触发onchange事件,所以这时就会继续反复执行下面的代码,这样直到你执行到
dm.ADOQuery1.Eof时,才会真正的退出来,结果肯定是combobox1被清空了
str:=combobox1.Text;
combobox1.Items.Clear;
with dm.ADOQuery1 do
begin
Close;
SQL.Clear;
SQL.Add('select * from xue where index like '''+'%'+str+'%'+'''');
......
2、OnChange 方法:当Text属性发生改变时,也不会触发的;
不信 你可以试试 combobox1.text:='我来测试了';会不会触发