Здравствуйте! Есть тема "Иерархия структуры таблицы Менделеева", в пределах которой нужно построить иерархию объектов, состоящей как минимум из 3-х уровней. Для демонстрации работы построенной иерархии классов, создаётся приложение, позволяющее: создавать, удалять объекты, изменять характеристики объектов, визуализировать объекты, манипулировать на форме объектами, сохранять/считывать текущее состояние объектов в формате XML.
Есть некоторые задумки насчёт иерархии (изображение)...Может кто-нибудь подскажет другой подход? Ну а прежде всего - трудности с визуализацией и манипулированием объектами...Может быть у кого-нибудь есть идеи, как для начала идейно подойти к этим вопросам? что можно придумать? Подскажите пожалуйста..!
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['imageIndex'] := tn.ImageIndex; cNode.Attributes['stateIndex'] := tn.StateIndex; // Вот это и есть твой атрибут ... if tn.Data <> nil then begin cNode.Attributes['sData'] := TBPeriod(tn.Data).sData; end else cNode.Attributes['sData'] := '';
tn := tn.getFirstChild; while tn <> nil do begin ProcessTreeItem(tn, cNode); tn := tn.getNextSibling; end; end; (*ProcessTreeItem*)
tn := tree.TopItem; while tn <> nil do begin ProcessTreeItem (tn, iNode); tn := tn.getNextSibling; end; XMLDoc.SaveToFile(ChangeFileExt(ParamStr(0),'.XML')); XMLDoc := nil; end; (* Tree2XML *)
procedure TForm1.btnSaveXMLClick(Sender: TObject); begin Tree2XML(TreeView1); end;
Чтобы восстановить из XML сохраненное таким образом дерево:
procedure XML2Tree(tree: TTreeView; XMLDoc: TXMLDocument); var iNode : IXMLNode;
procedure ProcessNode(Node : IXMLNode; tn: TTreeNode); var cNode : IXMLNode; newPeriod: TBPeriod; begin if Node = nil then Exit;
with Node do begin // Есть сохраненные атрибуты? Восстанавливаем ... if Attributes['sData'] <> '' then begin newPeriod := TBPeriod.Create( Attributes['text'], Attributes['sData'] ); tn := tree.Items.AddChildObject( tn, Attributes['text'], newPeriod as TObject ); end else // Нету? И не надо ... tn := tree.Items.AddChild(tn, Attributes['text']);
cNode := Node.ChildNodes.First; while cNode <> nil do begin ProcessNode(cNode, tn); cNode := cNode.NextSibling; end; end; (*ProcessNode*) begin tree.Items.Clear; XMLDoc.FileName := ChangeFileExt(ParamStr(0),'.XML'); XMLDoc.Active := True;
iNode := XMLDoc.DocumentElement.ChildNodes.First;
while iNode <> nil do begin ProcessNode(iNode,nil); iNode := iNode.NextSibling; end;
XMLDoc.Active := False; end;
procedure TForm1.btnLoadTreeClick(Sender: TObject); var ParentObj: TComponent; XMLDoc: TXMLDocument; begin ParentObj := TComponent.Create(nil); XMLDoc := TXMLDocument.Create(ParentObj); XML2Tree(TreeView2, XMLDoc); end;
(я для проверки сохранял из одного дерева, восстанавливал в другое... Из доп. информации сохраняется только строка Data, если у тебя есть еще что-то добавляй и в ProcessTreeItem, и в ProcessNode)...