改变 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
事件仅由用户操作而非程序触发。
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.
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
事件。
当以编程方式更改 Delphi 中 TComboBox
组件的 ItemIndex
的值时,人们会期望触发相应的 OnChange
事件。
毕竟,ComboBox 的可见值因此发生了变化。奇怪的是它没有。 Delphi6、Delphi 2010 和 Delphi XE7 中的行为相同。
此行为背后是否有任何原因,或者它只是一个未决的错误?
这是设计好的行为。 OnChange
事件仅由用户操作而非程序触发。
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.
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
事件。