Überladen oder Überschreiben von OnClick Ereignis



  • Hi,

    gibt es eine Möglichkeit im OnClick Ereignis von Button1 noch einen Parameter einzufügen, z.B. Button1Click(TObject *Sender, AnsiString sText) oder MyButton1Click(TObject *Sender, AnsiString sText), sodass ich auch von anderer Stelle die Funktion mit weiteren Parametern aufrufen kann, wie hier im OnClick von Button2 dargestellt ?

    //---------------------------------------------------------------------------
    //void __fastcall TForm1::Button1Click(TObject *Sender, AnsiString sText)
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
     // ...
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::Button2Click(TObject *Sender)
    {
     AnsiString sTitel;
    
     sTitel = "New Caption";
     Button1Click( 0, sTitel );
    }
    //---------------------------------------------------------------------------
    


  • umändern kannst du das nicht so einfach. Schreib dir doch einfach ne neue Funktion die das so macht?

    greetz KN4CK3R



  • Eine eigene Funktion habe ich schon versucht. Aber wenn ich die unter public stehen habe wird sie nicht aufgerufen sondern nur die Originalfunktion (obwohl im OI meine Funktion drin steht) und unter __published bekomme ich dann die Fehlermeldung "Falsche Methodendeklaration".

    Gibt es da keine Möglichkeit was eigenes zu schreiben ?



  • Hi,

    Angenommen, du hast 10 TButton (also keine Speed oder BitBtn), die alle
    auf ein einziges Klickereignis zugreifen, machs wie KN4CK3R sagt.
    Dazu mein Vorschlag als ClickEvent, die zusätzlich jedes Button identifiziert:

    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
       TButton* btn;
       btn = static_cast<TButton*>( Sender);
       String btnName    = btn->Name;
       String btnCaption = btn->Caption;
       int    btnTag     = btn->Tag; // im OI anpassen
       // Testausgabe
       Label1->Caption   = "Hier " + btnName + "  " + btnCaption + "  " 
                           + IntToStr(btnTag);
       // hier ev. weitere Funktion
    
    }
    //---------------------------------------------------------------------------
    

    Alle Buttons haben als OnClick das Button1Click.

    mfg
    kpeter



  • kpeter schrieb:

    Hi,

    Angenommen, du hast 10 TButton (also keine Speed oder BitBtn), die alle
    auf ein einziges Klickereignis zugreifen, machs wie KN4CK3R sagt.
    Dazu mein Vorschlag als ClickEvent, die zusätzlich jedes Button identifiziert:

    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
       TButton* btn;
       btn = static_cast<TButton*>( Sender);
       String btnName    = btn->Name;
       String btnCaption = btn->Caption;
       int    btnTag     = btn->Tag; // im OI anpassen
       // Testausgabe
       Label1->Caption   = "Hier " + btnName + "  " + btnCaption + "  " 
                           + IntToStr(btnTag);
       // hier ev. weitere Funktion
    
    }
    //---------------------------------------------------------------------------
    

    Alle Buttons haben als OnClick das Button1Click.

    mfg
    kpeter

    hi kpeter,

    danke für das Beispiel. Mein ursprüngliches Ansinnen war, dass ich den AnsiString nicht als Member anlegen wollte sondern nur lokal in der aufrufenden Funktion und dann nur als AnsiString-Parameter dem Aufruf mitgebe. Dieser AnsiString wäre für meine Funktion dann ein Dateipfad den ich im OnClick dann weiter verwende. Aber das funktioniert anscheinend nicht.



  • Hi,

    du kannst doch trotzdem jedem Button einen String zuweisen.
    Dazu brauchst du nur ein String-Array:

    const char *Vorname[] = 
       {"Andrea",     "Astrid",   "Britta", "Beate", "Brigitte",
        "Christiane", "Christel", "Diana",  "Doris", "Emilia"};
    

    Verwende die Button-Eigenschaft Tag, die der
    Position des String in dem Array entspricht.
    Button0->Tag = 0, Button1->Tag = 1...

    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
       TButton* btn;
       btn = static_cast<TButton*>( Sender);
       String btnName    = btn->Name;
       String btnCaption = btn->Caption;
       int    btnTag     = btn->Tag;
       Label1->Caption   = "Hier " + btnName + "  " + Vorname[btnTag];
    }
    

    mfg
    kpeter



  • Ich hab das in meinem Beispiel ganz oben vereinfacht mit dem Caption probiert, tatsächlich verwende ich einen Pfad mit Dateiname den ich über Doppelklick auf die Datei und ParamCount() bekomme:

    if ( ParamCount() >= 1 )
       {
        AnsiString sTemp;
        //...
        sTemp = ... // Hier steht jetzt ein Dateipfad drin
        Button2Click(0, sTemp); // Das war die Idee es so zu tun
       }
    

    Ich wollte damit die gleiche Routine verwenden, wie wenn man auf Button2 klickt, aber den Dateipfad noch mitgibt.



  • ja und wieso greifst du dann nicht einfach von Button2Click auf ne globale Variable zu, in der dann der Pfad steht?

    greetz KN4CK3R



  • KN4CK3R schrieb:

    ja und wieso greifst du dann nicht einfach von Button2Click auf ne globale Variable zu, in der dann der Pfad steht?

    greetz KN4CK3R

    weil :

    Trial schrieb:

    Mein ursprüngliches Ansinnen war, dass ich den AnsiString nicht als Member anlegen wollte sondern nur lokal in der aufrufenden Funktion und dann nur als AnsiString-Parameter dem Aufruf mitgebe

    Eine Standardereignis-Behandlung kann man m.E. nicht so umbiegen, wie er vorhat.
    Es sei, man leitet eine Button-Komponente ab und schreibt das Click-Event entsprechend neu.

    mfg
    kpeter


Anmelden zum Antworten