Einzelnen Beitrag anzeigen

peacook94

Registriert seit: 9. Okt 2009
Ort: Erfurt
3 Beiträge
 
Delphi 7 Professional
 
#1

arbeiten mit zur Laufzeit Objekten im dynamischen array

  Alt 17. Jan 2010, 17:53
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
  Mit Zitat antworten Zitat