Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi VirtualTreeView filtern (https://www.delphipraxis.net/139141-virtualtreeview-filtern.html)

Roaster 24. Aug 2009 15:45


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:
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;
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.

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?

generic 24. Aug 2009 16:09

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.
http://www.delphipraxis.net/videos#Stammtisch_2

Beispielcode hier:
http://www.delphipraxis.net/internal...=817819#817819


Und:
Ja, du musst auf die Struktur Rücksicht nehmen.
Vielleicht durch eine Rekursive Programmierung?

Hawkeye219 24. Aug 2009 17:54

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:
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;
Die Bestimmung des Knotentyps musst du noch einbauen. Vergiss auch das fehlende treeAccounts.EndUpdate nicht...

Gruß Hawkeye


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:45 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz