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

时间:2016-06-02 08:33:02

标签: delphi delphi-2010 delphi-xe7

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

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

这种行为背后是否有任何原因,或者只是一个未决的错误?

3 个答案:

答案 0 :(得分:6)

来自documentation

  

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

     

编写 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 Event

  

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

     

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