2

我的组合框有问题。我有一个事件处理程序,OnClick它根据选择的项目刷新数据。问题是当这种情况发生时:

  1. 下拉组合框以列出各种选项
  2. 在键盘上键入以查找匹配的项目
  3. 组合框更改此选择并调用OnClick事件
  4. 由于此选择/事件,我的屏幕刷新
  5. 单击组合框外部的某个位置以将焦点从它移开
  6. 组合框返回到上一个选择,即使OnClick已经被调用
  7. 即使组合框更改回之前的选择,OnClick也不会再次调用
  8. 在此之后,组合框显示的值与我的数据实际代表的值不同

因此,当您打开组合框并在键盘上键入几个字母以在下拉列表中查找项目时,OnClick会触发刷新我的屏幕。但是,当您单击组合框外的某个位置(从而将焦点从它身上移开)时,组合框会变回之前选择的任何值,而不是我输入的值。同时,该OnClick事件没有被触发,因此与我在屏幕上加载的值相比,组合框显示的值不正确。

在键盘上键入项目的这种情况下,如何使组合框保持在所选项目上?

4

2 回答 2

1

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

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

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

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

于 2013-11-14T07:11:23.893 回答
0

您可以使用 OnExit 使键盘与 ComboBox 上的索引一起输入;其中 VarS 被分配 OnChange 并且是您想要保留的答案:

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

我将其称为 ComboBox 设计中的错误。

于 2015-06-20T17:08:12.103 回答