Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi XML-Struktur in Objekte verwalten (https://www.delphipraxis.net/119288-xml-struktur-objekte-verwalten.html)

Yheeky 23. Aug 2008 19:25


XML-Struktur in Objekte verwalten
 
Hi,

ich habe hier bereits Hilfe bekommen, wie ich eine XML-Struktur in einer TreeView darstellen kann.
Nun möchte ich diese Struktur gerne objektorientiert umsetzen (mit TObject und TObjectlist).
Mein Problem ist hier, dass ich wie bei der TreeView ein TreeNode habe, der unendlich viele Nodes besitzen kann und DER wiederum auch unendlich viele besitzen kann.
Wie kann ich das objektorientiert umsetzen, hat jemand eine Idee?

Yheeky 23. Aug 2008 20:56

Re: XML-Struktur in Objekte verwalten
 
Will noch ein kleines Beispiel nachschieben, damit meine Frage noch deutlicher ist ;-)

Ich habe ein Objekt...
Delphi-Quellcode:
type
  TOrdner = class(TObject)
    Ordnername : String;
    Expanded: Boolean;
  end;
...dennoch möchte ich, dass DIESES Objekt wiederum Objekte vom Typ TOrdner enthalten kann (Ordner können ja Unterordner enthalten und diese wiederum Unterordner usw.).
Diese ganzen Ordner, möchte ich dann in einem einzelnen Objekt (z.B. TOrdnerSammlung vom Typen TObjectList) ablegen und speichern.

So, nun hoffe ich, dass es klarer ist - denke, dass man mit meinem ersten Post nicht soviel anfangen konnte ;-)

Pfoto 23. Aug 2008 21:37

Re: XML-Struktur in Objekte verwalten
 
Hallo Yheeky,

ich selbst habe auch so ein Problem gehabt (es ging aber
um eine Website mit deren Unterseiten) und habe letztendlich
jedem Node einfach den Pointer eines erstellten Objektes
mitgegeben.

Damit hast du die Struktur in einem Baum, aber die Inhalte
in den einzelnen Objekten.
Sobald du auf einen Node zugreifst, kannst du dann das
drangehängte Objekte auslesen.


Grüße
Jürgen

Yheeky 23. Aug 2008 22:50

Re: XML-Struktur in Objekte verwalten
 
Hallo Jürgen,

klingt gut, aber verstehe ich leider nicht :-(
Kannst du das vielleicht einem Laien nochmal erklären :-)
Vielleicht auch mit Code, dann ist´s vielleicht eindeutiger.

Danke!

Dax 23. Aug 2008 22:58

Re: XML-Struktur in Objekte verwalten
 
Delphi-Quellcode:
type
  TOrdner = class(TObject)
    Ordnername : String;
    Expanded: Boolean;
    Unterordner: TOrdnerSammlung;
  end;
Allerdings sollte das ganze schon ordentlich gekapselt sein (ohne Setter...)

Yheeky 23. Aug 2008 23:21

Re: XML-Struktur in Objekte verwalten
 
Ja, sowas in der Art dachte ich auch, allerdings sagt mit Delphi, wenn ich die beiden Klassen (TOrdner und TOrdnerSammlung) in zwei Units auslagere, dass ich "keine Zirkuläre Unit-Referenz" haben darf - und diese brauchte ich ja, weil man sonst die Objekte nicht findet :-(

sx2008 23. Aug 2008 23:22

Re: XML-Struktur in Objekte verwalten
 
Zitat:

Zitat von Yheeky
...dennoch möchte ich, dass DIESES Objekt wiederum Objekte vom Typ TOrdner enthalten kann (Ordner können ja Unterordner enthalten und diese wiederum Unterordner usw.).

Dafür wäre das Design Pattern Composite das Richtige.
Die Klasse TComponent ist übrigens ein Composite.
Mit Hilfe des Property ComponentCount und dem Array-Property Components[] kann man ganze Baumstrukturen aufbauen.
Das Property Owner ist ebenfalls wichtig, damit jedes Objekt seinen Vorfahren in der Hierarchie kennt.
Du kannst dir die Sache am Anfang einfach machen und die Klasse TOrder von TComponent ableiten.
Später willst du aber vielleicht von TComponent weggehen, da diese Klasse doch etwas Overhead mit sich rumträgt.

Yheeky 23. Aug 2008 23:38

Re: XML-Struktur in Objekte verwalten
 
Mit TComponent möchte ich ungern arbeiten. Ich würde gerne meine eigene Klasse entwickeln, weil ich - wie du schon vermutet hast - den ganzen Overhead nicht mit drinhaben möchte.
Ist das so schwer, solch eine Klasse zu entwickeln?

omata 24. Aug 2008 00:00

Re: XML-Struktur in Objekte verwalten
 
Zitat:

Zitat von Yheeky
...wenn ich die beiden Klassen ... in zwei Units auslagere, dass ich "keine Zirkuläre Unit-Referenz" haben darf ...

NodeTypeU:
Delphi-Quellcode:
unit NodeTypeU;

interface

type
  TNodeCustom = class
  end;

implementation

end.
NodeListU:
Delphi-Quellcode:
unit NodeListU;

interface

uses Classes, NodeTypeU;

type
  TNodeList = class
  private
    FNodes: TList;
  public
    constructor create;
    destructor destroy; override;
    procedure Clear;
    procedure addNode(Node:TNodeCustom);
  end;

implementation

{ TNodeList }

constructor TNodeList.create;
begin
  FNodes:=TList.Create;
end;

destructor TNodeList.destroy;
begin
  Clear;
  FNodes.free;
  inherited;
end;

procedure TNodeList.Clear;
var i:integer;
    ItemObject:TObject;
begin
  for i:=1 to FNodes.Count do begin
    ItemObject:=FNodes[i-1];
    ItemObject.free;
  end;
  FNodes.Clear;
end;

procedure TNodeList.addNode(Node: TNodeCustom);
begin
  FNodes.Add(Node);
end;

end.
NodeU:
Delphi-Quellcode:
unit NodeU;

interface

uses NodeTypeU, NodeListU;

type
  TNode = class(TNodeCustom)
  private
    FChildNodes:TNodeList;
  public
    constructor create;
    destructor destroy; override;
    procedure addChild(Node:TNode);
  end;

implementation

{ TNode }

constructor TNode.create;
begin
  FChildNodes:=TNodeList.create;
end;

destructor TNode.destroy;
begin
  FChildNodes.free;
  inherited;
end;

procedure TNode.addChild(Node: TNode);
begin
  FChildNodes.addNode(Node);
end;

end.

Yheeky 24. Aug 2008 00:24

Re: XML-Struktur in Objekte verwalten
 
Ich habe schon gelesen, dass man das umgehen kann, aber anhand deines Beispieles könnte ich jetzt nicht sehen, was da genau TOrdner und TOrdnerSammlung ist.
Sorry, aber das versteh ich noch nicht :cry:


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