treeview - zapis i odczyt z XML

0

Mam dwie prośby, żeby mnie ktoś oświecił. Chodzi o zapis i odczyt treeview do XML.
Mam taką procedurę zapisu:

var
  tn : TTreeNode;
  XMLDoc : TXMLDocument;
  iNode : IXMLNode;

  procedure ProcessTreeItem(
        tn    : TTreeNode; 
        iNode : IXMLNode);
  var
    cNode : IXMLNode;
  begin
    if (tn = nil) then Exit;
    cNode := iNode.AddChild('item');
    cNode.Attributes['text'] := tn.Text;
    cNode.Attributes['value'] := 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('day');
  iNode.Attributes['date'] := DateToStr(DateTimePicker1.Date);

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

    tn := tn.getNextSibling;
  end;

  XMLDoc.SaveToFile(ChangeFileExt(ParamStr(0),'.XML'));

  XMLDoc := nil;
end;

Przypisuje atrybut 'date' do elementu 'day', żeby potem zrobić coś a 'la archiwum.

iNode.Attributes['date'] := DateToStr(DateTimePicker1.Date);

Problem w tym, że procedura nadpisuje mi cały dokument XML.
Czyli, jeśli zapiszę dzień dzisiejszy, a jutro zapiszę drzewko, to zostanie mi tylko jutrzejszy zamiast dwóch osobnych Node wraz z dziećmi.
Kod jest dla mnie jak spaghetti więc nie wiem gdzie tam się odwołać :/

Drugi problem to odczyt..

var
  iNode : IXMLNode;

  procedure ProcessNode(
        Node : IXMLNode; 
        tn   : TTreeNode);
  var
    cNode : IXMLNode;
  begin
    if Node = nil then Exit;
    with Node do
    begin
      tn := treeview1.Items.AddChild(tn, Attributes['text']);
      tn.ImageIndex := Integer(Attributes['imageIndex']);
      tn.StateIndex := Integer(Attributes['stateIndex']);
    end;


    cNode := Node.ChildNodes.First;
    while cNode <> nil do
    begin
      ProcessNode(cNode, tn);
      cNode := cNode.NextSibling;
    end;
  end; (*ProcessNode*)
begin
  treeview1.Items.Clear;
  XMLDocument1.FileName := ChangeFileExt(ParamStr(0),'.XML');
  XMLDocument1.Active := True;

  iNode := XMLDocument1.DocumentElement.ChildNodes.First;

  while iNode <> nil do
  begin
    ProcessNode(iNode,nil);
    iNode := iNode.NextSibling;
  end;

  XMLDocument1.Active := False;
end;

Procedura odczytuje cały XML i formuje do drzewa, a nie wiem gdzie upchać kod, który najpierw sprawdzałby Node i dopasował do daty w DateTimePicker. :(
Nawet nie mogę popracowac nad odczytem, jeśli zapis mam jako nadpis a nie dodanie kolejnego parenta w drzewie.

Proszę o pomoc :) [soczek]

0

Nikt nie wie?

1 użytkowników online, w tym zalogowanych: 0, gości: 1