![]() |
arbeiten mit zur Laufzeit Objekten im dynamischen array
Hallo. :)
das ist hier mein erster Post, aber ich finde zu diesem Problem weder in der Delphi-Hilfe, noch sonst irgendwo im großen weiten Internet eine Antwort. Ich hoffe ihr könnt mir helfen: Ich habe angefangen ein kleines 2D-Spiel zu programmieren, bei dem zur Laufzeit beliebig viele Label in einem Bereich des Bildschirms zufällig generiert werden. ( Label deswegen, weil sie auf Klicks reagieren ) Diese sollen dann vom Benutzer weggeklickt werden. Der Spieler muss aber schneller wegklicken, als neue dazu kommen. So die Idee. :) Aber schon gleich am Anfang liegt das Problem: Beim Erzeugen der Label. Ich habe das, um Speicher zu sparen und da ich nicht weiß wieviele Label das Programm erzeugen wird, in einem dynamischen array angelegt, sodass in jedem Timerdurchlauf ( die Label werden im Timer generiert ) ein Label erzeugt wird und eine Stelle im array einnimmt.
Delphi-Quellcode:
Da ich nicht weiß wieviele Label zur Laufzeit erzeugt werden, habe ich zum "Stellenzählen" eine Zählvariable vereinbart.
MyLabels: array of TLabel;
i : integer; oben,links : integer; Diese wird nun bei jedem durchlauf erhöht und ist vorher auf 0 gesetzt. Jetzt das Problem:
Delphi-Quellcode:
Das erste Label wird vorschriftsmäßig erzeugt. Dann tritt allerdings der Fall ein, dass " i " auf 2 erhöht wird. Zu der Zeit sind allerdings noch nicht 2 Objekte vorhanden. Dort kommt er dann durcheinander und produziert Fehlermeldungen ( "Zugrifffsverletzung in Adresse ..." ).
procedure TForm1.Timer1Timer(Sender: TObject);
begin i := i + 1; SetLength(MyLabels,length(MyLabels) + 1); MyLabels[i] := TLabel.Create(self); MyLabels[i].Parent := Form1; MyLabels[i].Show; MyLabels[i].Color := clLime; repeat // Die Schleife habe ich eingebaut, damit das Label oben := random(479); // nur in dem vorgegebenen Bereich auftauchen links := random(479); until (oben >= 200) and ( links >= 200 ); MyLabels[i].Top := oben; MyLabels[i].Left := links; end; Die Funktion SetLength() danach aufzurufen hat auch nicht funktioniert. Gibt es eine Möglichkeit diesen Fall zu umgehen :?: Es Wäre echt nett, wenn mir da jemand helfen könnte. Danke schon im Voraus :) |
Re: arbeiten mit zur Laufzeit Objekten im dynamischen array
Willkommen :hi:
Delphi-Quellcode:
Wozu die Schleife, wenn auch etwas Mathe ausreicht?
procedure TForm1.Timer1Timer(Sender: TObject);
var i: Integer; begin i := length(MyLabels); SetLength(MyLabels, i + 1); MyLabels[i] := TLabel.Create(Self); MyLabels[i].Parent := Self; MyLabels[i].Show; MyLabels[i].Color := clLime; MyLabels[i].Top := 200 + random(279); MyLabels[i].Left := 200 + random(279); end; Warum nutzt du einmal Form1 und dann wieder Self? (ist in diesem Fall doch wohl die selbe Form) Zitat:
PS: Entfernst du die Labels auch wieder aus dem Array, wenn sie angeklickt/freigegeben wurden? PSS: Eine TObjektList macht sich bestimmt besser, statt des Arrays. |
Re: arbeiten mit zur Laufzeit Objekten im dynamischen array
Dankeschön für den Hinweis :)
also das mit dem self und dann wieder Form1 ist nur für mich später zum nachvollziehen, weil es in dem Buch mit dem ich Delphi gelernt hab so drin steht :) Aber klar man kann es auch gleich beide Male mit "self" machen. ( bin auch noch ein Anfänger :) ) Hm ... die TObjectList hab ich vorher noch gar nicht irgendwie in Betracht gezogen, aber das ist eine gute Idee, danke. :) Ich werde es mal ausprobieren. :) PS.: Das mit dem Entfernen, wenn darauf geklickt wurde, wär gekommen, wenn das Generieren funktioniert hätte. Aber ja so hatte ich das eigentlich gedacht und, dass ich den freigegeben Platz dann wieder hätte nutzen können. :) |
Re: arbeiten mit zur Laufzeit Objekten im dynamischen array
Zitat:
Bei anderen/eigenen Klassen kommt man auf soeine Idee fast nie und arbeitet direkt mit Self. Es wäre besser gewesen, wenn es diese Variable erst garnicht gäbe.
Delphi-Quellcode:
oder eben
var MyLabels: array of TLabel;
procedure TForm1.Timer1Timer(Sender: TObject); var i: Integer; begin i := length(MyLabels); SetLength(MyLabels, i + 1); MyLabels[i] := TLabel.Create(Self); MyLabels[i].Parent := Self; MyLabels[i].Color := clLime; MyLabels[i].Top := 200 + Random(279); MyLabels[i].Left := 200 + Random(279); MyLabels[i].Show; // vielleicht besser erstmal alles zu setzt end;
Delphi-Quellcode:
So brauchst du dich nicht um die Verwaltung der Liste zu kümmern.
var MyLabels: TObjectList;
// MyLabels := TObjectList.Create; // und am Ende // MyLabels.Free; nicht vergessen procedure TForm1.Timer1Timer(Sender: TObject); var Label: TLabel; begin Label := TLabel.Create(Self); Label.Parent := Self; Label.Color := clLime; Label.Top := 200 + Random(279); Label.Left := 200 + Random(279); Label.Show; MyLabels.Add(Label); end; |
Re: arbeiten mit zur Laufzeit Objekten im dynamischen array
Dankeschön :)
Ich habs jetzt mit der Objektliste gemacht und es funktioniert. :) Jetzt brauch ich nur noch die Klicks verwalten. :) Du hast mir sehr geholfen. Danke :) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:12 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz