Tree Menü Speichern



  • in welcher form soll man am besten ein tree menü in einer datei speichern?
    Das menü verändert sich oft, und ist mit CImageList bei den einträgen.



  • Wie wäre es wenn du das TreeMenü in einer XML Datei speicherst?
    http://www.codeproject.com/useritems/ctreectrl_xml.asp



  • Danke für den Link!!!
    Habe den schon vor paar Tagen gefunden, und um erlich zu sein, ich komm mit dem nicht klar.
    Ich suche noch weiter nach einem einfachen Beispiel für XML und CTreeCtrl.



  • Im Prinzip musst du nur alle Treenodes durchlaufen und daraus eine XML Datei erstellen.



  • laden und speichern leuft jetzt, aber wie kann ich bei die icon ID auslesen und speichern?
    PS text wird schon gespeichert.





  • Bekomme zwar immer noch nicht ausgelesen, aber Danke schon mal dafür!!!

    noch eine kleine Frage.
    Wie kann ich bei den Tree Items zusätzliche Information hinterlegen, am besten als string, char oder int?
    Bei SetItemData geht es nur mit DWORD_PTR.



  • Du könntest zum Beispiel eine Extra Klasse entwerfen, die diese Informationen aufnimmt und den Adressbereich dem TreeNode mit SetItemData zuweisen.



  • kan ich leider nicht machen, da muss ich dann 2 dateien anlegen
    Das Treemenü wird aus einem XML File geladen, und verändert sich immer

    PPPPPS: Hat einer ein Beispiel für GetItem um die Icon nummer auszulesen? ich bekomm es nicht ausgelesen.



  • Hier ein kleines Beispiel:

    TVITEM Item;
    	CString szText;
    	CString szItem;
    
    	Item.hItem = GetTreeCtrl().GetSelectedItem();
    	Item.mask = TVIF_IMAGE | TVIF_TEXT;
    	Item.pszText = szText.GetBuffer(100);
    	Item.cchTextMax = 100;
    	szText.ReleaseBuffer();
    
    	GetTreeCtrl().GetItem(&Item);
    
    	szItem.Format("Item Text: %s, Item Image ID: %d",szText, Item.iImage);
    	AfxMessageBox(szItem);
    


  • viel viel viel Dank!!!
    Ich bastel im Moment an http://www.codeproject.com/useritems/ctreectrl_xml.asp, was auch ein super Vorschlag von dir war.
    Im Moment habe ich Probleme, das ausgelesen Icon zu speichern, also dein Letzten Vorschlag hier einzubauen.

    void CTreeCtrlXML::Save( TiXmlNode* a_pNode )
    {
    	ASSERT( NULL != a_pNode );
    
    	TiXmlNode* pItems = a_pNode->InsertEndChild( TiXmlElement( "Items" ) );
    	TiXmlNode* pParent = pItems;
    	TiXmlNode* pNewNode = NULL;
    	HTREEITEM hItem = GetRootItem();
    	int iIndent = 0; int iLastIndent = 0;
    
    	while( hItem )
    	{
    		iIndent = GetIndentLevel( hItem );
    
    		int iDiff = iIndent - iLastIndent;
    		if( iDiff > 0 )
    		{
    			ASSERT( NULL != pNewNode );
    
    			while( iDiff-- )
    				pNewNode = pNewNode->InsertEndChild( TiXmlElement( "Item" ) );
    
    			ASSERT( NULL != pNewNode );
    			pParent = pNewNode->Parent();
    		}
    		else if( iDiff < 0 )
    		{
    			iDiff--;					// Correct difference to get the right parent
    			pParent = pNewNode;
    
    			while( iDiff++ < 0 )
    				pParent = pParent->Parent();
    
    			ASSERT( NULL != pParent );
    			pNewNode = pParent->InsertEndChild( TiXmlElement( "Item" ) );
    		}
    		else 
    		{
    			ASSERT( NULL != pParent );
    			pNewNode = pParent->InsertEndChild( TiXmlElement( "Item" ) );
    		}
    
    		iLastIndent = iIndent;			
    
    		// Save current item
    		TiXmlElement* pElement = pNewNode->ToElement();
    		ASSERT( NULL != pElement );
    		pElement->SetValue( "Item" );
    		pElement->SetAttribute("Title",GetItemText(hItem));
    		// The next item, please ...
    		hItem = GetNextItem( hItem );
    	}
    }
    


  • MSDN lesen...



  • Morides schrieb:

    viel viel viel Dank!!!
    Im Moment habe ich Probleme, das ausgelesen Icon zu speichern, also dein Letzten Vorschlag hier einzubauen.

    Über den Befehl GetItem bekommst du ja die Daten in die TVITEM Struktur. Anschließend musst du die Imagenummer nur noch in der XML Datei speichern.



  • Gromel schrieb:

    MSDN lesen...

    Habe ich schon gemacht, und google auch schon durch, es hat bis jetzt nur als ausgabe bei einem klick auf den Item Funktioniert.
    ich bekomme ies aber nicht gespeichern, in den source oben.



  • Bei deinem Beispeiel wird das Icon von GetSelectedItem ausgeben, ich finde oben (CTreeCtrlXML::Save) keine möglichkeit es einzubauen, dass auch funktioniert.



  • void CTreeCtrlXML::Save( TiXmlNode* a_pNode ) 
    { 
        ASSERT( NULL != a_pNode ); 
    
        TiXmlNode* pItems = a_pNode->InsertEndChild( TiXmlElement( "Items" ) ); 
        TiXmlNode* pParent = pItems; 
        TiXmlNode* pNewNode = NULL; 
        HTREEITEM hItem = GetRootItem(); 
        int iIndent = 0; int iLastIndent = 0; 
    
        while( hItem ) 
        { 
            iIndent = GetIndentLevel( hItem ); 
    
            int iDiff = iIndent - iLastIndent; 
            if( iDiff > 0 ) 
            { 
                ASSERT( NULL != pNewNode ); 
    
                while( iDiff-- ) 
                    pNewNode = pNewNode->InsertEndChild( TiXmlElement( "Item" ) ); 
    
                ASSERT( NULL != pNewNode ); 
                pParent = pNewNode->Parent(); 
            } 
            else if( iDiff < 0 ) 
            { 
                iDiff--;                    // Correct difference to get the right parent 
                pParent = pNewNode; 
    
                while( iDiff++ < 0 ) 
                    pParent = pParent->Parent(); 
    
                ASSERT( NULL != pParent ); 
                pNewNode = pParent->InsertEndChild( TiXmlElement( "Item" ) ); 
            } 
            else 
            { 
                ASSERT( NULL != pParent ); 
                pNewNode = pParent->InsertEndChild( TiXmlElement( "Item" ) ); 
            } 
    
            iLastIndent = iIndent;            
    
            // Save current item 
            TiXmlElement* pElement = pNewNode->ToElement(); 
            ASSERT( NULL != pElement ); 
            pElement->SetValue( "Item" ); 
            pElement->SetAttribute("Title",GetItemText(hItem)); 
    
        TVITEM Item; 
        CString szText; 
        CString szItem; 
    
        Item.hItem = hItem; 
        Item.mask = TVIF_IMAGE; 
        Item.pszText = szText.GetBuffer(100); 
        Item.cchTextMax = 100; 
        szText.ReleaseBuffer(); 
    
        pElement->GetItem(&Item); 
        pElement->SetAttribute("icon","%d")
    
       // The next item, please ... 
            hItem = GetNextItem( hItem ); 
        } 
    }
    

    versuch es mal damit



  • kommt ein fehler

    c:\Run\ccddf\TreeCtrlXML.cpp(149): error C2039: 'GetItem': Ist kein Element von 'TiXmlElement'
    


  • Morides schrieb:

    kommt ein fehler

    c:\Run\ccddf\TreeCtrlXML.cpp(149): error C2039: 'GetItem': Ist kein Element von 'TiXmlElement'
    

    GetItem ist ein Element von CTreeCtrl, also mach das pElement vorne mal weg.



  • Danke euch, es leuft, bin weiter am SetItemData am basteln!!!


Anmelden zum Antworten