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.