daywalker0086 hat folgendes geschrieben : |
Ist warscheinlich zu trivial das jemand antwortet... |
Nein, aber du formatierst nicht gerade standardkonform, so dass es ziemlich mühsam ist, deinen Quelltext zu lesen. Deshalb habe ich den Thread gestern direkt wieder zugemacht...
Ja, wie mache ich das in der Regel? Das habe ich schon relativ oft benutzt, egal ob beruflich oder privat, letztlich sieht der Code eigentlich immer ähnlich aus, egal welche Daten hinter der TVirtualStringTree gerade stecken:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21:
| type TRegDataTreeNode = record NodeData: TSomeData; function GetNodeName: string; end; PRegDataTreeNode = ^TRegDataTreeNode;
function FindChildNode(ParentNode: PVirtualNode; const NodeName: string) : PVirtualNode; var TreeNodeData: PRegDataTreeNode; begin Result := FTreeComponent.GetFirstChild(ParentNode); while Assigned(Result) do begin TreeNodeData := PRegDataTreeNode(FTreeComponent.GetNodeData(Result)); if TreeNodeData.GetNodeName = NodeName then Break; Result := FTreeComponent.GetNextSibling(Result); end; end; |
Mit FindChildNode suche ich nach dem Child mit dem richtigen Namen. Statt GetNodeName kannst du natürlich auch direkt den Namen als Feld in dem Record deklarieren, je nachdem wie deine Datenstruktur im Hintergrund aussieht.
Das rufe ich in einer Schleife auf, in der ich die Bestandteile des Pfads durchgehe. Wenn der Knoten noch nicht existiert, erzeuge und initialisiere ich ihn:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9:
| for i := 0 to High(NodePathList) do begin Result := FindChildNode(ParentNode, NodePathList[i]); if not Assigned(Result) then begin Result := FTreeComponent.AddChild(ParentNode); FTreeComponent.ValidateNode(Result, False); InitTreeNode(PRegDataTreeNode(FTreeComponent.GetNodeData(Result)), CurrentPath, NodePathList[i]); |
Das ist im Grunde nicht weiter schwer. Der Unterschied zu deinem Code ist hauptsächlich, dass du nicht vom Parent aus das Child suchst, sondern die Nachbarknoten und dass du direkt mit dem Knotentext arbeitest. Einen Knotentext gibt es aber bei der VirtualStringTree nicht, d.h. da musst du über den Datenpointer mit den dahinterliegenden Daten arbeiten.
Je nach Anwendung gibt es bei mir auch noch eine Zwischenschicht zwischen der eigentlichen Datenstruktur und der StringTree, so dass ich verschiedene Datenprovider einklinken kann. Das ist z.B. bei meinem
Registryeditor der Fall, da hier verschiedene Datenquellen als Quelle benutzt werden können.