这显然是一个错误,但我无法追踪为什么会发生。这是一个可重现的简约代码。只需在表单上放置一个组合框和按钮并编写以下事件处理程序:
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 中重现这一点。
最佳答案
只需启用“调试 DCU”,然后进入 Font.Color
属性 setter ,您就可以在几秒钟内自行追踪到这一点。
当 Font
由于任何原因发生更改时,TFont.OnChange
事件将被触发。 TControl
分配了一个事件处理程序,因此它可以向自己发送一条 CM_FONTCHANGED
消息,以允许后代类对更改使用react。当 TWinControl
收到该消息时,它会向自身发送一条 WM_SETFONT
消息,然后触发 ComCtl32 发送您所看到的 WM_SETTEXT
消息。
关于delphi - 为什么组合框在字体更改时将其文本更改为项目文本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12807758/