zu Faq : Komponenten benutzen - Sendernamen bei einer OnClick-Prozedur identifizieren
-
Hallo,
ich bin relativ neu eingestiegen in C++ und den Borland Compiler und habe mich jetzt schon durch viele Probleme alleine duchgemogelt. Nun hab ich aber ein wirklich kleines Problem, das hier auch schon mehrfach angesprochen wurde, wo ich aber die Lösung nicht verstehe.
Mein Problem ist folgendes.
Ich erzeuge mehrere dynamische Buttons und will einfach abfragen welcher gedrückt worden ist. Ich komm einfach nicht auf die Lösung, hab auch schon mehrere Stunden gelesen.
Ich kann z.B. Buttons erzeugen, und diesen ein ereignis zuordnen!
z.B.
spbutton[i]->Left = (teilekat[u]->Width-80)/2;
spbutton[i]->Visible = true;
spbutton[i]->Top = (butjesheetzaehler[u]-1)*130;
spbutton[i]->OnClick = Edit1Change;Aber wie erfahre ich in der Prozedure Edit1Change welcher Knopf gedrückt wurde.
Edit1Change ist ist Standart Procedure für ein Editfeld.
Wie gesagt, wahrscheinlich denke ich zu umständlich und es ist ganz einfach.
Danke im voraus!
-
Du könntest die Tag Eigenschaft verwenden. Also in jedem neu erzeugten Button den Tag auf den aktuellen Index setzen. Das kannst du dann mittels dynamic_cast auswerten und weißt so, der wievielte Button angeklickt wurde.
-
Danke für die prompte Anwort,
hab noch nie mit tag und dynamic_cast gearbeitet, wenn man aber erstmal weis wies geht funktionierts klasse.
Danke nochmal...
-
Außer der Verwendung von Tags, könntest Du natürlich auch jedem Button noch einen Namen zuweisen und diesen in der Ereignis-
behandlungsprozedur abfragen.spbutton[i]->Name = "EindeutigerButtonName";Und in der OnChange-Prozedur:
TButton* btn = dynamic_cast<TButton*> (Sender); if (btn && btn->Name == "EindeutigerButtonName") tuIrgendwasSinnvolles(btn);Da Du Dir die Instanzen der Buttons ja ohnehin in einem Array gespeichert hast, könntest Du in der OnChange-Prozedur natürlich
auch einfach auf Gleichheit abprüfen:for (int i=0; i<AnzahlDerButtons; ++i) if (Sender == spbutton[i]) tuIrgendwasSinnvolles(spbutton[i]);Anstatt die Buttons in einem Array zu speichern, könntest Du sie auch in ein Liste, TList oder TStringList, speichern. Damit
lässt sich dann direkt abprüfen, ob der Button in der Liste enthalten ist.Ich weiß allerdings nicht, ob das jetzt irgendwie Deine Frage beantwortet.
Gruß,
Alexander
-
Hallo Alexander,
danke für deine Antwort,
für mein aktuelles Problem ist die Nummerierung der Buttons sinnvoller, da hinter den Buttons auch noch ein anderes Array mit dem selben Index liegt. Für die Zukunft ist es aber eine wichtige Info für mich, da ich ja noch nie mit dynamic_casts gearbeitet habe.Danke nochmals.....

-
eddie_teddie schrieb:
da hinter den Buttons auch noch ein anderes Array mit dem selben Index liegt.
Wäre es da nicht sinnvoller eine kleine Klasse zu schreiben, die den Button und das jeweils zugehörige Array-Element aus dem anderen Array enthält, und
dann jeweils Instanzen der Klasse in einem gemeinsamen Array (oder einer Liste) zu speichern anstatt zwei Arrays zu verwalten?Gruß,
Alexander
-
Hallo Alexander,
ich nehme stark an, das du recht hast. Theoretisch weis ich auch genau damit umzugehen, jedoch habe ich noch nicht den erforderlichen "mut", so durchgängig objektorientiert zu Programmieren. Ich habe objektorientierte Programmieren nur aus Büchern, und tue mir damit noch extrem schwer.
Wenn ich mal mehr Routine hab, und auch mit meinen Büchern zu lesen weiter bin, werde ich dies auch mehr beherzigen!Danke für deine Anregungen
Grüsse Erik