Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   XML (https://www.delphipraxis.net/46-xml/)
-   -   Delphi [XML] TreeView Daten in XML-File schreiben (https://www.delphipraxis.net/79814-%5Bxml%5D-treeview-daten-xml-file-schreiben.html)

gsh 29. Okt 2006 00:58


[XML] TreeView Daten in XML-File schreiben
 
Hi DPler

Ich bin grad bei meinem ersten Projekt mit XML. Aber ich glaub XML ist zu schwierig für mich :stupid:
Ich hab es zwar geschafft (nach vielen stunden arbeit) die Daten aus der XML in meine TreeView reinzuschreiben. Nun wird im programm änderungen in der TreeView gemacht und deshalb will ich logischerweiße beim Programmende die daten von der TreeView wieder in die XML schreiben.

So nun hab ich mir schon mal gedacht das ich einfach immer die XML lösche und sie dann komplett neu anleg. Aber leider hab ich einfach nichts brauchbares zustande gebracht.

Hier mein Code zum auslesen aus der XML:
Delphi-Quellcode:
procedure XMLLoadXMLFile(TreeView : TTreeView; XMLNode : IXMLNode; TreeViewParent : TTreeNode);
var
  TempTreeNode : TTreeNode;
begin
  if TreeViewParent = nil then
  begin
    XMLDocument.Active := true;
    TreeView.Items.Clear;
    TreeView.Items.BeginUpdate;
    TempTreeNode := TreeView.Items.Add(nil, 'Arbeitsplatz');
    TempTreeNode.ImageIndex := 0;
    TempTreeNode.SelectedIndex := 0;
    XMLLoadXMLFile(TreeView, XMLDocument.DocumentElement.ChildNodes.First, TempTreeNode);
    TreeView.Items.EndUpdate;
    XMLDocument.Active := false;
    exit;
  end;
  while XMLNode <> nil do
  begin
    TempTreeNode := TreeView.Items.AddChild(TreeViewParent, XMLNode.NodeName);
    TempTreeNode.ImageIndex := 1;
    TempTreeNode.SelectedIndex := 1;
    XMLLoadXMLFile(TreeView, XMLNode.ChildNodes.First, TempTreeNode);
    XMLNode := XMLNode.NextSibling;
  end;
end;

mschaefer 29. Okt 2006 07:05

Re: [XML] TreeView Daten in XML-File schreiben
 
Moin, das hilft
TLink
Grüße // Martin

gsh 29. Okt 2006 11:32

Re: [XML] TreeView Daten in XML-File schreiben
 
danke ich versuche es mal für mich anzupassen

gsh 30. Okt 2006 12:05

Re: [XML] TreeView Daten in XML-File schreiben
 
so habs jetzt verschönert und für mich angepasst.
außerdem ist die Procedure fehlerhaft:
Delphi-Quellcode:
procedure Tree2XML(tree: TTreeView);
var
  tn : TTreeNode;
  XMLDoc : TXMLDocument;
  iNode : IXMLNode;

  procedure ProcessTreeItem(    //<-- Des ganze mit der Procedure ist total unschön (IMHO)
        tn   : TTreeNode;
        iNode : IXMLNode);
  var
    cNode : IXMLNode;
  begin
    if (tn = nil) then Exit; //<-- Total unnütz kann wegen der while schleife niemals auftreten
    cNode := iNode.AddChild('item');
    cNode.Attributes['text'] := tn.Text;
    cNode.Attributes['imageIndex'] := tn.ImageIndex;
    cNode.Attributes['stateIndex'] := tn.StateIndex;

    //child nodes
    tn := tn.getFirstChild;
    while tn <> nil do
    begin
      ProcessTreeItem(tn, cNode);
      tn := tn.getNextSibling;
    end;
  end; (*ProcessTreeItem*)
begin
  XMLDoc := TXMLDocument.Create(nil);
  XMLDoc.Active := True;
  iNode := XMLDoc.AddChild('tree2xml');
  iNode.Attributes['app'] := ParamStr(0);

  tn := tree.TopItem;
  while tn <> nil do
  begin
    ProcessTreeItem (tn, iNode);

    tn := tn.getNextSibling;
  end;

  XMLDoc.SaveToFile(ChangeFileExt(ParamStr(0),'.XML'));
  //XMLDoc.Free; <-- FEHLT
  XMLDoc := nil;
end; (* Tree2XML *)
Naja sie funktioniert ... aber für mich überhaupt nicht akzeptabel, deshalb hab ich es so geschrieben:
Delphi-Quellcode:
procedure XMLLoadFile; // <-- De wird auch bei XMLoadFile gebraucht
begin
  XMLDocument := TXMLDocument.Create(frmHaupt);
  XMLDocument.NodeIndentStr := '<2 Leerzeichen>';
  XMLDocument.FileName := ExtractFilePath(ParamStr(0))+cXMLFileClients;
  if not(FileExists(ExtractFilePath(ParamStr(0))+cXMLFileClients)) then
  begin
    XMLDocument.LoadFromXML('<?xml version="1.0"?><'+cXMLRootNodeName+'></'+cXMLRootNodeName+'>');
    XMLDocument.SaveToFile;
  end;
  try
    XMLDocument.Active := true;
  except
    ShowMessage('XML Fehler: Die Datei "'+ExtractFilePath(ParamStr(0))+cXMLFileClients+'" ist fehlerhaft.');
    Halt;
  end;
end;

procedure XMLSaveFile(TreeView : TTreeView; XMLNode : IXMLNode; TreeViewParent : TTreeNode);
var
  TempNode : IXMLNode;
  TempTreeNode : TTreeNode;
begin
  if TreeViewParent = nil then
  begin
    XMLLoadFile;
    XMLSaveFile(TreeView, XMLDocument.DocumentElement, TreeView.TopItem);
    XMLDocument.SaveToFile(ExtractFilePath(ParamStr(0))+cXMLFileClients);
    XMLDocument.Active := false;
    XMLDocument.Free;
    exit;
  end;
  TempTreeNode := TreeViewParent.getFirstChild;
  while TempTreeNode <> nil do
  begin
    TempNode := XMLNode.AddChild(TempTreeNode.Text);
    TempNode.Attributes['type'] := [..];
    XMLSaveFile(TreeView, TempNode, TempTreeNode);
    TempTreeNode := TempTreeNode.getNextSibling;
  end;
end;


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