Problem - Namenloser Komponentenzugriff
-
hallo
Ich möchte die Namen von Bilder dynamisch während der LaufZeit verändern.
die vereinfachte Variante sieht etwa so ausvoid __fastcall TfrmSpielbrett::Button1Click(TObject *Sender) { for(int i=0; i < frmSpielbrett->ComponentCount; i++) { if (frmSpielbrett->Components[i]->ClassNameIs("TImage")) { if(frmSpielbrett->Components[i]->Name == "Img01") { dynamic_cast<TImage*>(frmSpielbrett->Components[i])->Name = "Img02"; } } } } //--------------------------------------------------------------------------- void __fastcall TfrmSpielbrett::Img01Click(TObject *Sender) { if (tmSchieben->Enabled != true) { frmMenue->Feldname = "Img01"; Ziehen(); } } //--------------------------------------------------------------------------- void __fastcall TfrmSpielbrett::Img02Click(TObject *Sender) { if (tmSchieben->Enabled != true) { frmMenue->Feldname = "Img02"; Ziehen(); } }Zuerst will ich durch den Klick auf Button1 das TImage "Img01" in "Img02" unbennen.
Danach sollte mit einem Klick auf das unbenannte Image der Wert "Img02" zurück kommen(da es ja jetzt so heisst). Aber es kommt der Wert "Img01" zurück.habe ich etwas vergessen oder mache ich etwas grundlegendes falsch?

BigNeal
-
Verstehe ich das jetzt richtig:
Du hast Zwei OnClick Methoden. Normalerweise wird bei Img01->OnClick Methode Img01Click ausgeführt. Wenn jetzt aber der Button gedrückt wurde soll Methode Img02Click ausgeführt werden.
Hab ich das so richtig verstanden?Wenn ja: Der Name des Images spiel dabei überhaubtkeine Rolle! Du musst einfach in deinem ButtonClick ereigniss folgendes machen:
Img01->OnClick=Img02Click;Damit gibt sagst du dem Image was es machen soll, wenn geklickt wird. Der Name der Komponente und der Name der OnClick-Methode ist nämlich frei wählbar und hat nix mit einer späteren Verknüpfung dieser zu tun.
Sollte ich dich falsch verstanden haben, ignorier mich einfach

