AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

XML-Struktur in Objekte verwalten

Ein Thema von Yheeky · begonnen am 23. Aug 2008 · letzter Beitrag vom 25. Aug 2008
Antwort Antwort
Yheeky

Registriert seit: 7. Jun 2002
1.339 Beiträge
 
#1

Re: XML-Struktur in Objekte verwalten

  Alt 25. Aug 2008, 09:18
Zitat von thkerkmann:
Hi,

ich glaube Yheeky will das nicht in der Treeview speichern, sondern unabhängig.
Richtig! Ich möchte die Nachrichten dann in einer ListView anzeigen lassen.

Habe jetzt gerade mal deinen Code getestet und bin zu folgendem Ergebnis gekommen:

Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, JvSimpleXml, StdCtrls, ComCtrls, JclSimpleXml, Contnrs;

type
  TOrdnerSammlung = class;

  TOrdner = class(TObject)
  public
    Ordnername,
      Icon: string;
    Expanded: Boolean;
    Unterordner: TOrdnerSammlung;
    constructor Create; overload;

  end;

  TOrdnerSammlung = class(TObjectlist)
    function GetItems: TOrdner;
  public
    property Items: TOrdner read getItems;
  end;

type
  TForm1 = class(TForm)
    TreeView1: TTreeView;
    XML: TJvSimpleXML;
    Button1: TButton;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
  public
    OrdnerListe: TOrdnerSammlung;
    procedure WriteNode(Node: TTreeNode; Liste: TOrdnerSammlung);
    procedure ReadInObjects(XMLText: TJclSimpleXMLElem; OrdnerSammlung:
      TOrdnerSammlung);
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

function TOrdnerSammlung.GetItems: TOrdner;
begin

end;

constructor TOrdner.Create;
begin
  Unterordner := TOrdnersammlung.Create(True);
end;

procedure TForm1.WriteNode(Node: TTreeNode; Liste: TOrdnerSammlung);
var
  I: Integer;
  newTreeNode: TTreeNode;
begin
  if Liste.Count > 0 then
    for I := 0 to Liste.Count - 1 do
    begin
      newTreeNode := TreeView1.Items.AddChild(Node,
        TOrdner(Liste[I]).Ordnername);
      newTreeNode.ImageIndex := StrToInt(TOrdner(Liste[I]).Icon);

      if TOrdner(Liste[I]).Unterordner.Count > 0 then
        WriteNode(newTreeNode, TOrdner(Liste[I]).Unterordner);
    end;
end;

procedure TForm1.ReadInObjects(XMLText: TJclSimpleXMLElem; OrdnerSammlung:
  TOrdnerSammlung);
var
  I, J: Integer;
  newFolder: TOrdner;
begin
  // Wenn die XML-Struktur noch Daten enthält
  if XMLText.Items.Count > 0 then
    for I := 0 to XMLText.Items.Count - 1 do
    begin
      // Wenn es sich um einen Ordner handelt
      if XMLText.Items[I].Name = 'Ordnerthen
      begin
        if XMLText.Items[I].Properties.Count > 0 then
        begin
          // Neues Ordnerobjekt erstellen
          newFolder := TOrdner.Create;

          for J := 0 to XMLText.Items[I].Properties.Count - 1 do
          begin
            // Der Ordnername wird ausgelesen
            if XMLText.Items[I].Properties[J].Name = 'Namethen
              newFolder.Ordnername := XMLText.Items[I].Properties[J].Value;
            if XMLText.Items[I].Properties[J].Name = 'Expandedthen
              if XMLText.Items[I].Properties[J].Value = 'Truethen
                newFolder.Expanded := True
              else
                newFolder.Expanded := False;
            if XMLText.Items[I].Properties[J].Name = 'Iconthen
              newFolder.Icon := XMLText.Items[I].Properties[J].Value;
          end;
        end;
      end;

      // Fügt der Liste das Ordnerobjekt hinzu
      OrdnerSammlung.Add(TOrdner(newFolder));

      // Auf Unterordner prüfen
      if XMLText.Items[I].Items.Count > 0 then
        // Wenn es sich um einen Ordner handelt
        if XMLText.Items[I].Name = 'Ordnerthen
          ReadInObjects(XMLText.Items[I], newFolder.Unterordner);
    end;

end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  XML.LoadFromFile(ExtractFilePath(Application.ExeName) + 'Test.xml');

  Ordnerliste := TOrdnerSammlung.Create(True);

  ReadInObjects(XML.Root, Ordnerliste);
  Button2.Enabled := True;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  TreeView1.Items[1].DeleteChildren;
  WriteNode(TreeView1.Items[1], Ordnerliste);
end;

end.
Funktioniert alles soweit. Mein Beispiel-XML-Code war folgender (und das hat funktioniert):

XML-Code:
<?xml version="1.0" encoding="ISO-8859-1"?>
<Daten>
   <Ordner Name="Autos" Expanded="True" Icon="15">
      <Ordner Name="Meine Autos" Icon="16"/>
      <Ordner Name="Andere Autos" Icon="17"/>
   </Ordner>    
</Daten>
Ich frage mich gerade nur, warum das schon funktioniert, obwohl ich in GetItems noch garnichts stehen habe? Wofür brauche ich es dann bzw. warum erwartet property Items ein read?
  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 22:13 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-2025 by Thomas Breitkreuz