Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Wie Array mit Pointern auf Klassen-Instanzen füllen? (https://www.delphipraxis.net/18875-wie-array-mit-pointern-auf-klassen-instanzen-fuellen.html)

Nonsense 25. Mär 2004 16:21


Wie Array mit Pointern auf Klassen-Instanzen füllen?
 
Hallo Community,

ich möchte gerne ein Array of Pointer mit Zeigern auf Klassen-Instanzen füllen. Leider klappt das bei mir nicht so ganz.
Ich habe als erstes meine Klasse mit dem Array of Pointer:
Delphi-Quellcode:
  TWorld = class
  private
    [ ... ]
    FBufferArray: array of array of Pointer;
  public
    constructor Create(WorldHeight, WorldWidth: Integer);
    [ ... ]
  end;
Und dann noch eine andere Klasse TGround. Jetzt möchte ich in den contructor eine Schleife, die dass komplette Array mit Zeigern auf TGround-Instanzen füllt. D.h. ich müsste in der Schleife die Instanzen auch erstellen. Aber wie mache ich das? Ich kann ja schließlich nicht sowas wie
Delphi-Quellcode:
  for i := 0 to FWorldHeight do
    for j := 0 to FWorldWidth do
    begin
      FBufferArray[i][j] := new(TGround.Create);
    end;
schreiben.

Hat jemand eine Idee?

Danke im Voraus.

MfG

neolithos 25. Mär 2004 16:28

Re: Wie Array mit Pointern auf Klassen-Instanzen füllen?
 
Wie wäre es damit...

Delphi-Quellcode:
  TWorld = class
  private
    [ ... ]
    FBufferArray: array of array of TCreatur;
  public
    constructor Create(WorldHeight, WorldWidth: Integer);
    [ ... ]
  end;
Delphi-Quellcode:
  SetLength(fBufferArray, FWorldHeight);
  for i := 0 to FWorldHeight - 1 do
    for j := 0 to FWorldWidth - 1 do
    begin
      SetLength(fBufferArray[i], FWorldWidth);
      FBufferArray[i][j] := TGround.Create;
    end;

Nonsense 25. Mär 2004 16:30

Re: Wie Array mit Pointern auf Klassen-Instanzen füllen?
 
@neolithos: Geht leider nicht, da meine TGround Klasse nur ein Beispiel ist. Wenn das ganze läuft, sollen da Pointer von 4 verschiedenen Klassen in das Array rein. Deshalb ja auch das Array of Pointer, da ich ja sonst nicht 4 verschiedene Klassen in einem Array speichern kann.

neolithos 25. Mär 2004 16:34

Re: Wie Array mit Pointern auf Klassen-Instanzen füllen?
 
Dann tausche TGround durch TObject.

Das ist "so eine Art" Pointer für Klassen, denn wie ich verstanden habe sind es ja 4 Klassen.

shmia 25. Mär 2004 16:37

Re: Wie Array mit Pointern auf Klassen-Instanzen füllen?
 
Zitat:

FBufferArray: array of array of Pointer;
Das geht sowieso nicht!
Es darf höchsten eine Dimension offen bleiben.
Also etwa:
array[1..100] of array of Pointer

Der Datentyp Pointer ist auch Falsch.
Da alle Klasse in Delphi von TObject abgeleitet sind wäre TObject der richtige
Datentyp.

Angenommen du möchtest ein 2-dim. Array mit offenen Grenzen.
Dann muss das mehrdimensionale Array auf das eindimensionale Array abgebildet
werden.

Delphi-Quellcode:
type
   TMeinObjArray = array of TObject; // offenes eindim. Array von Objekten

   maxX := 100; // zur Laufzeit festlegen
   maxY := 50;

// Speicher besorgen
   SetLength(meinObjArray, maxX*maxY);

// befüllen mit Instanzen
   for i:= 0 to maxY-1 do
      for j := 0 to maxX-1 do
         // da beide Dimensionen offen sind
         // müssen wir selber rechnen
         meinObjArray[i*maxX+j] := TGround.Create;

// Zugriff auf TGround an Position 13, 40
   TGround(meinObjArray[13*maxX+40]).LiftUpTotheSky(....);


// Instanzen freigeben
   for i := 0 to maxX*MaxY-1 do
   begin
      TGround(meinObjArray[i]).Free;
   end;
Schau dir mal TObjectList an; das könnte dir nützlich sein.

Nonsense 25. Mär 2004 16:37

Re: Wie Array mit Pointern auf Klassen-Instanzen füllen?
 
Zitat:

Zitat von neolithos
Dann tausche TGround durch TObject.

Das ist "so eine Art" Pointer für Klassen, denn wie ich verstanden habe sind es ja 4 Klassen.

Hatte mein Problem mal vor ein paar Wochen beschreiben, kannst ja mal gucken:
http://www.delphipraxis.net/internal...ct.php?t=19802

Meine Idee war damals, dass ich ein Array of TOberklasse erstelle und dann die verschiedenen Unterklassen welche sich von TOberklasse ableiten in der Array speichere. Nur hatte das irgendwie nicht hingehauen.

Naja, und ich dache mir das jetzt so:
1. Instanz von einer der Unterklassen erstellen (z.B. TGround, TGrass, etc.)
2. Pointer der Instanz im Array speichern

neolithos 25. Mär 2004 16:45

Re: Wie Array mit Pointern auf Klassen-Instanzen füllen?
 
Ich habe oben noch ein paar kleine Änderungen vorgenommen.

Warum soll das nicht gehen?
Gibt es Laufzeit bzw. Compilerer fehler.

Übrigens

TObject.Create liefert einen Zeiger auf das neue Object. Ich weiß nicht was das mit NewInstance soll.

Nonsense 25. Mär 2004 16:59

Re: Wie Array mit Pointern auf Klassen-Instanzen füllen?
 
Zitat:

Zitat von neolithos
Ich habe oben noch ein paar kleine Änderungen vorgenommen.

Warum soll das nicht gehen?
Gibt es Laufzeit bzw. Compilerer fehler.

Übrigens

TObject.Create liefert einen Zeiger auf das neue Object. Ich weiß nicht was das mit NewInstance soll.

Bei
Delphi-Quellcode:
  FBufferArray[i][j] := TGround.Create;
bekomme ich eine Zugriffsverletzung.

neolithos 25. Mär 2004 17:02

Re: Wie Array mit Pointern auf Klassen-Instanzen füllen?
 
So jetzt probier ich es mal selber!

>>> Gedult!

Nonsense 25. Mär 2004 17:06

Re: Wie Array mit Pointern auf Klassen-Instanzen füllen?
 
Zitat:

Zitat von neolithos
So jetzt probier ich es mal selber!

>>> Gedult!

:wink: 8)


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:24 Uhr.
Seite 1 von 3  1 23      

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 by Thomas Breitkreuz