![]() |
VirtualStringTree - zuweisen von RootNodeCount
Kurze und knackige Frage.
Ich erstelle in einer Schleife von einer Klasse Instanzen und füge sie einer generischen Liste hinzu. Nach der Schleife rufe ich einmalig auf
Delphi-Quellcode:
Die Frage wäre nun: schadet es, das bei jedem Schleifendurchlauf aufzurufen statt nur einmal am Ende?
_VST.RootNodeCount := _UserDataClasses.Count;
Grund ist eine ausgelagerte Prozedur ohne Schleife, die für das Erstellen und Hinzufügen jeweils immer einer Klasseninstanz zuständig ist. |
AW: VirtualStringTree - zuweisen von RootNodeCount
Die Frage ist wirklich etwas zu kurz gestellt.
Du musst natürlich für jede VST Instanz den RootNodeCount setzen. Wenn da mehrere sind, dann wird der Aufruf eben auch pro Schleifendurchgang gemacht. |
AW: VirtualStringTree - zuweisen von RootNodeCount
Ok hier etwas Pseudocode, ohne Funktionalität, aber hoffentlich verständlich
Delphi-Quellcode:
procedure ErstelleInstanz(SetRootCount: Boolean);
begin _UserData := TUserData.Create; _UserData.Index := _UserDataClasses.Count; _UserData.A := 1; _UserData.B := 2; ... ... if SetrootCount then _VST.RootNodeCount := _UserDataClasses.Count; end;
Delphi-Quellcode:
procedure SchnickSchnack_A;
begin von 0 bis 100 begin ErstelleInstanz(True); end; end; // ODER procedure SchnickSchnack_B; begin von 0 bis 100 begin ErstelleInstanz(False); end; _VST.RootNodeCount := _UserDataClasses.Count; end; Ich hoffe du verstehst was ich meine :pale: |
AW: VirtualStringTree - zuweisen von RootNodeCount
Ich glaube ja. Du erstellst in einer Schleife n Instanzen einer Klasse. Deine Frage ist, ob du pro Schleifendurchlauf den RootNodeCount setzen sollst oder eben erst am Schluss.
Falls das deine Frage ist: Ganz klar, erst am Schluss wenn alle Daten geladen sind. |
AW: VirtualStringTree - zuweisen von RootNodeCount
Zitat:
Wie sieht das denn aus, wenn ich mitten im Programmablauf eine Klasseninstanz + Node lösche und neu hinzufüge? |
AW: VirtualStringTree - zuweisen von RootNodeCount
Naja, es gibt mehrere Wege das zu tun. Der erste Weg wäre, dass du einfach alle Nodes mit
Delphi-Quellcode:
löschst und mit
VST.Clear;
Delphi-Quellcode:
erstellst. Je nachdem wie aufwendig dein VST aufgebaut ist und wie viele Nodes es gibt, kann das natürlich etwas dauern. Aber dann hast du wahrscheinlich schon wieder so viele Nodes, dass du deine Vorgehensweise überdenken musst. Alternativ die Node löschen und dann RootNodeCount wieder setzen. Da bist du sehr frei was die Vorgehensweise angeht.
VST.RootNodeCount := Count;
Der Weg über RootNodeCount ist allerdings der bevorzugte Weg, da das am ehesten etwas mit dem virtuellen Vorgehen des Trees zu tun hat. (Siehe Kommentar von Mike Lischke bei der VST Function AddChild()). Der zweite Weg ist, dass du eben mit
Delphi-Quellcode:
ein Node hinzufügst und die bei Bedarf noch entsprechend einordnest.
VST.AddChild()
Aber du solltest dich auf eine Vorgehensweise festlegen. Da du schon RootNodeCount verwendest, würde ich mit der ersten Lösung steil gehen. Tipp: Speichere deine Instanzen in einer
Delphi-Quellcode:
ab. Somit brauchst du später nicht mehr auf den Tree zuzugreifen wenn du mit den Instanzen arbeiten willst. (Wenn du das nicht sowieso schon machst. Kann man aus Pseudocode so schlecht erkennen ;) )
TObjectList<T>
|
AW: VirtualStringTree - zuweisen von RootNodeCount
Zitat:
Ich denke ich bleibe dann dabei, dass ich initial beim Programmablauf meine Daten lade, die Klasseninstanzen erstelle, in die ObjectList packe und ganz zum Schluss RootNodeCount setze. Wenn ich im Laufe des Programms eine Instanz / Node löschen muss, mache ich das so
Delphi-Quellcode:
Damit wird auch gleich mein Eintrag aus der ObjectList gelöscht.
Function ... GetNodeByIndex(iIndex : Integer) : PVirtualNode; // Quelle: siehe unten
begin Result := VST.GetFirst(True); while Assigned(Result) and (vst.AbsoluteIndex(Result) <> iIndex) do Result := Vst.GetNext(Result, True); end; // Was besser ist, Beitrag 7 oder 11, weiß ich nicht // 7 : https://www.delphipraxis.net/963615-post7.html // 11: https://www.delphipraxis.net/1220760-post11.html procedure ... var Node: PVirtualNode; begin Node := GetNodeByIndex(2); if Assigned(Node) then VST.DeleteNode(Node); end; Danach kann ich mit meiner Prozedur ErstelleInstanz(2, True) wieder einen neuen Eintrag an Position 2 (absolut 3) hinzufügen
Delphi-Quellcode:
procedure ErstelleInstanz(InsertAtPosition: Integer = -1; SetRootCount: Boolean = True);
begin _UserData := TUserData.Create; _UserData.Index := _UserDataClasses.Count; _UserData.A := 1; _UserData.B := 2; ... ... if InsertAtPosition > -1 then _UserDataClasses.Insert(InsertAtPosition, _UserData) else _UserDataClasses.Add(_UserData); if SetrootCount then _VST.RootNodeCount := _UserDataClasses.Count; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:51 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