Hallo,
zur Darstellung von Baumdaten (mehrere 100k Knoten) nutze ich einen VirtualStringTree. Die Daten sind Teilsummen (Größe, Anzahl...) über einem Dateisystem. Hier wird also einmal komplett alles gescannt. Beispiel:
Während das Dateisystem gescannt wird, möchte ich die Daten "live" aktualisierend anzeigen. Was sich ändern kann, sind also die Spaltenwerte, HasChildren (genau einmal, wenn das Verzeichnis das erste mal besucht wird) und die Sortierung der Anzeige. Knoten können nicht verschwinden oder sich die Anzahl der Kindknoten nachträglich ändern.
Die Knoten initalisiere ich momentan per OnInitNode, OnInitChildren (für die Anzahl) und OnGetText, sortiert wird mit OnCompareNodes.
Während dem Scan lasse ich regelmäßig die sichtbaren Knoten neu initialisieren:
Delphi-Quelltext
1: 2: 3: 4: 5:
| node:= vstResults.GetFirstVisible; while node <> nil do begin vstResults.ReinitNode(node,false); node:= vstResults.GetNextVisible(node); end; |
Ab und zu passiert es jetzt, dass Knoten nicht mitbekommen, dass sie Kindknoten haben (
Beispielbild von
Teekeks - man beachte: die Spalten enthalten die richtigen Daten, der Knoten wurde also aktualisiert, hat aber keine Kinder bekommen). Dieser Bug ist sehr selten.
Selbst wenn das alles funktioniert, gibt es ein furchtbares Geflacker (durch die Sortierung, vermute ich) und die Expanded-Zustände der Knoten werden auch weggeworfen. Was ich also eigentlich bräuchte, ist ein "Teil-Reinit".
Wie macht man sowas sauber, was mache ich falsch? Mit VirtualTrees in der wirklich virtuellen Betriebsweise, also ohne alle Nodes rekursiv zu initialisieren, habe ich recht wenig Erfahrung. Ein VirtualDrawTree löst auch nur das halbe Problem, da kann die fehlende HasChildren-Weitergabe noch genauso passieren.
Viele Grüße,
Sebastian
PS: LCL-Sparte, weil es hier um den LCL-Port von VirtualTrees 5.4.1 geht. Sollte aber egal sein.
"The phoenix's price isn't inevitable. It's not part of some deep balance built into the universe. It's just the parts of the game where you haven't figured out yet how to cheat."