zur laufzeit generierten button ansprechen
-
wie deklarier ich denn events für arrays von komponenten?
-
Auf dem gleichen Wege durch einfache Zuweisung über den Array-Operator []
also z.B.:... for(int x = 0; x <= 25; x++) { myObject[x] = new TObject(Formx); myObject[x]->Parent = Formx; myObject[x]->OnMouseMove = myObjectMouseMove; myObject[x]->OnClick = myObjectOnClick; myObject[x]->Caption = IntToStr(x) myObject[x]->Name = "myObject" + IntToStr(x); } ... void __fastcall Formx::myObjectOnClick(TObject* Sender) { DoSomething(); }Über Sender kann man später auswerten, welche Komponente das Ereignis ausgelöst hat.
-
Ü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.