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