In den Ereignissroutinen der VCL wird der Auslöser des Ereignisses als TObject *Sender der Ereignisroutine übermittelt. Oft nutzt man eine Routine für mehrere Objekte (Buttons, Checkboxen, Radiobuttons u.a.). Nun stellt sich das Problem, dass man zur Laufzeit gerne wissen möchte, wer von den Objekten das Ereigniss ausgelöst hat und welche Eigenschaften das Objekt gerade hat.
Ist es nur interesannt zu wissen, wer die Routine ausgelöst hat, reicht ein einfacher Vergleich der Zeiger auf das Objekt:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
if(Sender==Mein-gefragter-Button)
{
}
}
Will man jedoch die Eigenschaft Caption auslesen oder wissen, ob der Button einen Hint hat, muß man sich zuerst einen (Hilfs-)Button anlegen und diesem mitteilen, dass er alle Methoden und Eigenschaften von Sender übernehmen soll. Das geht mit einer Programmzeile:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
TButton *Hilfsbutton=dynamic_cast<TButton*> (Sender);
if(Hilfsbutton)
String test=Hilfsbutton->Caption;
}
Hierbei wird mit Hilfe des Schlüsselwortes dynamic_cast<T>
(ptr) der Zeiger ptr in einen Zeiger der Klasse T umgewandelt. Dann wird dem
String test die Beschriftung des Button zugewiesen.
Hinweis: Für
die Nutzung von dynamic_cast müssen Laufzeitinformationen (RTTI)
verfügbar gemacht werden.