这显然是一个错误,但我无法追查为什么会发生。这是一个要重现的简约代码。只需在表单上放置一个组合框和按钮,然后编写以下事件处理程序:
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
at 字体更改以及在禁用自动完成时它如何知道第二项文本匹配?
到目前为止,我可以在安装了最新更新的 Windows 7 Home Premium 64 位上的 Delphi 2009 和 Delphi XE3 中重现这一点。