從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'。這當然取決於你的意圖。 –