组合框 - 键入选择然后单击失焦 - 不会选择键入的项目

时间:2013-11-14 03:20:25

标签: delphi combobox focus delphi-xe2

我遇到了组合框的问题。我有OnClick的事件处理程序,它根据选择的项目刷新数据。问题出在这种情况发生时:

  1. 下拉组合框以列出各种选项
  2. 键入键盘以查找匹配的项目
  3. 组合框会更改此选择并调用OnClick事件
  4. 由于此选择/事件,我的屏幕会刷新
  5. 单击组合框外部的某个位置以使焦点远离它
  6. 组合框返回上一个选择,即使已调用OnClick
  7. 即使组合框更改回先前的选择,也不会再次调用OnClick
  8. 此后,Combo Box显示的值与我的数据实际代表的值不同
  9. 因此,当您打开一个组合框,并在键盘上键入几个字母以在下拉列表中找到该项目时,将触发OnClick刷新我的屏幕。但是,当您单击组合框外部的某个位置(从而将焦点从其中移开)时,组合框将更改回先前选择的任何值,而不是我键入的值。同时,OnClick事件未被触发,因此组合框显示与我在屏幕上加载的值不正确的值。

    如何在键盘上输入项目的场景中使组合框保留在所选项目上?

2 个答案:

答案 0 :(得分:1)

在我的代码中,我使用OnCloseUp事件处理此问题。好吧,实际上我在下拉列表中使用了一个子类组合,它们都覆盖了ChangeCloseUp方法:

procedure TMyDropDownList.Change;
begin
  RespondToChange;
  inherited;
end;

procedure TMyDropDownList.CloseUp;
begin
  RespondToChange;
  inherited;
end;

RespondToChange方法对新的ItemIndex值做出反应。如果在组合下拉时对每个更改做出反应都很昂贵,那么您可以考虑从RespondToChange方法中省略对Change的调用。

答案 1 :(得分:0)

您可以使用OnExit使用键盘jive和ComboBox上的Index进行输入;其中VarS被分配了OnChange并且是你想要保留的答案:

procedure TForm1.ComboBox1Exit(Sender: TObject);
begin
  { Windows keyboard select bug, force use of selected }
  ComboBox1.ItemIndex := ComboBox1.Items.IndexOf(VarS);
end;

我认为这是ComboBox设计中的一个错误。