为许多组合框编写代码以自动选择文本值的项索引会变得很麻烦。问题是,当我通过代码(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中的一个错误,因为即使我从不需要项索引,用户界面仍然会起作用。在我的情况下,我永远不需要观察项目索引,因为我将文本值作为字符串发送到服务器。但是,由于未分配索引,当用户通过键入或下拉框以外的方式进行导航时,控件本身也不会以应有的方式做出反应。
我可以在全局级别上传播到我的所有组合框控件(至少在给定的表单内)以通过代码自动选择文本值来选择列表中的相应值吗?
答案 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;