Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   ObjectList in ObjectList (https://www.delphipraxis.net/171618-objectlist-objectlist.html)

Captnemo 15. Nov 2012 13:06

ObjectList in ObjectList
 
Hi,

ich möchte mir eine Klasse basteln, die selbst eine ObjectList beinhalten soll. Bzw. die Object in der der ObjectList sollten ggf. selbst auch eine ObjectListe beinhalten können.
Leider fehlt mir hierbei die Erfahrung mit Klassendesign.

Also so etwas wie:

Delphi-Quellcode:
Type
  TFahrer = class(TObject)
    nachname: string;
    vorname: string;
    alter: integer;
  end;

Type
  TAuto = class(TObject)
    Kennzeichen: string;
    Modell: string;
    Fahrer: TFahrer;
  end;

.
.
.
TMyAuto = class(TObjectList)
  protected
    function getItem(index: Integer): TAuto; virtual;
    procedure setItem(index: Integer; Auto: TAuto); virtual;
  public
    procedure items[index: Integer]: TAuto read getItem write setItem; default;
    .
    .
  end;
Jetzt kann ich mir die ObjectList mit

MyAuto:=TMyAuto.create; erzeugen.

Aber wie erzeuge ich in der Klasse TAuto die ObjectListe für TFahrer so, dass ich z.B. mit
MyAuto[0].Fahrer[1].Nachname zugreifen kann, oder mit MyAuto[0].Fahrer.Add(TestFahrer) Objecte hinzufügen kann?

Kann sein, dass ich mich jetzt hier nicht glücklich ausgedrückt habe, aber ich hoffe es ist deutlich geworden, was ich meine. Oder ist der Ansatz komplett falsch?

jaenicke 15. Nov 2012 13:21

AW: ObjectList in ObjectList
 
Das Feld Fahrer muss einfach im Konstruktor von TAuto erzeugt und im Destruktor wieder freigegeben werden.

DeddyH 15. Nov 2012 13:32

AW: ObjectList in ObjectList
 
Dabei muss man aber aufpassen, dass die eigene Referenz dann nicht als Element der Liste bzw. "Unterliste" auftaucht, sonst kann das ungeahnte Konsequenzen haben.

DanielJ 15. Nov 2012 13:38

AW: ObjectList in ObjectList
 
Delphi-Quellcode:
Type
  TFahrer = class(TObject)
    nachname: string;
    vorname: string;
    alter: integer;
  end;

  TFahrerList = (TObjectList)
  protected
    function getItem(index: Integer): TFahrer ; virtual;
    procedure setItem(index: Integer; Auto: TFahrer); virtual;
  public
    procedure items[index: Integer]: TFahrer read getItem write setItem;
  end;

  TAuto = class(TObject)
    Kennzeichen: string;
    Modell: string;
    Fahrer: TFahrerList; // muss natürlich im Create/Destroy berücksichtigt werden
  end;


TAutoList = class(TObjectList)
  protected
    function getItem(index: Integer): TAuto; virtual;
    procedure setItem(index: Integer; Auto: TAuto); virtual;
  public
    procedure items[index: Integer]: TAuto read getItem write setItem; default;
    .
    .
  end;
PS: Virtual? oder doch lieber Override?

Popov 15. Nov 2012 13:41

AW: ObjectList in ObjectList
 
Tipp: guck dir mal TStrings und TStringList an. Da kannst du dir schon paar Anregungen holen.

Wobei, es gibt ja paar Möglichkeiten:

du erbst deine Klasse aus TObjectList. Selbstzugriff z. B. über Self (edit: ach, das hast du ja bereits)

oder es ist ein Feld, du erstellst es mit Create und arbeitest damit.

DeddyH 15. Nov 2012 13:44

AW: ObjectList in ObjectList
 
Zitat:

Zitat von DanielJ (Beitrag 1191308)
PS: Virtual? oder doch lieber Override?

Macht ja nur Sinn, wenn Du von dieser Klasse noch ableiten willst. In dem Fall dann virtual in der Basisklasse und override und der abgeleiteten.

stahli 15. Nov 2012 13:58

AW: ObjectList in ObjectList
 
"Fahrer: TFahrerList;"

Auch wenn das grammatikalisch natürlich korrekt ist, würde ich das Feld auch FahrerList (o.ä. wie z.B. "Drivers") nennen, zumal es eine Klasse TFahrer gibt und Missverständnisse damit vorprogrammiert sind.

Captnemo 15. Nov 2012 14:42

AW: ObjectList in ObjectList
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ich habe jetzt mal ein wenig rumprobiert. Soweit klappt das ganz gut, aber beim Erzeugen eines Objectes TKunde (analog zu dem oben genannten TAuto) kann ich dem daruterliegenden TFahrzeug (analog zu dem TFahrer) nicht eintragen.

Weil das so blöd zu beschreiben ist, habe ich mal meinen Source beigepackt. Vielleicht mag sich das einer anschauen, ob ich das soweit richtig gemacht habe.

jaenicke 15. Nov 2012 15:09

AW: ObjectList in ObjectList
 
Delphi-Quellcode:
var
  li: TListitem;
  i: Integer;
begin
  lv_fzg.Clear;
  for I := 0 to Kunden[i].fahrzeuge.Count-1 do
Zitat:

[DCC Warnung] main.pas(249): W1036 Variable 'i' ist möglicherweise nicht initialisiert worden
(Bezogen auf Kunden[i])

Bummi 15. Nov 2012 15:13

AW: ObjectList in ObjectList
 
Delphi-Quellcode:
procedure TForm1.LeseFahrzeuge(index: Integer);
var
  li: TListitem;
  i: Integer;
begin
  lv_fzg.Clear;
  for I := 0 to Kunden[index].fahrzeuge.Count-1 do //BAUSTELLE index statt i
  begin
    li:=lv_fzg.Items.Add;
    li.Caption:=Kunden[index].fahrzeuge[i].kz;
    li.SubItems.Add(Kunden[index].fahrzeuge[i].modell);
    li.SubItems.Add(GUIDToString(Kunden[index].fahrzeuge[i].guid));
  end;
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:34 Uhr.
Seite 1 von 2  1 2      

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