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

标签 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';
  • 用户在组合框控件内单击
  • 用户按键盘上的向上箭头
  • 选择了列表中的第一项“One”而不是“Four”

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

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

最佳答案

您可以使用插入器类将行为更改为您喜欢的行为。例如:

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;

关于delphi - 如何通过代码在组合框中分配文本自动选择索引?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26499074/

相关文章:

datetime - Delphi:格式化日期时间,不带午夜时间部分

delphi - 有标准的非模式消息对话框吗?

apache-flex - 弹性 : Programatically Setting the Chosen Item in a ComboBox

带有 IsEditable ="True"的 WPF ComboBox - 如何指示未找到匹配项?

delphi - JvTreeView 和 JvCheckTreeView 复选框通知

delphi - Firemonkey 中的动画 GIF

mysql - 多个 TADO 连接的效果

delphi - 如何让透明图像出现在菜单项上

pandas - 将文件中的项目动态添加到 ComboBox

delphi - 将构建服务器从 Delphi XE 迁移到 Delphi XE2