AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein VirtualStringTree - zuweisen von RootNodeCount
Thema durchsuchen
Ansicht
Themen-Optionen

VirtualStringTree - zuweisen von RootNodeCount

Ein Thema von günni0 · begonnen am 15. Apr 2018 · letzter Beitrag vom 15. Apr 2018
Antwort Antwort
günni0
(Gast)

n/a Beiträge
 
#1

VirtualStringTree - zuweisen von RootNodeCount

  Alt 15. Apr 2018, 11:58
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 _VST.RootNodeCount := _UserDataClasses.Count; Die Frage wäre nun: schadet es, das bei jedem Schleifendurchlauf aufzurufen statt nur einmal am Ende?
Grund ist eine ausgelagerte Prozedur ohne Schleife, die für das Erstellen und Hinzufügen jeweils immer einer Klasseninstanz zuständig ist.
  Mit Zitat antworten Zitat
Aviator

Registriert seit: 3. Jun 2010
1.611 Beiträge
 
Delphi 10.3 Rio
 
#2

AW: VirtualStringTree - zuweisen von RootNodeCount

  Alt 15. Apr 2018, 12:19
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.
  Mit Zitat antworten Zitat
günni0
(Gast)

n/a Beiträge
 
#3

AW: VirtualStringTree - zuweisen von RootNodeCount

  Alt 15. Apr 2018, 12:24
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
  Mit Zitat antworten Zitat
Aviator

Registriert seit: 3. Jun 2010
1.611 Beiträge
 
Delphi 10.3 Rio
 
#4

AW: VirtualStringTree - zuweisen von RootNodeCount

  Alt 15. Apr 2018, 13:42
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.
  Mit Zitat antworten Zitat
günni0
(Gast)

n/a Beiträge
 
#5

AW: VirtualStringTree - zuweisen von RootNodeCount

  Alt 15. Apr 2018, 13:52
Zitat:
Falls das deine Frage ist: Ganz klar, erst am Schluss wenn alle Daten geladen sind.
Das bedeutet beim Programmaufruf rufe ich die Schleife auf und im Rumpf die Prozedur ErstelleInstanz. Nach der Schleife RootCount setzen.

Wie sieht das denn aus, wenn ich mitten im Programmablauf eine Klasseninstanz + Node lösche und neu hinzufüge?
  Mit Zitat antworten Zitat
Aviator

Registriert seit: 3. Jun 2010
1.611 Beiträge
 
Delphi 10.3 Rio
 
#6

AW: VirtualStringTree - zuweisen von RootNodeCount

  Alt 15. Apr 2018, 14:44
Naja, es gibt mehrere Wege das zu tun. Der erste Weg wäre, dass du einfach alle Nodes mit VST.Clear; löschst und mit VST.RootNodeCount := Count; 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.

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 VST.AddChild() ein Node hinzufügst und die bei Bedarf noch entsprechend einordnest.


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 TObjectList<T> 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 )
  Mit Zitat antworten Zitat
günni0
(Gast)

n/a Beiträge
 
#7

AW: VirtualStringTree - zuweisen von RootNodeCount

  Alt 15. Apr 2018, 14:57
Zitat:
Tipp: Speichere deine Instanzen in einer TObjectList<T> ab. Somit brauchst du später nicht mehr auf den Tree zuzugreifen wenn du mit den Instanzen arbeiten willst.
Habe ich zum Glück schon so.

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:
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;
Damit wird auch gleich mein Eintrag aus der ObjectList gelöscht.
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;
  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 06:25 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