TTreeView, resp. Baum richtig darstellen



  • Hallo,

    für eine MiniApplikation will ich eine XML-Dokument-Struktur in einem TreeView darstellen. Weitesgehend funktioniert alles, nur wird der Baum derzeit wie folgt dargestellt:
    **
    + [root]
    ....+ [node1]
    ........+ [node1.1]
    ............- [leaf1.1]
    ............- [leaf1.2]
    ............- [leaf3.1]
    ............- [leaf3.2]
    ............- [leaf3.3]
    ........- [node1.2]
    ........- [node3.1]
    ........- [node3.2]
    ........- [node3.3]
    ....- [node2]
    ....- [node3]**

    sollte aber so sein:

    **
    + [root]
    ....+ [node1]
    ........+ [node1.1]
    ............- [leaf1.1]
    ........+ [node1.2]
    ............- [leaf1.2]
    ....- [node2]
    ....+ [node3]
    ........+ [node3.1]
    ............- [leaf3.1]
    ........+ [node3.2]
    ............- [leaf3.2]
    ........+ [node3.3]
    ............- [leaf3.3]**

    Hier noch der zugehörige Code:

    // @param root: (next) parent node from XML Tree
    // @param next: depth level of tree
    // returns number of added elements
    int TForm1::ShowXMLTree(XMLNode root, TTreeNode* next)
    {
            static int counter=1;           // very first node already added
    
            XMLNodeList list=root->GetChildNodes();
            for (int i=0; i<list->Count; i++)
            {
                    root=list->Get(i);
                    String rootNodename=root->GetNodeName();
    
                    if(rootNodename[1]!='#')
                    {
                             // XMLDocTree is TreeView-Object
                             XMLDocTree->Items->AddChild(next,rootNodename);
                             counter++;
                    }
                    if (root->HasChildNodes)
                            ShowXMLTree(root, next->GetNext());
    
            }
            return counter;
    }
    

    Ich tu mich immer ein wenig schwer mit Rekursion 😞
    Vielleicht hat ja jemand den Durchblick, wie das Prob zu lösen ist.



  • Nach längerer Zeit bin ich wieder über das o.a. Problem gestolpert, bzw. die damalige Übung findet nun einen praktischen Nutzen.
    Nachdem ich den Vormittag darüber nachgegrübelt, gemacht, getan und probiert habe, bin ich auf einen kleinen und feinen Denkfehler gestoßen.
    Hier nun die LÖsung für alle, die's interessiert:

    // @param root: (next) parent node from XML Tree
    // @param next: "depth level" of TTree
    // returns number of added elements
    int TForm1::ShowXMLTree(XMLNode root, TTreeNode* next)
    {
            XMLTreeData* myDataPtr;
            TTreeNode * lastAdded;
    
            XMLNodeList list=root->GetChildNodes();
            for (int i=0; i<list->Count; i++)
            {
                    root=list->Get(i);         // next node
                    String rootNodename=root->GetNodeName();
    
                    if(rootNodename[1]!='#')
                    {
                            myDataPtr= new XMLTreeData;   
                            myDataPtr->xmlNode=root;
                           lastAdded=XMLDocTree->Items->AddChildObject(next,rootNodename,myDataPtr);
                            Counter++;
                    }
                    if (root->HasChildNodes)
                           ShowXMLTree(root, lastAdded);
    
            }
            return Counter;
    }
    

    Wichtig ist es, den zuletzt eingefügten Knoten im erneuten ShowXMLTree-Aufruf
    zu übergeben, dann klappt's auch mit dem Nachbarn.


Anmelden zum Antworten