-
Du kannst zur Laufzeit zwar die Name-Property des Images ändern, das ist aber nur kosmetisch. Der Name der Variablen selbst kann zur Laufzeit logischerweise nicht geändert werden.
Falls die Antwort von -=]xXx[=- dein eigentliches Problem noch nicht beantwortet hat dann musst du uns ein paar mehr Informationen zum Sinn und Zweck des Ganzen geben.
-
Im Prinzip habe ich mehrere Reihen an Bildern die ich verschieben möchte
ich versuche es mal in eimem Beispiel darzustellen:Bilder 1-7 [1][2][3][4][5][6][7] jetzt setze ich ein weiteres Bild davor Bild 9 [9][1][2][3][4][5][6][7] das ganze schiebe ich um 1 Feld nach rechts [9][1][2][3][4][5][6][7] benne die Bilder um (von rechts nach links) [1][2][3][4][5][6][7][9]So habe ich wieder die gleiche ausgangslage wie am anfang und doch sind die Bilder verschoben.
da ich aber die "koordinaten" der Bilder mit einem Click auslese möchte ich dass immer der Click auf das Bild in der erstenspallte eine 1 zurück gibt in der zweiten spalte eine 2, etc.. (Bild 9 gibt nichts zurück -> stelle ich mit enabled ab)wenn ich jetzt die "Click-Funktion" so verschiebe:
Img9->OnClick=Img1Click; Img1->OnClick=Img2Click; Img02->OnClick=Img3Click; etc..passiert dan nicht, dass wenn ich Auf Img1 klicke ich auf Img2Click und da weiter auf Img3Click etc weiter geleitet werde?

ich hoffe ich habe mich einigermassen klar ausgedrück

aber schonmal thx für die aufmerksamkeitBigNeal
-
Ich würde das anders lösen!
Nenn die Bilder einfach wie es dir passt. Nutze dann die "Tag"-Eigenschaft der Bilder (z.B. Img01->Tag) um ihnen ihre position zuzuweisen. Tag ist einfach nur nen int-Wert ohne spezielle Funktion, wie dir die Hilfe sicherlich auch schnell bestätigt

Und dann hast du einfach nur ein einziges OnClick-Ereignis
void __fastcall TfrmSpielbrett::BildchenClick(TObject *Sender) { if (tmSchieben->Enabled != true) { if(Sender->ClassNameIs("TImage")) { frmMenue->Feldname = "Img"+IntToStr((dynamic_cast<TImage*>(Sender))->Tag); Ziehen(); } } }Und nun gibst du allen Images die due erstellst das gleiche OnClick-Ereignis.
Deiner Aussage nach zu schließen, hast du das Modell, das hinter den Komponenten und den Ereignissen steckt noch nicht ganz verstanden. Du kannst deinem OnClick irgend eine Methode zuordnen, die als Parameter ein TObject* erwartet. Wie die heißt und was die macht, das ist dem Ereigniss und der Komponente (eigendlich dem Objekt) schnurzpiepe....
Und desshalb kannst du auch hunderten von Objekten die gleiche Methode für das OnClick zuweisen.
-
danke, genau das hat mich jetzt weiter gebracht.. jetzt läuft es
das Click verhalten aller Images
void __fastcall TfrmSpielbrett::Img00Click(TObject *Sender) { if (tmSchieben->Enabled != true) { if(Sender->ClassNameIs("TImage")) { if((dynamic_cast<TImage*>(Sender))->Tag<10) frmMenue->Feldname = "Img0"+IntToStr((dynamic_cast<TImage*>(Sender))->Tag); else frmMenue->Feldname = "Img"+IntToStr((dynamic_cast<TImage*>(Sender))->Tag); Ziehen(); } } }und beim Schieben der Images verschiebe ich einfach die namen und die weise die tags zu
im stil vonImg15->Name = "Img16"; Img16->Tag = 16; Img14->Name = "Img15"; Img15->Tag = 15; Img13->Name = "Img14"; Img14->Tag = 14; Img12->Name = "Img13"; Img13->Tag = 13; Img11->Name = "Img12"; Img12->Tag = 12; Img10->Name = "Img11"; Img11->Tag = 11; ImgSchieb->Name = "Img10"; Img10->Tag = 10;Die Namen muss ich auch verschieben da ich eigentlich ein 7x7 Bilderarray habe+ 1 Bild zum schieben. ich kann so in alle richtungen schieben, und trotzdem kriege ich noch die richtigen koordinaten mit dem Click
thx für die Info
BigNeal
-
So ganz spontan ist mir noch eine Sache aufgefallen. Du solltest das dynamic_cast nur einmal durchführen. Das macht die ganze sache auch etwas übesichtlicher:
void __fastcall TfrmSpielbrett::Img00Click(TObject *Sender) { if (tmSchieben->Enabled != true) { if(Sender->ClassNameIs("TImage")) { TImage* img=dynamic_cast<TImage*>(Sender); if(img->Tag<10) frmMenue->Feldname = "Img0"+IntToStr(img->Tag); else frmMenue->Feldname = "Img"+IntToStr(img->Tag); Ziehen(); } } }
-
ob es sich wirklich lohnt wegen diesen 3 zeilen eine variable anzulegen, darüber kann man sich streiten ob es übersichtlicher wird.. aber ich habe es mir auch schon überlegt gehabt..
BigNeal
-
xXx Vorschlag hat was für sich, insbesondere wenn man nach dem dynamic_cast noch prüft, ob man einen gültigen Zeiger erhalten hat. Dann kann die Prüfung mit ClassNameIs auch komplett entfallen.