首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >改变TComboBox的ITEMINDEX不会触发它的OnChange事件

改变TComboBox的ITEMINDEX不会触发它的OnChange事件
EN

Stack Overflow用户
提问于 2016-06-02 08:33:01
回答 3查看 2.3K关注 0票数 2

在Delphi中以编程方式更改TComboBox组件的TComboBox值时,可能会触发相应的OnChange事件。

毕竟,结果是ComboBox get的可见值发生了变化。奇怪的是它没有。同样的行为在Delphi6,德尔菲2010和德尔福XE7。

这种行为背后有什么原因吗?还是它只是一个挂起的bug?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-06-02 08:43:30

来自文档

当用户更改编辑区域中显示的文本时发生。 编写OnChange事件处理程序,以便在用户编辑编辑区域中的文本或从列表中选择项后立即采取特定操作。Text属性在编辑区域中提供新的值。 注意: OnChange只在响应用户操作时发生。以编程方式更改Text属性不会触发OnChange事件。

由于没有编辑,这意味着以编程方式更改ItemIndex不会触发OnChange事件。

票数 7
EN

Stack Overflow用户

发布于 2016-06-02 09:16:26

正如其他人所回答的,它是按照设计的。但是,您可以通过重写SetItemIndex()过程实现所缺少的功能,如下所示:

代码语言:javascript
复制
type
  TComboBox = class(Vcl.StdCtrls.TComboBox)
    procedure SetItemIndex(const Value: Integer); override;
  end;

  TForm3 = class(TForm)
    ...


implementation

procedure TComboBox.SetItemIndex(const Value: Integer);
begin
  inherited;
  if Assigned(OnSelect) then
    OnSelect(self);
end;

如您所见,我激活了OnSelect事件而不是OnChange事件,因为在从下拉列表中选择项时触发的是OnSelect事件。如果您愿意,也可以使用OnChange事件来代替。

票数 4
EN

Stack Overflow用户

发布于 2016-06-02 08:42:33

这是设计的行为。OnChange事件仅由用户操作触发,而不是通过编程触发。

OnChange事件

当用户更改编辑区域中显示的文本时发生。编写OnChange事件处理程序,以便在用户编辑编辑区域中的文本或从列表中选择项后立即采取特定的操作。Text属性在编辑区域中提供新的值。 注意: OnChange只在响应用户操作时发生。以编程方式更改Text属性不会触发OnChange事件。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37586597

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档