AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein arbeiten mit zur Laufzeit Objekten im dynamischen array
Thema durchsuchen
Ansicht
Themen-Optionen

arbeiten mit zur Laufzeit Objekten im dynamischen array

Ein Thema von peacook94 · begonnen am 17. Jan 2010 · letzter Beitrag vom 20. Jan 2010
Antwort Antwort
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, 16: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
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.168 Beiträge
 
Delphi 12 Athens
 
#2

Re: arbeiten mit zur Laufzeit Objekten im dynamischen array

  Alt 17. Jan 2010, 17:02
Willkommen

Delphi-Quellcode:
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;
Wozu die Schleife, wenn auch etwas Mathe ausreicht?
Warum nutzt du einmal Form1 und dann wieder Self? (ist in diesem Fall doch wohl die selbe Form)

Zitat von peacook94:
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 ..." ).
Eventuell änderst du das globale "i" noch irgendwo anders?

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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
peacook94

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

Re: arbeiten mit zur Laufzeit Objekten im dynamischen array

  Alt 17. Jan 2010, 18:31
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.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.168 Beiträge
 
Delphi 12 Athens
 
#4

Re: arbeiten mit zur Laufzeit Objekten im dynamischen array

  Alt 17. Jan 2010, 18:46
Zitat:
weil es in dem Buch mit dem ich Delphi gelernt hab so drin steht
Ja, leider wird diese globale Variable zu oft verwendet.
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:
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;
oder eben
Delphi-Quellcode:
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;
So brauchst du dich nicht um die Verwaltung der Liste zu kümmern.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
peacook94

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

Re: arbeiten mit zur Laufzeit Objekten im dynamischen array

  Alt 20. Jan 2010, 13:41
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
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:43 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz