![]() |
Array mit Instanzen von Objekten füllen?
Hallo Community,
kann ich ein Array mit Instanzen von Objekten (Klassen) füllen? Beispiel, ich habe 2 Klassen:
Delphi-Quellcode:
Kann ich jetzt ein Array erstellen, z.B. ein
TOberKlasse = class
private { ... } public { ... } end; TUnterklasse = class(TOberKlasse) private { ... } public { ... } end;
Delphi-Quellcode:
Und es dann mit Instanzen der Unterklasse (!) füllen? Welche Alternativen gibt es?
MyArray : array of TOberKlasse;
Danke im Voraus. GReetings |
Re: Array mit Instanzen von Objekten füllen?
Also wenn ich etwas nicht weiß, dann mache ich mir ein neues, leeres Projekt auf, und teste das.
Zitat:
|
Re: Array mit Instanzen von Objekten füllen?
Ja, bin gerade dabei.
Mein Problem ist, dass es eine Haupt-Klasse gibt, von der 2 andere Klassen abgeleitet werden von denen wiederum jeweils 2 Klassen abgeleitet werden.
Delphi-Quellcode:
In diesem Array möchte ich dann die Instanzen von TSand, TGrass, TFox und TRabbit speichern (bunt gemischt) und natürlich über das Array auf die einzelnen Instanzen zugreifen.
TCreature
/ \ TGround TAnimal / \ / \ TSand TGrass TFox TRabbit Zusätzlich möchte ich Instanzen auch austauschen, d.h. z.B. auf MyArray[2][14], welches eine Instanz von TSand gespeichert hat, wird eine Ableger von TGrass gespeichert, d.h. ausgetauscht. Geht das überhaupt? |
Re: Array mit Instanzen von Objekten füllen?
Habe mal folgendes probiert, klappt irgendwie nicht.
(Incompatible types: TCreature and TClass) Hat jemand eine Idee?
Delphi-Quellcode:
procedure TWorld.AddCreature(PosX, PosY: Integer; CreatureClass: TClass);
begin FWorldArray[PosX][PosY] := CreatureClass; end; |
Re: Array mit Instanzen von Objekten füllen?
wenn ich das problem richtig verstanden habe, müsst das funzen:
Delphi-Quellcode:
var
FWorldArray[0..5][0..5] of TCreature; //und beim Hinzufügen: FWorldArray[0, 0] := TFox.Create; //Oder was man halt braucht //und im fall der zugriff: if FWorldArray[0, 0] is TFox then (FWorldArray[0, 0] as TFox).Die; |
Re: Array mit Instanzen von Objekten füllen?
Ja, du liegst schon richtig. Mein Problem ist jetzt aber, wie ich die Instanz, bzw. den Zeiger auf die Instanz an die Prozedur übergebe. (Siehe ein Post drüber)
|
Re: Array mit Instanzen von Objekten füllen?
meinst du sowas?
Delphi-Quellcode:
procedure CreateStuff(InstanceClass: TClass; var Reference);
var Instance: TObject; begin Instance := TObject(InstaceClass.NewInstance); TObject(Reference) := Instance; try Instance.Create; except TObject(Reference) := nil; raise; end; end; //... CreateStuff(TFox, FWorldArray[x, y]); //... |
Re: Array mit Instanzen von Objekten füllen?
Bist du so nett und erklärst mir das ganze mal. :angle:
Ich kann dir nämlich nicht so ganz folgen (d.h. gar net...). Wird bei deinem Beispiel der Standard-Konstruktor aufgerufen? Habe nämlich meinen eigenen und müsste demnach auch Werte an diesen übergeben. |
Re: Array mit Instanzen von Objekten füllen?
Zitat:
Zitat:
|
Re: Array mit Instanzen von Objekten füllen?
Ja, hab' ich ja auch schon vor Ewigkeiten geändert. Bin halt ein kleines ungeduldiges Kind.
Das ganze sieht bei mir jetzt folgender Maßen aus: Als erstes hätten wir da die Klassen (stark vereinfacht).
Delphi-Quellcode:
Dann den constructor von TWorld:
TWorld = class
private FWorldArray : array[0..31, 0..31] of TCreature; [...] public constructor Create( [...] ); [...] end; // ------------------------------ TFox = class(TAnimal) private public constructor Create; end;
Delphi-Quellcode:
Sowie die Funktion zum "füllen" des Arrays:
constructor TWorld.Create( [...] );
var i: Integer; j: Integer; begin [...] for i := 0 to 31 do for j := 0 to 31 do begin AddCreature(TFox, FWorldArray[i, j]); end; end;
Delphi-Quellcode:
Mein Problem liegt jetzt darin, wie ich den Konstruktor von TWorld aufrufen muss, so dass das Array komplett mit Instanzen von TFox gefüllt wird.
procedure TWorld.AddCreature(InstanceClass: TClass; var Reference);
var Instance: TObject; begin Instance := TObject(InstanceClass.NewInstance); TObject(Reference) := Instance; try Instance.Create; except TObject(Reference) := nil; raise; end; end;
Delphi-Quellcode:
Hat jemand eine Idee?
procedure TFormMain.FormCreate(Sender: TObject);
var World: TWorld; begin World := TWorld.Create(10, 10); World.Create(10, 10); [ ??? ] end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:50 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 by Thomas Breitkreuz