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

Altering ITEMINDEX of TComboBox does not trigger it's OnChange event

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

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

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

这是设计好的行为。 OnChange 事件仅由用户操作而非程序触发。

OnChange Event

Occurs when the user changes the text displayed in the edit region. Write an OnChange event handler to take specific action immediately after the user edits the text in the edit region or selects an item from the list. The Text property gives the new value in the edit region.

Note: OnChange only occurs in response to user actions. Changing the Text property programmatically does not trigger an OnChange event.

来自documentation

Occurs when the user changes the text displayed in the edit region.

Write an OnChange event handler to take specific action immediately after the user edits the text in the edit region or selects an item from the list. The Text property gives the new value in the edit region.

Note: OnChange only occurs in response to user actions. Changing the Text property programmatically does not trigger an OnChange event.

由于没有完成任何编辑,这意味着以编程方式更改 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 是当您 select 下拉列表中的一项时触发的事件。如果愿意,您也可以改用 OnChange 事件。