OnClick per Quelltext aufrufen
-
Hab mal ne Frage:
ich hab nen Array von Buttons und nen Array von Labels. Die Buttons haben jeweils ein zugehöriges Label. Also gehört zu button[0] das label[0].
Ich möchte jetzt haben, dass wenn man auf einen button clickt auch gleichzeitig das OnClick ereignis für das zugehörige label ausgelöst wird.
also quasi nach dem mottoif(button[0]->OnClick) label[0]->Onclick = Label1Click;Schon klar das das so nicht geht.
aber wie dann????Hab dazu noch nix im Forum gefunden
Hoffe ihr könnt mir helfen
-
Weise dem OnClick-Ereignis im Objektinspektor doch einfach jeweils die gleiche Methode zu.
Wie das zur Laufzeit geht, steht in der FAQ.Gruß,
Alexander
-
Das müssen aber unterschiedliche Methoden sein.
Habe also eine Methode für die Buttons und eine für die Labels
Wenn man jetzt auf den Button klickt soll halt auch die Methode für das Label aufgerufen werden
-
Screib doch in der OnClick-Funktion für die Buttons:
MeinLabelOnClick(Sender);
-
Wär ne idde
dann übergebe ich aber durch den Sender den Button an die Label funktion.
aber ich muss später in der Label Methode mit dynamic_cast auf das Label und nicht auf den button zugreifen. deshalb soll die funktion schon irgendwie von dem entsprechenden label aufgerufen werden.
is alles nen bisschen verzwickt
-
MORL schrieb:
Screib doch in der OnClick-Funktion für die Buttons:
MeinLabelOnClick(Sender);Oder schreib Dir eine Hilfs-Methode, die Du von beiden Ereignisbehandlungsmethoden aus
aufrufst. Oder erstelle eine Variable vom Typ TNotifyEvent, der Du die Ereignisbehandlungs-
methode für das Label-OnClick-Ereignis zuweist und dann bei jedem Button-OnClick-Ereignis
aufrufst.Gruß,
Alexander
-
Bezüglich direkten Aufrufen der OnClick Methode: Es hindert dich doch niemand daran das Label als Sender zu übergeben.
Also MeinLabelOnClick(Label1);
Wobei ich aber auch das mit der Hilfsmethode besser finde.
-
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