2011-11-30 62 views

回答

8

当文本被修改时,组合框控件被发送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; 

当然,你会想这样做在你的产品代码少哈克的方式。

+0

谢谢大卫。 – Adam

+2

如果你想将消息传递给后代进行默认处理,不要忘记调用'inherited'。这当然取决于你的意图。 –

3

如果这是你想要的,你总是可以自己触发onchange-method。

Edit1.Text := 'hello'; //Set a value 
Edit1.OnChange(Edit1); //..then trigger event 

编辑:大卫是对的,一个TEdit在所有更新上调用OnChange。如果它是要触发的组合框,然后使用如下所示:Combobox1.OnChange(Combobox1);

+0

很抱歉的混乱创建一个新的组成部分,我已经更新的问题更清楚我指的是TComboBox。 – Adam

1

从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; 
相关问题