zur laufzeit generierten button ansprechen



  • Über Sender kann man später auswerten, welche Komponente das Ereignis ausgelöst hat.

    wie geht das?
    (sorry, bin ein ziemlicher noob was das programmieren anbelangt...)



  • Für einen Button könnte das so aussehen:

    void __fastcall Formx::ChangeButtonCaption(TObject* Sender)
    {
      ((TButton*)Sender)->Caption = "neue Caption";
    }
    
    // Aufruf der Funktion
    
    ...
    Button1->Caption = "alte Caption";
    ChangeButtonCaption(Button1);
    ...
    

    Jetzt könntest Du einem Array aus z.B. Button-Steuerelementen eine einzige Ereignisbehandlungroutine für OnClick zuweisen, aber wüsstest immer genau, welcher Button diese Routine aufgerufen hat.



  • hab mal etwas anderes probiert. ich weise allen buttons den gleichen onclick event zu:

    void __fastcall TForm1::ButtonClick(TObject *Sender)
    {
      ((TButton*)Sender)->Caption = "Text";
    }
    

    bei buttons, die schon von anfang an drin sind funktioniert das tiptop, jedoch zur laufzeit generierte buttons sprechen auf den befehl (TButton*)Sender)->Caption nicht an. wieso?



  • Doch, das sollte eigentlich problemlos funktionieren, egal ob die Steuerelemente zur Design,- oder Laufzeit erstellt werden. Poste mal Deinen relevanten Code.



  • hat sich jetzt gelöst das problem (hatte ein flüchtigkeitsfehler im progr.-text).
    das einzige problem, das ich jetzt noch habe, ist mit den arrays. ich habe folgenden programmtext:

    void __fastcall TForm1::ButtonClick(TObject *Sender)
    const int x = 10;                                  //beispiel aus faq
    TImage *img[x];
    
    for (int i = 0; i < x; i++)
    {
      img[i] = new TImage(this);
      img[i]->Parent = this;
      img[i]->Width = 32;
      img[i]->Height = 32;
      img[i]->Top = i * 35;
      img[i]->Show();
      img[i]->Canvas->Brush->Color = clWhite; // nur zum Test
      img[i]->OnClick = imgClick;
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::imgClick(TObject *Sender)
    {
      ((TImage*)Sender)->Width = 120;
    }
    

    eigentlich sollte jetzt sich jetzt beim klicken auf eines der images die grösse ändern, aber es passiert nichts...



  • probier mal bei Deinem Array TImage::AutoSize auf false zu setzen.



  • hat nichts genutzt.

    edit: gibt es eigentlich eine funktion die einfach alle veränderungen die während des benützens des programms angefallen sind abspeichert?



  • Dann prüfe mal mit dem Debugger Deinen Programmablauf und ob Deine eigene Routine überhaupt angesprungen wird.



  • sie wird angesprungen.
    ausserdem funktionieren ja andere befehle. (zb top oder so)



  • Das Bild ist anschliessend 120 Pixel breit, wie du leicht prüfen kannst, wenn du statt TImage z.B. mal TPanel verwendest.



  • super, hast recht gehabt.


Anmelden zum Antworten