【问题标题】:How do I make the TAB key close a TComboBox without losing the current position?如何让 TAB 键关闭 TComboBox 而不会丢失当前位置?
【发布时间】:2009-06-12 22:38:11
【问题描述】:

我在表单上有一个 TComboBox。它的 Style 属性设置为 csDropDownList。如果我打开下拉列表并使用鼠标或键盘选择一个选项并按 ENTER,则下拉框将关闭,并且 ItemIndex 属性会在 KeyPress 事件处理程序被触发之前更改。如果我点击 TAB,下拉列表不会消失,直到 KeyPress 事件处理程序被触发并且焦点已经离开控件,并且 ItemIndex 没有得到更新;它会恢复到我打开列表之前选择的任何内容。

如果我希望 TAB 将 ItemIndex 更新为下拉列表中当前选择的任何内容,我将如何实现它?

【问题讨论】:

  • 我觉得你向 Steven 和 Francois 提问通常是最常见的答案,这很有趣,特别是因为 Steven 坐在你身后。
  • 如果您使用键盘在组合框中选择一个值,您应该考虑只使用键盘,而不是打开组合框下拉菜单。通过向上和向下箭头,您可以直接更改所选项目(和 ItemIndex 属性值),并且选项卡将正常工作。同意,您无需对下拉列表中的项目列表进行监督,但如果项目很多,界面架构师应该想知道组合框是否是该工作的正确控件。
  • 同意 Stijn 和 skamradt,并根据这些 cmets,我建议您非常不愿意更改通用界面元素的默认行为(除非默认行为明显不标准) .

标签: delphi combobox


【解决方案1】:

将表单的 KeyPreview 属性设置为 True。

在 ComboBox OnKeyDown 事件中:

procedure TForm1.ComboBox1KeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  if (Key = VK_TAB) then
  begin
    Key := VK_RETURN;
    Perform(WM_NEXTDLGCTL,0,0);
  end;
end;

这模拟了返回键,然后将焦点移动到下一个控件。

【讨论】:

  • 为了完整起见,如果您还希望使用 Shift 和 Tab 返回:if ssShift in shift then Perform(WM_NEXTDLGCTL,1,0) else Perform(WM_NEXTDLGCTL,0,0);跨度>
【解决方案2】:

我相信这是默认行为,要更改它,您可能需要对控件(甚至是类助手)进行子类化,拦截 Windows 消息以获取击键,然后如果它是选项卡,则向控件发送返回值,然后自己处理标签。

【讨论】:

    【解决方案3】:

    您应该尝试在 KeyUp 事件中更早地捕获 TAB,或者甚至在 KeyDown 中更早地捕获。

    【讨论】:

      【解决方案4】:

      当你检索你的索引时,使用这个而不是经典的 ComboBox->ItemIndex

      ComboBox->Items->IndexOf(ComboBox->Text)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-10-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-02-28
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多