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

问题描述 投票:2回答:3

当以编程方式更改Delphi中ItemIndex组件的TComboBox的值时,可以预期相应的OnChange事件将被触发。

毕竟,ComboBox的可见值得到了改变。奇怪的是它没有。 Delphi6,Delphi 2010和Delphi XE7中的行为相同。

这种行为背后有什么原因,或者只是一个悬而未决的错误?

delphi delphi-2010 delphi-xe7
3个回答
6
投票

来自documentation

用户更改编辑区域中显示的文本时发生。

编写OnChange事件处理程序,以便在用户编辑编辑区域中的文本或从列表中选择项目后立即执行特定操作。 Text属性在编辑区域中提供新值。

注意:OnChange仅在响应用户操作时发生。以编程方式更改Text属性不会触发OnChange事件。

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


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
投票

这是设计行为。 OnChange事件仅由用户操作触发,而不是以编程方式触发。

OnChange Event

用户更改编辑区域中显示的文本时发生。编写OnChange事件处理程序,以便在用户编辑编辑区域中的文本或从列表中选择项目后立即执行特定操作。 Text属性在编辑区域中提供新值。

注意:OnChange仅在响应用户操作时发生。以编程方式更改Text属性不会触发OnChange事件。

© www.soinside.com 2019 - 2024. All rights reserved.