对于Delphi中的任何操作引发的OnChange事件,是否有其他替代方法?
从Delphi XE文档中:- 注意:OnChange仅在响应用户操作时发生。以编程方式更改Text属性不会触发OnChange事件对于Delphi中的任何操作引发的OnChange事件,是否有其他替代方法?,delphi,combobox,controls,delphi-xe,Delphi,Combobox,Controls,Delphi Xe,从Delphi XE文档中:- 注意:OnChange仅在响应用户操作时发生。以编程方式更改Text属性不会触发OnChange事件 当发生任何更改(由用户或以编程方式)时,是否有任何其他事件可用于TComboBox?更改TComboBox的ItemIndex属性时,不会引发任何事件。如果需要,您可以自己触发onchange方法 Edit1.Text := 'hello'; //Set a value Edit1.OnChange(Edit1); //..then trigger event
当发生任何更改(由用户或以编程方式)时,是否有任何其他事件可用于TComboBox?更改TComboBox的ItemIndex属性时,不会引发任何事件。如果需要,您可以自己触发onchange方法
Edit1.Text := 'hello'; //Set a value
Edit1.OnChange(Edit1); //..then trigger event
编辑:David是对的,TEdit会在所有更新中调用OnChange。如果它是您想要触发的组合框,那么使用类似于:Combobox1.OnChange(Combobox1) 当文本被修改时,组合框控件将被发送一个
CM\u TEXTCHANGED
。VCL控件选择不在此处显示事件,但您可以。有很多方法可以做到这一点。在这里,我演示了quick and dirty interposer类:
TComboBox = class(Vcl.StdCtrls.TComboBox)
procedure CMTextChanged(var Message: TMessage); message CM_TEXTCHANGED;
end;
procedure TComboBox.CMTextChanged(var Message: TMessage);
begin
inherited;
Beep;
end;
当然,您希望在生产代码中以一种不太粗糙的方式来实现这一点。从Tcombox创建一个新组件
TMyCombo= class(TComboBox)
private
procedure CMTextChanged(var Message: TMessage); message CM_TEXTCHANGED;
end;
{ TMyCombo }
procedure TMyCombo.CMTextChanged(var Message: TMessage);
begin
inherited;
Change;
end;
TForm1 = class(TForm)
procedure MyChange(sender: TObject);
...
private
FCombo: TMyCombo;
...
procedure TForm1.FormCreate(Sender: TObject);
begin
FCombo:= TMyCombo.Create(self);
FCombo.Parent:= self;
FCombo.OnChange:= MyChange;
end;
procedure TForm1.MyChange(Sender: TObject);
begin
self.Edit1.Text:= FCombo.Text;
end;
destructor TForm1.Destroy;
begin
FreeAndNil(FCombo);
inherited;
end;
很抱歉造成混淆,我已经更新了问题,以便更清楚地说明我指的是TComboBox。如果您想将消息传递给后代进行默认处理,请不要忘记调用
继承的
。这当然取决于你的意图。