当以编程方式更改Delphi中ItemIndex
组件的TComboBox
的值时,可能会期望相应的OnChange
事件被触发。
毕竟,ComboBox的可见值因此而改变了。奇怪的是它没有。 Delphi6,Delphi 2010和Delphi XE7中的行为相同。
这种行为背后是否有任何原因,或者只是一个未决的错误?
答案 0 :(得分:6)
当用户更改编辑区域中显示的文本时发生。
编写 OnChange 事件处理程序,以便在用户编辑编辑区域中的文本或从列表中选择项目后立即执行特定操作。 Text属性在编辑区域中提供新值。
注意:仅在响应用户操作时发生OnChange 。以编程方式更改Text属性不会触发 OnChange 事件。
由于没有完成编辑,这意味着以编程方式更改ItemIndex
不会触发OnChange
事件。
答案 1 :(得分:4)
正如其他人所回答的,它是按照设计的。但是,您可以通过重写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
事件。
答案 2 :(得分:2)
这是设计行为。 OnChange
事件仅由用户操作触发,而不是以编程方式触发。
当用户更改编辑区域中显示的文本时发生。 编写OnChange事件处理程序以立即执行特定操作 在用户编辑编辑区域中的文本或选择项目之后 从列表中。 Text属性在编辑中提供新值 区域。
注意:OnChange仅在响应用户操作时发生。 以编程方式更改Text属性不会触发 OnChange事件。