从Delphi XE文档: -在Delphi中的任何操作中引发的OnChange事件是否有其他替代方法?
注意:OnChange仅在响应用户操作时才会发生。以编程方式更改Text属性不会触发OnChange事件。
当发生任何更改(由用户或编程)时,是否有任何其他可用于TComboBox的事件?更改TComboBox的ItemIndex属性时,不会引发任何事件。
从Delphi XE文档: -在Delphi中的任何操作中引发的OnChange事件是否有其他替代方法?
注意:OnChange仅在响应用户操作时才会发生。以编程方式更改Text属性不会触发OnChange事件。
当发生任何更改(由用户或编程)时,是否有任何其他可用于TComboBox的事件?更改TComboBox的ItemIndex属性时,不会引发任何事件。
当文本被修改时,组合框控件被发送CM_TEXTCHANGED
。 VCL控制选择不在这里展示事件,但你可以。有很多方法可以做到这一点。在这里,我说明了快速和肮脏的中介类:
TComboBox = class(Vcl.StdCtrls.TComboBox)
procedure CMTextChanged(var Message: TMessage); message CM_TEXTCHANGED;
end;
procedure TComboBox.CMTextChanged(var Message: TMessage);
begin
inherited;
Beep;
end;
当然,你会想这样做在你的产品代码少哈克的方式。
如果这是你想要的,你总是可以自己触发onchange-method。
Edit1.Text := 'hello'; //Set a value
Edit1.OnChange(Edit1); //..then trigger event
编辑:大卫是对的,一个TEdit在所有更新上调用OnChange。如果它是要触发的组合框,然后使用如下所示:Combobox1.OnChange(Combobox1);
很抱歉的混乱创建一个新的组成部分,我已经更新的问题更清楚我指的是TComboBox。 – Adam
从TComboBox
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;
谢谢大卫。 – Adam
如果你想将消息传递给后代进行默认处理,不要忘记调用'inherited'。这当然取决于你的意图。 –