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:
MyLabels: array of TLabel;
i : integer;
oben,links : integer;
Da ich nicht weiß wieviele Label zur Laufzeit erzeugt werden, habe ich zum "Stellenzählen" eine Zählvariable vereinbart.
Diese wird nun bei jedem durchlauf erhöht und ist vorher auf 0 gesetzt.
Jetzt das Problem:
Delphi-Quellcode:
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;
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 ..." ).
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