OnClick per Quelltext aufrufen
-
das label ist aber in der Ereignisbehandlungsroutine für das OnClick ereignis des buttons nicht gültig. das ist nur für eine andere funktion gültig.
deshalb kann ich das nicht als sender übergeben.
-
Sind bei dir die Labels und die Buttons in unterschiedlichen Forms ?
-
ne die sind in der gleichen form
sogar in der gleichen funktion.
-
hunter0707 schrieb:
ne die sind in der gleichen form
sogar in der gleichen funktion.
Ich glaube, es wäre an der Zeit, etwas Code zu zeigen. Für mich ist das nur
schwer zu verstehen.Gruß,
Alexander
-
Genau!
Wenn Label und Button zur gleichen Form gehören muss er auch Zugriff auf beide habe, es sei denn seine OnClick Funktion gehört nicht zur Form, was ein bischen seltsam wäre.
-
void TForm1::BCreate(int bombs, int bpzeile, int bpspalte) { for (int i = Form1->ComponentCount - 1; i >= 9; i--)//alle Objekte delete Form1->Components[i]; //löschen //************************************************** //****************Buttons und Labels**************** //************************************************** int bpixel=16, spalte=0, zeile=0, maxbutton=bpzeile*bpspalte; bleft=maxbutton-bombs-1; const int x=480; //Array von Buttons und Labels erstellen TButton *button[x]; TLabel *label[x]; for (int i = 0; i < maxbutton; i++) { button[i] = new TButton(this); label[i] = new TLabel(this); ... //Eigenschaften zuweisen button[i]->OnMouseDown=Button1MouseDown; } } //----------------------------------------------------- void __fastcall TForm1::Button1MouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y) { if(Button==mbRight) { if(dynamic_cast<TButton*>(Sender)->Caption == "B") dynamic_cast<TButton*>(Sender)->Caption = ""; else dynamic_cast<TButton*>(Sender)->Caption = "B"; } if(Button==mbLeft) { if(dynamic_cast<TButton*>(Sender)->Tag == 1) { Application->MessageBox("Leider Verloren", NULL, MB_OK); FormCreate(0); } else { dynamic_cast<TButton*>(Sender)->Visible = false; bleft--; if(bleft==0) Application->MessageBox("Gewonnen", NULL, MB_OK); } } }Das Programm heisst minessweeper

glaub dann kann sichd a jeder was drunter vorstellenund das problem besteht halt darin, dass ich die buttons, die um ein label herum liegen prüfen muss ob sie ne bombe enthalten. wenn das nicht der fall ist sollen die buttons um das label automatisch aufgedeckt werden. an sonsten funktioniert das prog schon
-
Und was spricht dagegen, die Buttons und Labels als Membervariablen der Form zu deklarieren?
Gruß,
Alexander
-
-
Hast Du auch schon mal über die Verwendung von TList oder Vektoren nachgedacht?
Gruß,
Alexander
-
hmmm glaub ich hab mein problem gelöst. wenn ich die buttons und labels einfach außerhalb der funktion deklariere gehts ja eigentlich

hatte irgendwie wohl ne denkblokade
Trotzdem danke für die Hifle
-
hab aber noch nen kleines problem
ich hab greife ja in der Ereignisbehandlungsroutine für das OnMouseDown ereignis über den Sender auf das jeweilige Objekt zu.
Wie komm ich denn jetzt an die Index Nummer von dem Objekt für das das Ereignis aufgerufen wurde.button[i]->OnMouseDown = Button1MouseDown; ... void __fastcall TForm1::Button1MouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y) { ...// hier brauch ich den Index des Objekts // also das i }
-
Wie wäre es, wenn Du Dein Array durchgehst (z.B. for-Schleife) und auf
Gleichheit prüfst?
Oder ich wiederhole mich:Alexander Kempf schrieb:
Hast Du auch schon mal über die Verwendung von TList oder Vektoren nachgedacht?
Gruß,
Alexander
-
oder du schreibst den Index in die Tag Eigenschaft.
Noch was zu dem casten in deiner MouseDown Routine. Erzeuge dir lieber eine temporäre TButton Variable, lege den gecasteten Wert dahin und verwende dann diese. So sieht das mit dem häufigen dynamic_casts doch sehr unübersichtlich aus. Desweiteren solltest du überprüfen ob der cast geklappt hat (auf NULL prüfen).Ciao