加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

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

发布时间:2020-12-15 09:25:21 所属栏目:大数据 来源:网络整理
导读:这显然是一个错误,但我无法追查为什么会发生.这是一个重现的简约代码.只需删除表单上的组合框和按钮,然后编写以下事件处理程序: procedure TForm1.FormCreate(Sender: TObject);begin ComboBox1.Items.Add('A Item'); ComboBox1.Items.Add('B Item'); Combo
这显然是一个错误,但我无法追查为什么会发生.这是一个重现的简约代码.只需删除表单上的组合框和按钮,然后编写以下事件处理程序:

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中重现这一点.

解决方法

我不认为这是一个VCL问题,看着调用堆栈,似乎消息似乎是通过comctl32.dll处理的.
您可以通过在设置文本之前设置字体颜色来解决问题:

procedure TForm1.Button1Click(Sender: TObject);
begin
  ComboBox1.Font.Color := clRed;
  ComboBox1.Text := 'B';
  ShowMessage(IntToStr(ComboBox1.ItemIndex));
end;

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读