AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Array mit Instanzen von Objekten füllen?
Thema durchsuchen
Ansicht
Themen-Optionen

Array mit Instanzen von Objekten füllen?

Ein Thema von Nonsense · begonnen am 6. Mär 2004 · letzter Beitrag vom 6. Mär 2004
Antwort Antwort
Benutzerbild von Nonsense
Nonsense

Registriert seit: 23. Nov 2002
389 Beiträge
 
Delphi 5 Standard
 
#1

Array mit Instanzen von Objekten füllen?

  Alt 6. Mär 2004, 13:03
Hallo Community,

kann ich ein Array mit Instanzen von Objekten (Klassen) füllen?

Beispiel, ich habe 2 Klassen:
Delphi-Quellcode:
TOberKlasse = class
private
{ ... }
public
{ ... }
end;

TUnterklasse = class(TOberKlasse)
private
{ ... }
public
{ ... }
end;
Kann ich jetzt ein Array erstellen, z.B. ein
MyArray : array of TOberKlasse; Und es dann mit Instanzen der Unterklasse (!) füllen? Welche Alternativen gibt es?

Danke im Voraus.

GReetings
  Mit Zitat antworten Zitat
jbg

Registriert seit: 12. Jun 2002
3.483 Beiträge
 
Delphi 10.1 Berlin Professional
 
#2

Re: Array mit Instanzen von Objekten füllen?

  Alt 6. Mär 2004, 14:53
Also wenn ich etwas nicht weiß, dann mache ich mir ein neues, leeres Projekt auf, und teste das.

Zitat:
Welche Alternativen gibt es?
Da gäbe es noch TObjectList, dass als Items aber TObject hat, und du somit immer Typecasten musst (außer du leitest die Klasse ab und überschreibst die Items[] Eigenschaft). Die TObjectList hat den Vorteil, dass .Clear,.Delete,.Remove,.Free die Instanzen automatisch freigeben.
  Mit Zitat antworten Zitat
Benutzerbild von Nonsense
Nonsense

Registriert seit: 23. Nov 2002
389 Beiträge
 
Delphi 5 Standard
 
#3

Re: Array mit Instanzen von Objekten füllen?

  Alt 6. Mär 2004, 15:04
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:
                     TCreature
                  / \
          TGround TAnimal
        / \ / \
    TSand TGrass TFox TRabbit
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.

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?
  Mit Zitat antworten Zitat
Benutzerbild von Nonsense
Nonsense

Registriert seit: 23. Nov 2002
389 Beiträge
 
Delphi 5 Standard
 
#4

Re: Array mit Instanzen von Objekten füllen?

  Alt 6. Mär 2004, 15:28
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;
  Mit Zitat antworten Zitat
Skiron

Registriert seit: 14. Dez 2003
153 Beiträge
 
#5

Re: Array mit Instanzen von Objekten füllen?

  Alt 6. Mär 2004, 15:37
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;
Mann zu Frau:
Zieh dich aus, wir müssen reden!
  Mit Zitat antworten Zitat
Benutzerbild von Nonsense
Nonsense

Registriert seit: 23. Nov 2002
389 Beiträge
 
Delphi 5 Standard
 
#6

Re: Array mit Instanzen von Objekten füllen?

  Alt 6. Mär 2004, 15:44
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)
  Mit Zitat antworten Zitat
Skiron

Registriert seit: 14. Dez 2003
153 Beiträge
 
#7

Re: Array mit Instanzen von Objekten füllen?

  Alt 6. Mär 2004, 16:00
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]);
//...
Mann zu Frau:
Zieh dich aus, wir müssen reden!
  Mit Zitat antworten Zitat
Benutzerbild von Nonsense
Nonsense

Registriert seit: 23. Nov 2002
389 Beiträge
 
Delphi 5 Standard
 
#8

Re: Array mit Instanzen von Objekten füllen?

  Alt 6. Mär 2004, 16:11
Bist du so nett und erklärst mir das ganze mal.
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.
  Mit Zitat antworten Zitat
jbg

Registriert seit: 12. Jun 2002
3.483 Beiträge
 
Delphi 10.1 Berlin Professional
 
#9

Re: Array mit Instanzen von Objekten füllen?

  Alt 6. Mär 2004, 18:42
Zitat von Nonsense:
(Incompatible types: TCreature and TClass)
Der Compiler sagt dir doch bereits was falsch ist.

Zitat:
... PosY: Integer; CreatureClass: TClass);
Warum übergibst du hier einen TClass-Parameter, wenn du doch einen TCreature-Parameter brauchst?
  Mit Zitat antworten Zitat
Benutzerbild von Nonsense
Nonsense

Registriert seit: 23. Nov 2002
389 Beiträge
 
Delphi 5 Standard
 
#10

Re: Array mit Instanzen von Objekten füllen?

  Alt 6. Mär 2004, 19:02
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:
  TWorld = class
  private
    FWorldArray : array[0..31, 0..31] of TCreature;
    [...]
  public
    constructor Create( [...] );
  [...]
  end;

  // ------------------------------

  TFox = class(TAnimal)
  private
  public
    constructor Create;
  end;
Dann den constructor von TWorld:
Delphi-Quellcode:
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;
Sowie die Funktion zum "füllen" des Arrays:
Delphi-Quellcode:
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;
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.
Delphi-Quellcode:
procedure TFormMain.FormCreate(Sender: TObject);
var
  World: TWorld;
begin
  World := TWorld.Create(10, 10);
  World.Create(10, 10);
  [ ??? ]
end;
Hat jemand eine Idee?
  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 17:15 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