Memory Feld
-
Hallo,
ich hab heute mal versucht ein Memory Spiel zu erstellen.
Hab aber direkt, nachdem ich das Feld aus SpeedButtons erstellet habe, ein Probelm
TForm1 *Form1; TSpeedButton* Karte; int Karten_ID; //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { for(int x = 0; x < 5; x ++){ for(int y = 0; y < 5; y ++){ Karte = new TSpeedButton(Form1); Karte->Parent = Form1; Karte->Width = 40; Karte->Height = 80; Karte->Left = 10 + (y * 45); Karte->Top = 10 + (x * 85); Karte->Tag = Karten_ID; Karte->OnClick = Karten_Klick; Karte->Caption = Karten_ID; Karten_ID ++; } } }Dann hab ich dynamisch eine OnClick Funktion aufgebaut ...
void __fastcall TForm1::Karten_Klick(TObject *Sender) { Form1->Caption = Karte->Tag; }Nur wie mach ich es nun, dass der erkennt auf welchen Button ich klicke?
Er zeigt mir so halt immer die letzte ID an. Also den Button 24 in diesem Fall ...
-
Hallo,
Schau mal in die FAQ
-
Hallo,
mmh ja damit komm ich irgendwie nicht weiter ...
Wie kann ich mit dem Code denn nun rausfinden, auf welchem Button ich geklickt habe?
-
dynamic_cast wird eine lösung sein
mfg
BigNeal
-
und mach bitte
TSpeedButton* Karte; und int Karten_ID; mal lokal im Konstruktor. Die haben da global nichts zu suchen. Desweiteren sollte Karten_ID vor der Verwendung auch noch initialisiert werden (auf 0).
-
Ups..
wie ich gerade beim genaueren anschauen des Codes bemerkt habe, hast du ein Prinzipielles Speicherleck.
TSpeedButton* Karte; ist ja ein Pointer, den du jedesmal überschreibst.
aber für jedes new das du aufrufst musst du musst du auch ein delete aufrufen.
aber wenn du deinen Pointer überschreibst, verliehrst du ja die Adresse des reservierten Speichers vom letzten TSpeedButton und kannst somit den Speicher nicht mehr freigeben.du solltest mit einem Array an TSpeedButton arbeiten
mfg
BigNeal
-
Das stimmt so nicht unbedingt. Mit
Karte = new TSpeedButton(Form1);
trägt er ja den SpeedButton in die Component-Liste der Form ein, welche dann auch für das Löschen zu sorgen hat. Wir haben hier also kein Speicherleck. Wenn man so wie ich vorgeschlagen hab die Variablen lokal macht, wird das deutlicher. Alternativ ist aber auch ein Array möglich.
Was ist ein Prinzipielles Speicherleck.
-
Braunstein schrieb:
Das stimmt so nicht unbedingt. Mit
Karte = new TSpeedButton(Form1);
trägt er ja den SpeedButton in die Component-Liste der Form ein, welche dann auch für das Löschen zu sorgen hat. Wir haben hier also kein Speicherleck.Achja stimmt.. der Owner

Aber wenn er auf die einzelnen SpeedButtoms zugreifen will, sollte er ein Array erstellen.Braunstein schrieb:
Was ist ein Prinzipielles Speicherleck.

etwas was mir in meiner halbverschlafenen müdigkeit gerade in denn sinn kam

mfg
BigNeal
-
BigNeal schrieb:
Aber wenn er auf die einzelnen SpeedButtoms zugreifen will, sollte er ein Array erstellen.
Wenn er nur über den OnClickEvent der SpeedButtons zugreifen will ist ein Array nicht nötig. Du hast ja selbst mit dynamic_cast die Lösung angedeutet.
Das sollte für diese Fälle reichen.void __fastcall TForm1::Karten_Klick(TObject *Sender) { TSpeedButton *speed = dynamic_cast<TSpeedButton*>(Sender); if( speed != 0 ) { Form1->Caption = speed->Tag; // mach jetzt irgendwas mit dem Button } }
-
ich hätte eine paintbox und eine imagelist genommen.^^
-
Vielen Dank für die ganzen Antworten

Die Lösung von Braunstein klappt wunderbar!Dankeschön