Komponenten zur Laufzeit erstellen
Arbeiten mit Ereignissen
Wir wollen jetzt auf das Drücken eines Buttons reagieren.
Dazu brauchen wir eine Prozedur, genauer gesagt eine Ereignisbehandlungsmethode. Diese Prozedur soll „ShowButtonCaption“ lauten. Diese soll nur die „Caption“ in „MyRichedit“ einfügen.
„TForm1.“ bedeutet, dass diese Methode Teil der Klasse TForm1 ist. Der Prozedurkopf ist „komplett“ in den Public-Abschnitt der Klassendeklaration zu kopieren. Das „TForm1“ muss dann natürlich entfernt werden.
type TForm1 = class(TForm) procedure FormCreate(Sender: TObject); private public procedure ShowButtonCaption(Sender: TObject); end; var Form1: TForm1; MyRichedit: TRichedit; MyToolbar: TToolbar; implementation procedure TForm1.ShowButtonCaption(Sender: TObject); begin end;
Woher wissen wir eigentlich, welcher Button gedrückt wurde? Wir bekommen den Button oder eine andere Komponenten als Referenz über „Sender: TObject“ mitgeliefert.
Schreiben wir nun Folgendes:
if sender is TToolButton then begin
Damit fragen wir ab, ob der Sender auch wirklich ein TToolbutton ist.
Jetzt gibt es zwei Möglichkeiten, um mit „Sender“ zu arbeiten. „TToolbutton(Sender)“ oder „(Sender as TToolbutton)“. Beide funktionieren; es gibt aber einen Unterschied: Bevor „as“ einen Typ in einen anderen umwandelt (in unserem Fall den allgemeinen Typ TObject in unseren konkreten TToolbutton), wird getestet, ob eine Umwandlung überhaupt zulässig ist. Falls eine Umwandlung nicht möglich ist tritt eine EInvalidCast-Exception auf. Da wir das über die „is“-Zeile aber bereits prüfen, können wir auch die direkte Typumwandlung ohne „as“ verwenden.
Wir schreiben in eine Variable den Wert von Caption und fügen ihn dann in das Richedit ein.
procedure TForm1.ShowButtonCaption(Sender: TObject); var ButtonCaption: String; begin if Sender is TToolButton then begin ButtonCaption := TToolButton(Sender).Caption; ButtonCaption := (Sender as TToolbutton).Caption; MyRichedit.Lines.Add(ButtonCaption); end; end;
Nun fehlt nur noch die Zuweisung des Ereignisses zum ToolButton. Dazu gehen wir in die „Create“-Anweisung des Formulars und schreiben in die for-Schleife
MyToolButton.OnClick := ShowButtonCaption;
Damit wird immer beim Klicken eines Buttons (OnClick-Ereignis) die Prozedur angesprochen und als Sender der angeklickte Button übergeben.