![]() |
VirtualTreeView filtern
Hi,
ich benutze diesen Code, den ich als Vorlage hier in der DP gefunden habe, um die Knoten eines VirtualTreeViews zu filtern:
Delphi-Quellcode:
Dies klappt soweit nur suche ich nach einer Lösung bei der die Eltern-Knoten nicht ausgeblendet werden, sobald eines der darunterliegenden Kinder dem Filter-/Suchtext entspricht.
procedure TfrmSelNode.FilterNodes(const Text : string; SearchType : TSearchType);
var Node : PVirtualNode; Data : PPWCTreeNode; begin Screen.Cursor := crHourGlass; treeAccounts.BeginUpdate; Node := treeAccounts.GetFirst; while Node <> nil do begin Data := treeAccounts.GetNodeData(Node); if not MatchStr(Data^.Caption, Text, False) then Node.States := Node.States - [vsVisible] else Node.States := Node.States + [vsVisible]; Node := treeAccounts.GetNext(Node); end; end; Mit dem oben gezeigten Code passiert nämlich genau dieses. Erstmal denke ich berücksichtigt der Code schon mal gar nicht eine hierarchische Anordnung, da immer nur mit GetNext durch den Baum gelesen wird und ich denke dass dies mit ein Problem ist, wenn ich das oben genannte erreichen will. Ich suche somit nach einem Coding, das den Baum vom Root bis zum letzten Knoten durchsuchen kann, nicht gewünschte ausblendet und dabei aber die Hierarchie beachtet. Hintergrund ist der, dass ich in diesem Baum sowas wie Ordner und Dateien anzeige, die je nach eingegebenem Filter ein oder ausgeblendet werden sollen. Trifft das Filterkriterium dabei auf eine Datei, so sollten die darüberliegenden Ordner nicht verschwinden. Hat jemand schon mal was ähnliches versucht? |
Re: VirtualTreeView filtern
Du machst da eine großes "nicht machen".
Verändere nie die Nodedata direkt, sondern geht IMMER über die VST Methode. In deinem Fall dann vst.IsVisible[node]:= <true | false>; [edit]Ich schreib nochmal schnell dazu warum: Viele Methoden erzeugen das sich der Tree neu zeichnet bzw. die Methoden nehmen Rücksicht auf den aktuellen Zustand des Trees und dessen Knoten. Auch für Kompatibilität zu anderen Versionen ist es besser wenn du die Methoden nimmst und NICHT auf interne Strukturen zugreifst. [/edit] Ansonsten wie immer an dieser Stelle den Hinweis auf das Stammtisch Video #2. ![]() Beispielcode hier: ![]() Und: Ja, du musst auf die Struktur Rücksicht nehmen. Vielleicht durch eine Rekursive Programmierung? |
Re: VirtualTreeView filtern
Hallo Michael,
du könntest den Baum auch rückwärts durchlaufen (GetLast/GetPrevious) und bei jedem Knoten die Sichtbarkeit in Abhängigkeit des Knotentyps festlegen:
Delphi-Quellcode:
Die Bestimmung des Knotentyps musst du noch einbauen. Vergiss auch das fehlende treeAccounts.EndUpdate nicht...
Node := treeAccounts.GetLast;
while Node <> nil do begin Data := treeAccounts.GetNodeData(Node); if "Node ist ein Ordnerknoten" then treeAccounts.IsVisible[Node] := Assigned(treeAccounts.GetFirstVisibleChild(Node)) else treeAccounts.IsVisible[Node] := MatchStr(Data^.Caption, Text, False); Node := treeAccounts.GetPrevious(Node); end; Gruß Hawkeye |
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:08 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