Auf *Sender zugreifen?



  • Hi.

    Ich habe mehrere Buttons welche alle das selbe machen und daher dachte ich, ich erstelle eine Funktion und die anderen Buttons erhalten dann die selbe, anstatt für jeden Button ein eigenes OnClick anzulegen.

    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
        (TButton*)Sender->Caption = "hello world!";
    }
    

    Mein Versuch scheiterte leider kläglich.

    Weiß jemand wie es korrekt ausschauen müsste?



  • So:

    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
        TButton* btn = static_cast<TButton*>(Sender);
        btn->Caption = "Hallo";    
    }
    //---------------------------------------------------------------------------
    

    edit Kurzform:

    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
       static_cast<TButton*>(Sender)->Caption = "Hallo";
    }
    //---------------------------------------------------------------------------
    

    mfg
    kpeter



  • Danke, das klappt super. Geht es eigentlich auch noch allgemeiner?

    Zum Beispiel haben sehr viele Komponenten eine Text-Eigenschaft. Wie Memos, Edits, SpinEdits, ..
    Interessant wäre hier ohne die Klasse das ->Text weitergeben bzw verändern zu können. Ich nehme nicht an dies ist möglich?



  • ~Sender schrieb:

    Interessant wäre hier ohne die Klasse das ->Text weitergeben bzw verändern zu können.

    Bezogen auf den obigen Code brauchst du schon die Komponentenklasse zu casten. Oder meinst du was anderes?



  • Nein, allgemein nur auf "TControl" zu casten und dann die Eigenschaften "Text" oder "Caption" zu benutzen ist so nicht möglich, da diese 'protected' sind und erst in den davon abgeleiteten Controls (TEdit, TMemo, TButton, ...) als 'published' deklariert wurden.
    Du mußt (leider) jeweils pro Control-Typ casten, du könntest dies aber mit "dynamic_cast" verallgemeinern.

    Es gibt zwar noch einen anderen Trick dafür, aber den verrate ich nicht, da er "dirty" ist...


Anmelden zum Antworten