Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi ObjectList mit eigenen Funktionen erweitern?! (https://www.delphipraxis.net/114699-objectlist-mit-eigenen-funktionen-erweitern.html)

Yheeky 29. Mai 2008 18:31


ObjectList mit eigenen Funktionen erweitern?!
 
Hey,

angenommen ich habe folgende objektorientierte Struktur:

Delphi-Quellcode:
TCustomObjectList = class(TObjectList)
  protected
    function getItem(Index: Integer): TKlasse; virtual;
    procedure setItem(Index: Integer; Objekt: TKlasse); virtual;
  public
    function Add(Objekt: TKlasse): Integer; virtual;
    function Remove(Objekt: TKlasse): Integer; virtual;
    function IndexOf(Objekt: TKlasse): Integer; virtual;
    procedure Insert(Index: Integer; Objekt: TKlasse); virtual;
    property Items[index: Integer]: TKlasse read getItem write setItem; default;
    property PCs[index:Integer]:TPCs read getPCItem write setPCItem;
  end;
Wie folgt erstelle ich eine Liste:

Delphi-Quellcode:
customList := TCustomObjectList.Create;
Ich kann ja nun die Items über die Eigenschaft .Count zählen. Wie jedoch kann ich die Einträge in PCs zählen? Muss ich mir da eine eigene Routine schreiben oder wie kann ich das anstellen? Hat jemand vielleicht ein Beispiel für mich?

Wäre super!

Muetze1 29. Mai 2008 19:01

Re: ObjectList mit eigenen Funktionen erweitern?!
 
Du versuchst hier 2 Listen in eine zu integrieren. Und das es keine 1:1 Zuordnun ist, erkennt man an deiner Frage. Von daher stellt sich die Frage: Was willst du erreichen? Es sind schliesslich zwei Listen die du haben willst.

Yheeky 29. Mai 2008 19:36

Re: ObjectList mit eigenen Funktionen erweitern?!
 
Ja sorry, stimmt...die Frage ist nicht so deutlich rüber gekommen.

Ein anderes Beispiel mit verständlicheren Namen:

Delphi-Quellcode:
type
 TStadt = class (TObject)
  Name : String;
  Einwohner : Integer;
  Flaeche : Integer;
  end;
 
type
 TStadtliste = class(TObjectList)
  protected
    function getStadtItem(Index: Integer): TStadt; virtual;
    procedure setStadtItem(Index: Integer; Stadt: TStadt); virtual;
    function getHStadtItem(Index: Integer): TStadt; virtual;
    procedure setHStadtItem(Index: Integer; Stadt: TStadt); virtual;
  public
    function AddStadt(Stadt: TStadt): Integer; virtual;
    function RemoveStadt(Stadt: TStadt): Integer; virtual;
    function IndexOfStadt(Stadt: TStadt): Integer; virtual;
    procedure InsertStadt(Index: Integer; Stadt: TStadt); virtual;
    function AddHStadt(Stadt: TStadt): Integer; virtual;
    function RemoveHStadt(Stadt: TStadt): Integer; virtual;
    function IndexOfHStadt(Stadt: TStadt): Integer; virtual;
    procedure InsertHStadt(Index: Integer; Stadt: TStadt); virtual;
    property Staedte[index: Integer]: TStadt read getStadtItem write setStadtItem; default;
    property Hauptstaedte[index:Integer]:TStadt read getHStadtItem write setHStadtItem;
  end;
D.h. ich will quasi in einer Objektliste zwei Stadtlisten haben. Geht das überhaupt oder wie ist das ansonsten realisierbar? Wenn ja, wie komme ich an den Count von "Hauptstädte"? Über Staedte komme ich über TStadtliste.Count dran, da die property ja auf default gesetzt ist...

Hoffe es ist jetzt verständlicher...

sirius 29. Mai 2008 20:22

Re: ObjectList mit eigenen Funktionen erweitern?!
 
Nee, so geht das nicht. Es ist nur sinnvoll einen Typ Stadt oderhStadt in der Liste zu nutzen. (wie von Mutze schon beschrieben)

Versuchs mal so:
Delphi-Quellcode:
type
 TStadt = class (TObject)
  Name : String;
  Einwohner : Integer;
  Flaeche : Integer;
  end;
 
type
 TStadtliste = class(TObjectList)
  protected
    function getStadtItem(Index: Integer): TStadt; virtual;
    procedure setStadtItem(Index: Integer; Stadt: TStadt); virtual;
  public
    function AddStadt(Stadt: TStadt): Integer; virtual;
    function RemoveStadt(Stadt: TStadt): Integer; virtual;
    function IndexOfStadt(Stadt: TStadt): Integer; virtual;
    procedure InsertStadt(Index: Integer; Stadt: TStadt); virtual;
    property Stadt[index: Integer]: TStadt read getStadtItem write setStadtItem; default;
 end;
Und daraus jetzt zwei Stadtlisten machen (Achtung - jetzt kommt der riesen Clou von OOP, bzw. weswegen man den ganzen Mist macht :mrgreen:)
Delphi-Quellcode:
var Staedte:TStadtListe;
var HStaedte:TStadtListe;
...

Staedte:=TStadtListe.create;
HStaedte:=TStadtListe.create;
//jetzt kannst du Staedte und HStaedte nutzen
Du erstellst einfach zwei Instanzen und bekommst zwei voneinander unabhängige Listen.

FAlter 29. Mai 2008 20:53

Re: ObjectList mit eigenen Funktionen erweitern?!
 
Hi,

eventuell würde es doch so gehen:

Delphi-Quellcode:
type
  TTownList = class(TObjectList)
  private
    FCapitals: TTownList;
    constructor CreateCapitalList; //Konstruktor, der nur Hauptsdadtliste erstellt
    ...
  public
    constructor Create; //normaler Konstruktor, der gleich eine Hauptstadtliste erstellt
    procedure AddTown(Town: TTown; IsCapital: Boolean = false);
    property Capitals: TTownList read FTownList;
    ...
  end;
Die Hauptstadtliste könnte dann sich selbst als Hauptsdadtliste haben (d. h. im Konstruktor CreateCapitalList steht FCaptials := self).

So in der Art wäre mein Vorschlag, ist jetzt noch nicht genau durchdacht.

Mfg
FAlter

Muetze1 30. Mai 2008 01:37

Re: ObjectList mit eigenen Funktionen erweitern?!
 
Ich würde es noch anders lösen. Jede Hauptstadt ist auch eine Stadt, somit würde ich einfach dem Element (Stadt) eine Eigenschaft geben, ob sie eine Hauptstadt ist. Zusätzlich kann die Stadtliste eine Funktion bekommen, welche die Elemente durchgeht und eine Liste füllt mit allen Elementen die sie hat, welche die Eigenschaft Hauptstadt gesetzt haben.


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:52 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