CTreectrl Item-Baum speichern
-
Hallöchen,
ich möchte einen Treebaum(bzw. die items) binär abspeichern
So das man beim öffnen der Datei den Treebaum wieder herstellen kann.Wie kann man die Item Daten (Text ,Position im Baum usw.) abspeichern ?
Eigentlich steht das ja alles in der TVITEM-Strucktur. aber...
-
Das ganze ist ein rekursver Algorithmus.
Folgender Psudocode:void Save(Node) { Write contents of Node; Write ChildNode Count to file; For Each ChildNode Save(ChildNode); } void Load(Parent) { Load Node from file; Create Node; Load ChildNode Count from File. For Each ChildNode in File Load(Node); }Da gibt es zwar noch so ein paar Spzialitäten wie man mit der Root umgeht, aber im großen und ganzen war es das.
-
Hier ein konkretes Beispiel mit TinyXML und CTreeCtrl (allerdings nur laden. Traversieren ist aber gleich):
#include "tinyxml.h" class obj { public: TiXmlNode * node; TiXmlElement * element; HTREEITEM ht; }; /* XML Datei -> Strukturansicht */ TiXmlDocument doc( "tree_Biologie.xml" ); if(!doc.LoadFile()) MessageBox("File wird nicht geladen.","Info",MB_ICONEXCLAMATION); else { // Objektmodell in Strukturansicht übertragen obj root, curr, parent, child, brother; root.element = doc.RootElement(); root.ht = m_TreeCtrl.InsertItem(root.element->Value()); stack<obj> todo; // Traversier-Algorithmus todo.push(root); while(!todo.empty()) { curr = todo.top(); todo.pop(); //for each child of current //testweise fürs erste Kind// if(child.node = curr.element->FirstChild()) { child.element = child.node->ToElement(); child.ht = m_TreeCtrl.InsertItem(child.element->Value(),0,0,curr.ht,TVI_LAST); todo.push(child); } if(brother.node = curr.element->NextSibling()) { parent.ht = m_TreeCtrl.GetParentItem(curr.ht); brother.element = brother.node->ToElement(); brother.ht = m_TreeCtrl.InsertItem(brother.element->Value(),0,0,parent.ht,TVI_LAST); todo.push(brother); } } }Vielleicht hilft es weiter.

-
Jo besten Dank,
ich probiere es mal aus