AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

VirtualTreeView filtern

Offene Frage von "Roaster"
Ein Thema von Roaster · begonnen am 24. Aug 2009 · letzter Beitrag vom 24. Aug 2009
Antwort Antwort
Roaster

Registriert seit: 21. Jul 2004
Ort: bei mir zu Hause
107 Beiträge
 
#1

VirtualTreeView filtern

  Alt 24. Aug 2009, 16:45
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?
cu, Michael

Windows 7, WinXP Pro, Vista, WinXP Home, Win98 SE
D4 C/S, D7 Enterprise, Turbo Delphi Pro, Delphi 2009
  Mit Zitat antworten Zitat
generic

Registriert seit: 24. Mär 2004
Ort: bei Hannover
2.416 Beiträge
 
Delphi XE5 Professional
 
#2

Re: VirtualTreeView filtern

  Alt 24. Aug 2009, 17:09
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?
Coding BOTT - Video Tutorials rund um das Programmieren - https://www.youtube.com/@codingbott
  Mit Zitat antworten Zitat
Hawkeye219

Registriert seit: 18. Feb 2006
Ort: Stolberg
2.227 Beiträge
 
Delphi 2010 Professional
 
#3

Re: VirtualTreeView filtern

  Alt 24. Aug 2009, 18:54
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
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:27 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