2011-11-30 9 views
6

Dalla documentazione Delphi XE: -Esiste un'alternativa all'evento OnChange che viene generato in qualsiasi azione in Delphi?

Nota: OnChange si verifica solo in risposta alle azioni dell'utente. La modifica della proprietà Text a livello di codice non attiva un evento OnChange.

Esistono altri eventi disponibili per TComboBox che vengono generati quando si verifica un cambiamento (dall'utente o programmaticamente)? Quando si modifica la proprietà ItemIndex di TComboBox, non viene generato alcun evento.

risposta

8

Il controllo casella combinata viene inviato un CM_TEXTCHANGED quando il testo viene modificato. Il controllo VCL sceglie di non affiorare un evento qui, ma è possibile. Ci sono molti modi per farlo. Qui illustro la classe di interposizione rapido e sporco:

TComboBox = class(Vcl.StdCtrls.TComboBox) 
    procedure CMTextChanged(var Message: TMessage); message CM_TEXTCHANGED; 
end; 

procedure TComboBox.CMTextChanged(var Message: TMessage); 
begin 
    inherited; 
    Beep; 
end; 

Naturalmente si vorrebbe fare questo in modo meno hacky nel codice di produzione.

+0

Grazie, David. – Adam

+2

Nel caso in cui si desideri passare il messaggio al discendente per la gestione predefinita, non dimenticare di chiamare 'inherited'. Questo ovviamente dipende dalle tue intenzioni. –

3

È sempre possibile attivare autonomamente il metodo onchange se è ciò che si desidera.

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

Edit: David ha ragione, un TEdit chiama OnChange su tutti gli aggiornamenti. Se si tratta di una casella combinata che si desidera attivare, utilizzare qualcosa come: Combobox1.OnChange (Combobox1);

+0

Ci scusiamo per la confusione, ho aggiornato la questione per renderlo più chiaro mi riferivo al TComboBox. – Adam

1

creare un nuovo componente da 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;