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]