下面是我写的一段程序,要实现在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; 

解决方案 »

  1.   

    {用错事件了你}procedure TForm1.ComboBox1KeyDown(Sender: TObject; var Key: Word;
      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;
      

  2.   

    在ComboBox1中输入完后你按下回车试试
      

  3.   

    看来楼主对TComboBox控件在使用上有误区:
    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; 
    就可以了。
      

  4.   

    接上:
       我感觉,楼主使用 OnExit 方法会更好一些.否则,每发生一次改变(输入或删除一个字符)都要去执行 OnChange 过程,岂不...
    OnExit 方法:当控件失去焦点时发生.
      

  5.   

    AutoDropDown 取消这个属性.
    改用KeyDown事件.
      

  6.   

    感觉楼主你的这个功能存在问题.
    你想在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+'%'+'''');  
       ......
      

  7.   


    2、OnChange     方法:当Text属性发生改变时,也不会触发的;
    不信 你可以试试 combobox1.text:='我来测试了';会不会触发