Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi 如何通过代码在组合框中指定文本自动选择索引?_Delphi_Combobox_Delphi Xe2_Vcl - Fatal编程技术网

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

Delphi 如何通过代码在组合框中指定文本自动选择索引?,delphi,combobox,delphi-xe2,vcl,Delphi,Combobox,Delphi Xe2,Vcl,为许多组合框编写代码以自动选择文本值的项索引已经成为一件麻烦事。问题是,当我通过代码(ComboBox.text:=“Some value”;)分配文本值时,即使确切的值已经在列表中,也不会自动选择项索引。因此,我为每个组合框编写代码,通过查找值来选择项目索引。在其他情况下,分配的值可能不在列表中,在这种情况下,进一步处理将添加该值。但当该值在列表中时,我希望自动分配项索引 我可以通过删除一个新的组合框,分配一些项目,然后通过代码给它分配一个文本值来复制这种行为。为了验证,我在这个组合框内单击,

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

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

启用“自动完成”,并且当用户手动键入此类值时,它会自动选择此项索引。但是给列表中实际存在的
文本
属性赋值并不会选择相应的项索引

示例:

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

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


如何在全局级别传播到所有组合框控件(至少在给定表单中),使通过代码分配文本值自动选择列表中相应的值?

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

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;

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

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;

ComboBox.itemsindex:=ComboBox.Items.IndexOf('Five')不适合你?你为什么要“继续写代码”?写一次并将其放入函数中。除此之外,
样式
属性的值是多少?如果您使用的是默认的
csDropDown
,那么首先就不应该真正依赖索引。用户可以输入任意文本。那么,如果它恰好与列表中的某个文本匹配呢?你仍然需要处理所有其他可能的值,那么为什么还要专门处理索引值呢?@KenWhite我已经做了很多。但我必须为每个组合框做这些,每次我分配一些东西。“我正处于一个最理想的状态,可以将其最小化。@RobKennedy解释道,这是默认的行为和属性。我不太依赖项索引,因为文本值被读取并放入JSON对象中,以字符串形式发送到服务器。但事实上,它不会自动选择它的列表时,分配它作为如此是非常恼人的。即使我不需要阅读条目索引,用户界面仍然会因为这个错误而反应不佳(也如解释的那样)。您还没有识别出一个“错误”。TComboBox只是底层Windows公共控件的包装器。罗布提出了几点好的观点,我在你的帖子中看不到任何能说明这些观点的东西。没有“全局设置”会更改所有combobox控件的行为。如果不希望使用
csDropDown
样式的默认行为,请使用其他样式-如果希望自动设置项目索引,请使用
csDropDownList
ComboBox.itemsindex:=ComboBox.Items.IndexOf('五')不适合你?你为什么要“继续写代码”?写一次并将其放入函数中。除此之外,
样式
属性的值是多少?如果您使用的是默认的
csDropDown
,那么首先就不应该真正依赖索引。用户可以输入任意文本。那么,如果它恰好与列表中的某个文本匹配呢?你仍然需要处理所有其他可能的值,那么为什么还要专门处理索引值呢?@KenWhite我已经做了很多。但我必须为每个组合框做这些,每次我分配一些东西。“我正处于一个最理想的状态,可以将其最小化。@RobKennedy解释道,这是默认的行为和属性。我不太依赖项索引,因为文本值被读取并放入JSON对象中,以字符串形式发送到服务器。但事实上,它不会自动选择它的列表时,分配它作为如此是非常恼人的。即使我不需要阅读条目索引,用户界面仍然会因为这个错误而反应不佳(也如解释的那样)。您还没有识别出一个“错误”。TComboBox只是底层Windows公共控件的包装器。罗布提出了几点好的观点,我在你的帖子中看不到任何能说明这些观点的东西。没有“全局设置”会更改所有combobox控件的行为。如果不希望使用
csDropDown
样式的默认行为,请使用其他样式-如果希望自动设置项目索引,请使用
csDropDownList