void ProcessTreeItem(TTreeNode *tn, IXMLNode *iNode){ if(tn) { IXMLNode *cNode = iNode->AddChild("item"); cNode->SetAttribute("text", tn->Text); cNode->SetAttribute("imageIndex", tn->ImageIndex); cNode->SetAttribute("stateIndex", tn->StateIndex); cNode->SetAttribute("expanded", tn->Expanded); for(tn = tn->getFirstChild(); tn; tn = tn->getNextSibling()) { ProcessTreeItem(tn, cNode); } }} void Tree2XML(TTreeView *tree){ TXMLDocument *XMLDoc = new TXMLDocument(0); XMLDoc->Active = true; _di_IXMLNode iNode = XMLDoc->AddChild("tree2xml"); iNode->SetAttribute("app", ParamStr(0)); for(TTreeNode *tn = tree->TopItem; tn; tn = tn->getNextSibling()) { ProcessTreeItem(tn, iNode); } XMLDoc->SaveToFile(ChangeFileExt(ParamStr(0), ".XML")); XMLDoc = 0;}
void PostProcessNode(_di_IXMLNode node, TTreeNode *tree_node){ if(node) { if((bool)(node->GetAttribute("expanded"))) tree_node->Expanded = true; tree_node = tree_node->getFirstChild(); for(_di_IXMLNode xml_node = node->ChildNodes->First(); xml_node && tree_node; xml_node = xml_node->NextSibling()) { PostProcessNode(xml_node, tree_node); tree_node = tree_node->getNextSibling(); } }} void ProcessNode(TTreeView *tree, _di_IXMLNode node, TTreeNode *tree_node){ if(node) { tree_node = tree->Items->AddChild(tree_node, node->GetAttribute("text")); tree_node->ImageIndex = (int)(node->GetAttribute("imageIndex")); tree_node->StateIndex = (int)(node->GetAttribute("stateIndex")); for(_di_IXMLNode xml_node = node->ChildNodes->First(); xml_node; xml_node = xml_node->NextSibling()) { ProcessNode(tree, xml_node, tree_node); } }} void XML2Tree(TTreeView *tree, TXMLDocument *XMLDoc){ tree->Items->Clear(); XMLDoc->FileName = ChangeFileExt(ParamStr(0), ".XML"); XMLDoc->Active = true; _di_IXMLNode iNode = XMLDoc->DocumentElement->ChildNodes->First(); while(iNode) { ProcessNode(tree, iNode, 0); iNode = iNode->NextSibling(); } // Если раскрытие не нужно, а достаточно только восстановить дерево - то // следующие 7 строк можно убрать. Функцию PostProcessNode() тоже... TTreeNode *ti = tree->TopItem; iNode = XMLDoc->DocumentElement->ChildNodes->First(); while(iNode) { PostProcessNode(iNode, ti); iNode = iNode->NextSibling(); } XMLDoc->Active = false;}
void __fastcall TForm1::SaveButtonClick(TObject *Sender){ Tree2XML(TreeView1);}//--------------------------------------------------------------------------- void __fastcall TForm1::RestoreButtonClick(TObject *Sender){ XML2Tree(TreeView2, XMLDocument1);}
cNode->SetAttribute("data", (int)(tn->Data));// ...tree_node->Data = (void*)(node->GetAttribute("data"));