【发布时间】:2012-09-30 05:46:14
【问题描述】:
这显然是一个错误,但我无法追查为什么会发生。这是一个要重现的简约代码。只需在表单上放置一个组合框和按钮,然后编写以下事件处理程序:
procedure TForm1.FormCreate(Sender: TObject);
begin
ComboBox1.Items.Add('A Item');
ComboBox1.Items.Add('B Item');
ComboBox1.Items.Add('C Item');
ComboBox1.Style := csDropDown;
ComboBox1.AutoComplete := False;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
ComboBox1.Text := 'B';
ComboBox1.Font.Color := clRed;
ShowMessage(IntToStr(ComboBox1.ItemIndex));
end;
当您第一次单击按钮时,您将在组合编辑中看到第二个项目的完全选定文本,但消息框会显示项目索引等于 -1。当您下拉它时,似乎选择了第二个项目。第二次单击将设置正确的文本,但其余部分与第一次单击时相同。因此,在这种情况下,组合框的行为就像启用了一些奇怪的自动完成功能。
我已将此追踪到EditWndProc,在收到字体更改后WM_SETTEXT 消息与第二项的文本,但我不知道它来自哪里以及为什么与第二项的文本项目。
所以,我的问题非常具体 - 什么(哪种方法)在字体更改时发送 WM_SETTEXT 以及在禁用自动完成时它如何知道第二项文本匹配?
到目前为止,我可以在安装了最新更新的 Windows 7 Home Premium 64 位上的 Delphi 2009 和 Delphi XE3 中重现此问题。
【问题讨论】:
-
在 delphi 2007 中确认的相同行为认为这可能是 windows api 错误,您在哪个版本的 windows 中进行了测试?
-
我会将它包含在问题中,在 Windows 7 上。
-
@whosrdaddy,是的,但在这种情况下,有关操作系统的更具体信息可能会很方便;-)
-
据我所知,TComboBox 的“自动完成”纯粹是一种 VCL 便利(至少在 D2007 中),并且仅在按键事件中有效。我猜VCL与此无关。
标签: delphi winapi windows-7 delphi-2009 delphi-xe3