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...


  • Mod

    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


Anmelden zum Antworten