在Delphi中以编程方式更改TComboBox组件的TComboBox值时,可能会触发相应的OnChange事件。
毕竟,结果是ComboBox get的可见值发生了变化。奇怪的是它没有。同样的行为在Delphi6,德尔菲2010和德尔福XE7。
这种行为背后有什么原因吗?还是它只是一个挂起的bug?
发布于 2016-06-02 08:43:30
来自文档
当用户更改编辑区域中显示的文本时发生。 编写OnChange事件处理程序,以便在用户编辑编辑区域中的文本或从列表中选择项后立即采取特定操作。Text属性在编辑区域中提供新的值。 注意: OnChange只在响应用户操作时发生。以编程方式更改Text属性不会触发OnChange事件。
由于没有编辑,这意味着以编程方式更改ItemIndex不会触发OnChange事件。
发布于 2016-06-02 09:16:26
正如其他人所回答的,它是按照设计的。但是,您可以通过重写SetItemIndex()过程实现所缺少的功能,如下所示:
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事件来代替。
发布于 2016-06-02 08:42:33
这是设计的行为。OnChange事件仅由用户操作触发,而不是通过编程触发。
OnChange事件
当用户更改编辑区域中显示的文本时发生。编写OnChange事件处理程序,以便在用户编辑编辑区域中的文本或从列表中选择项后立即采取特定的操作。Text属性在编辑区域中提供新的值。 注意: OnChange只在响应用户操作时发生。以编程方式更改Text属性不会触发OnChange事件。
https://stackoverflow.com/questions/37586597
复制相似问题