delphi - 为什么组合框在字体更改时将其文本更改为项目文本?

标签 delphi winapi windows-7 delphi-2009 delphi-xe3

这显然是一个错误,但我无法追踪为什么会发生。这是一个可重现的简约代码。只需在表单上放置一个组合框和按钮并编写以下事件处理程序:

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/

相关文章:

c++ - DLL 导出 4 个 COM 函数但不导出 COM 对象?!我就是不明白!

c++ - CoGetClassObject 返回错误

Delphi:如果用户重新启动/关闭,Application.Run 之后的代码不会执行

c++ - Win32 : why does my PRINTDLG (or PRINTDLGEX) have gray background?

c++ - UNICODE_STRING 到 wchar_t* null 终止

c - Windows 中 C 中的线程

windows-7 - 退格键在 Windows 的 gvim 7.2 64 位中不起作用?

Delphi编译器错误: Compiler for personality "Delphi.Personality" and platform "Win32" missing or unavailable

delphi - 如何从Delphi运行命令行?

delphi - 如何使用 fastMM 追踪棘手的内存泄漏?