![]() |
Treeview frage
Halli Hallo
ich komme nicht weiter vielleicht kann mir jemand helfen. ich benutze aus der delphi easy Helper folgende funktion um den Pfad in einem Treeview Darzustellen
Delphi-Quellcode:
Function GetNodePath(ANode: TTreenode; ADelimiter: Char='\'): String;
Begin Result := ''; while assigned(ANode) do begin Result := ADelimiter + aNode.Text + Result; ANode := ANode.Parent; end; if Result <> '' then Delete(Result,1,1); End; Nun versuche ich eine Funktion zu schreiben die das umgekehrte macht. Das heist ich über gebe einen String z.B (0/1/0) Also erster Hauptknoten; 2ter unterknoten;erster eintrag und möchte den Absolutindex des nodes zurückbekommen. Ich könnte das machen mit
Delphi-Quellcode:
das ich aber vorher nicht weiß wie viele ebenen ich übergebe muß das ganze ja dynamisch sein.
showmessage(inttostr(treeview1.Items[0].Item[1].Item[0].Absolutindex));
Ich steh auf'm Schlauch :?: wäre sehr dankbar für hilfe LG :cheer: |
AW: Treeview frage
Erstmal brauchst du einen Delimiter, woran du den Text teilen kannst.
Wenn du weißt was du da einsetzt, kannst du dann durch den Text gehen, bis das aktuelle Zeichen ein Delimiter ist. Das Wort was du dann gefunden hast, suchst du dann im aktuellen Node und wenn du das gefunden hast, dann suchst machst du das gleiche nochmal, nur eine Ebene tiefer. Ungefähr so:
Delphi-Quellcode:
So ungefähr wäre das in Pseudodelphicode :D
function getNodeToPath(ARoot : TTreeNode; APath : string; ADelimiter : Char) : TTreeNode;
begin Result := nil; TeilPfad := ''; // Füge hier so viele Zeichen aus APath an, bis du zum Delimiter kommst for child in ARoot.children do begin if child.name = TeilPfad then Result := getNodeToPath(child, Copy(APfad, 1, Length(TeilPfad) + 1), ADelimiter); end; end; MfG Fabian |
AW: Treeview frage
in diesem Fall zerlegst du natürlich erstmal den String
- entweder gleich alles über eine Explode-Funktion (in ein Array oder eine StringList) - oder stück für stück (ersten Delemitter suchen, das Wort davor rauskopieren und dieses alles samt Delemitter aus dem String löschen ... man kann sich auch die Position merken und später nur ab dieser Stelle weitersuchen, statt zu löschen) dann legst du dir den RootNode (oder einen anderen Ausgangsknoten) in eine Varibable (vom Typ TTreeNode) 1: (eine Schleife) nun kannst kannst du in diesem Node nach einem Child-Node mit deinem gefundenen Namen/Text suchen jetzt deinen gefundenen Node in deiner Varibale speichern > wenn nichts gefunden wurde, dann hier abbrechen, da der Pfad nicht existiert) und nun geht es bei 1: weiter, falls in dem String noch weitere Namen existieren > wenn nichts mehr im String ist, dann hier ebenfalls abbrechen und der gesuchte Node steht nun in deiner Variable [edit] och menno, immer diese codeverratenden Spielverderber :lol: (OK, rekursiv kann man es auch machen ... und hoffentlich hat der TE ein "neueres" Delphi, welches das For-In schon kennt) |
AW: Treeview frage
Zitat:
MfG Fabian PS: Eigentlich wollte ich das mehr pseudocodemäßig schreiben, aber nachdem das zuerst nicht ging (hatte mal den Fennec getestet) musste ich danach auch schiffen ;) PPS: Ich bin ein Freund von Rekursion. Das ist hier ja so ähnlich, als würdest du wissen wollen, wie der Vater deiner Mutter deines Schwiegervaters des Vaters heißt ;) (sofern sie leben): Du könntest alles selber machen, oder dein Vater fragen der dann den Schwiegervater und so weiter fragt :) |
AW: Treeview frage
Also das mit dem Delimiter is natürlich klar.
was nicht geht ist das suchen nach dem Text des Nodes. Das Programm laüft später in verschiedenen Sprachen. Deshalb kann ich nicht nach Text suchen. Ich erklär mal kurz wieso ich das ganze brauche vielleicht gibt es ja eine viel elgantere Lösung wenn mein baum so aussieht: (Das in Klammern ist der Absolut index) +Parameter(0) +Parameter 1 (1) Wert A (2) Wert B (3) +Einstellungen(4) habe ich das Problem wenn ich in Paramter hinter wert B noch Wert C schreibe, verschiebt sich mein Absolut Index 4 auf Absolut index 5. Deshalb möchte ich die einzelnen Punkte nicht mit dem Absolut indes ansprechen, sondern mit eben so einer Struktur wie oben beschrieben (0/0/2). Denn durch eine änderung in einem Knoten verändert sich die ansprech Syntax der anderen Knoten nicht. gibt's dafür ne einfache Lösung? :wink: ah käse die leerzeichen werden rausgelöscht nu stimmt die Baumstruktur nicht. Aber ich hoffe ihr versteht wie ich das meine |
AW: Treeview frage
Zitat:
Bsp: (0/3/2) Pseudocode... TreeNode:=TreeView.TopItem; // knoten 0 TreeNode:=TreeNode.Item[3]; TreeNode:=TreeNode.Item[2]; Das funktioniert aber nur wenn deine Baumstruktur in keiner Ebene umsortiert wird! Ansonsten würde ich einfach für jeden Knoten einen eigenen Index mit deinen Daten abspeichern. |
AW: Treeview frage
wie geht das mit dem eigenen Index abspeichern?
|
AW: Treeview frage
Ach du meine Güte :wall:
Ich wußte nicht das es eine eindeutige id für jedes Node gibt. Das macht die ganze Sache ja um 100000 einfacher :oops: Danke an alle die geantwortet haben |
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:49 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz