【问题标题】:Combo box - typing selection then clicking out of focus - doesn't select the typed item组合框 - 键入选择然后单击失焦 - 不选择键入的项目
【发布时间】:2013-11-14 03:20:24
【问题描述】:

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

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

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

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

【问题讨论】:

  • 测试DroppedDown,如果它被下拉不刷新屏幕会起作用吗?
  • @SertacAkyuz 抱歉,我不明白你问了什么。
  • 在OnClick事件中,测试ComboBox的DroppedDown,如果为false则不刷新屏幕。
  • 知道了,我试试
  • @Jerry - 不整洁,但如果项目索引不匹配,您可能需要使用“OnCloseUp”重新同步。

标签: delphi combobox focus delphi-xe2


【解决方案1】:

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

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

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

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

【讨论】:

    【解决方案2】:

    您可以使用 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 设计中的一个错误。

    【讨论】:

      猜你喜欢
      • 2012-04-28
      • 2015-11-06
      • 1970-01-01
      • 2021-12-26
      • 2011-01-13
      • 2018-01-23
      • 2012-03-02
      • 2016-03-09
      • 1970-01-01
      相关资源
      最近更新 更多