2011-11-30 61 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; 
相關問題