2016-06-02 24 views
2

Wenn Sie den Wert von ItemIndex einer TComboBox-Komponente in Delphi programmgesteuert ändern, würde man erwarten, dass das entsprechende OnChange-Ereignis ausgelöst wird.Das Ändern von ITEMINDEX von TComboBox löst kein OnChange-Ereignis aus

Immerhin wird der sichtbare Wert der ComboBox als Ergebnis geändert. Seltsamerweise nicht. Gleiches Verhalten in Delphi6, Delphi 2010 und Delphi XE7.

Gibt es einen Grund für dieses Verhalten oder ist es nur ein ausstehender Fehler?

+2

Ich verstehe nicht, warum Menschen so zögern, die Dokumentation zu lesen. Liegt es daran, dass Sie nicht wissen, wo es ist? http://stackoverflow.com/questions/21403628/how-can-i-search-for-delphi-documentation –

+0

Bitte akzeptieren Sie meine Entschuldigung @ David Heffernan – Johny

+0

Fwiw, ich habe immer gedacht, dass die Tatsache, dass dies "wie geplant" Verhalten für viele Kontrollen (esp.TPageControl) war ein Konstruktionsfehler, da es eine Codierung erfordert, die überflüssig sein sollte. – MartynA

Antwort

6

Von documentation:

Tritt ein, wenn der Benutzer den Text im Bearbeitungsbereich angezeigt ändert.

Schreiben Sie einen OnChange Event-Handler, der sofort bestimmte Aktionen ausführt, nachdem der Benutzer den Text im Bearbeitungsbereich bearbeitet oder ein Element aus der Liste auswählt. Die Eigenschaft Text gibt den neuen Wert im Bearbeitungsbereich an.

Hinweis: OnChange tritt nur als Reaktion auf Benutzeraktionen auf. Das programmgesteuerte Ändern der Texteigenschaft löst kein OnChange Ereignis aus.

Da es keine Bearbeitung erfolgt ist, bedeutet dies, dass programmatisch die ItemIndex ändert nicht die OnChange Ereignis auslöst.

2

Das ist Verhalten ausgelegt. OnChange Ereignis wird nur von Benutzeraktionen und nicht programmatisch ausgelöst.

OnChange Event

Tritt ein, wenn der Benutzer den Text im Bearbeitungsbereich angezeigt ändert. Schreiben Sie einen OnChange-Ereignishandler, der sofort bestimmte Aktionen ausführt, nachdem der Benutzer den Text im Bearbeitungsbereich bearbeitet oder ein Element aus der Liste auswählt. Die Text-Eigenschaft gibt den neuen Wert in der Bearbeitungsregion an.

Hinweis: OnChange tritt nur als Reaktion auf Benutzeraktionen auf. Das programmgesteuerte Ändern der Text-Eigenschaft löst kein OnChange-Ereignis aus.

3

Wie andere beantwortet haben, ist es wie vorgesehen. Sie können jedoch erreichen die Funktionalität, die Sie durch Überschreiben der SetItemIndex() Verfahren fehlen wie folgt:

type 
    TComboBox = class(Vcl.StdCtrls.TComboBox) 
    procedure SetItemIndex(const Value: Integer); override; 
    end; 

    TForm3 = class(TForm) 
    ... 


implementation 

procedure TComboBox.SetItemIndex(const Value: Integer); 
begin 
    inherited; 
    if Assigned(OnSelect) then 
    OnSelect(self); 
end; 

Wie Sie sehen, ich aktiviere die OnSelect Ereignis statt OnChange, weil OnSelect die gebrannte ist ein, wenn Sie eine Auswahl Artikel aus der Dropdown-Liste. Sie können, wenn Sie möchten, auch das OnChange Ereignis stattdessen verwenden.