如何通过代码在组合框中分配文本自动选择索引?

时间:2014-10-22 01:36:09

标签: delphi combobox delphi-xe2 vcl

为许多组合框编写代码以自动选择文本值的项索引会变得很麻烦。问题是,当我通过代码(ComboBox.Text:= 'Some value';)分配文本值时,即使精确值已经在列表中,也不会自动选择项目索引。所以我最后为每个组合框编写代码,通过查找值来选择项目索引。在其他情况下,分配的值可能不在列表中,在这种情况下,进一步处理将添加它。但是当该值在列表中时,我希望自动分配项目索引。

我可以通过删除一个新的组合框,分配一些项目,然后通过代码为其分配文本值来复制此行为。要验证,我在此组合框内单击,然后按键盘上的向上或向下箭头,它将跳转到列表的开头。但是,如果我使用此指定值下拉组合框,则会在列表中选择该值并指定项目索引。但我不应该这样做。

启用自动完成功能,当用户手动输入此类值时,它会自动选择此项目索引。但是为Text属性赋值实际上存在于列表中并不会选择相应的项索引。

示例:

ComboBox.Items.Add('One');
ComboBox.Items.Add('Two');
ComboBox.Items.Add('Three');
ComboBox.Items.Add('Four');
ComboBox.Items.Add('Five');
ComboBox.Text:= 'Five';
  • 用户点击组合框控件
  • 用户按下键盘上的向上箭头
  • 选择列表中的第一项“一”而不是“四”

我认为这是VCL中的一个错误,因为即使我从不需要项索引,用户界面仍然会起作用。在我的情况下,我永远不需要观察项目索引,因为我将文本值作为字符串发送到服务器。但是,由于未分配索引,当用户通过键入或下拉框以外的方式进行导航时,控件本身也不会以应有的方式做出反应。

我可以在全局级别上传播到我的所有组合框控件(至少在给定的表单内)以通过代码自动选择文本值来选择列表中的相应值吗?

1 个答案:

答案 0 :(得分:8)

您可以使用插入器类将行为更改为您喜欢的内容。 E.g:

type
  TComboBox = class(vcl.stdctrls.TComboBox)
  protected
    procedure WMSetText(var Message: TWMSetText); message WM_SETTEXT;
  end;

...


procedure TComboBox.WMSetText(var Message: TWMSetText);
begin
  Perform(CB_SELECTSTRING, WPARAM(-1), Message.Text);
  inherited;
end;