2011-11-30 8 views
6

Z dokumentacji Delphi XE: -Czy istnieje alternatywa dla zdarzenia OnChange, które jest wywoływane przy każdej akcji w Delphi?

Uwaga: OnChange występuje tylko w odpowiedzi na działania użytkownika. Zmiana programistyczna właściwości Text nie powoduje zdarzenia OnChange.

Czy są dostępne inne zdarzenia dotyczące TComboBox, które są wywoływane w przypadku wystąpienia jakiejkolwiek zmiany (przez użytkownika lub programowo)? Podczas zmiany właściwości ItemIndex obiektu TComboBox nie jest zgłaszane żadne zdarzenie.

Odpowiedz

8

Kontrola pola kombi jest wysyłana CM_TEXTCHANGED, gdy tekst jest modyfikowany. Sterownik VCL decyduje się nie pokazywać tutaj zdarzenia, ale możesz. Jest na to wiele sposobów. Tu ilustrują szybki i brudny klasę interposer:

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

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

Oczywiście, co chcesz zrobić to w sposób mniej hacky w kodzie produkcyjnym.

+0

Dziękuję David. – Adam

+2

Jeśli chcesz przekazać wiadomość potomkowi do domyślnej obsługi, nie zapomnij połączyć się z 'odziedziczonym'. To oczywiście zależy od twoich intencji. –

3

Zawsze możesz wywołać metodę onchange, jeśli tego chcesz.

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

Edytuj: David ma rację, TEdit wywołuje OnChange we wszystkich aktualizacjach. Jeśli jest to combobox, który chcesz wywołać, użyj czegoś takiego jak: Combobox1.OnChange (Combobox1);

+0

Przepraszam za zamieszanie, mam zaktualizowany pytanie uczynić go bardziej jasne, ja odnoszę się do TComboBox. – Adam

1

Utwórz nowy komponent z 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; 
Powiązane problemy