![]() |
AW: Datenhaltung mit VirtualStringTree und Trennung der Businesslogik
Zitat:
|
AW: Datenhaltung mit VirtualStringTree und Trennung der Businesslogik
Zitat:
Delphi-Quellcode:
bzw.
RootNodeCount
Delphi-Quellcode:
benutzt wird. Bei AddChild hingegen wird die Node direkt initialisiert. Zudem ist es mit
ChildCount
Delphi-Quellcode:
soweit ich weiß auch möglich, die NodeDaten erst dynamisch und zu dem Zeitpunkt zu laden an dem sie benötigt werden (eben virtuell).
RootNodeCount
Zum Schluss noch ein kleiner Auszug aus dem VirtualTreeView SourceCode zur
Delphi-Quellcode:
Methode.
AddChild()
Zitat:
|
AW: Datenhaltung mit VirtualStringTree und Trennung der Businesslogik
Zitat:
Ich will hier ja keinesfalls für die Verwendung von AddChild sprechen. Aber es gibt eben Anwendungsfälle, wo man mit dem Weg über ChildCount erhebliche Verrenkungen machen muss. Als grobe Orientierung kann man evtl. die Anzahl der zu erzeugenden Nodes nehmen. Oder auch die Frage, ob man mit Listen arbeitet oder nicht. Außerdem möchte ich noch darauf hinweisen, dass es die Methoden BeginUpdate und EndUpdate gibt. Dadurch kann man Initialisierungen direkt durch AddChild reduzieren. Außerdem lässt man den Rechenaufwand durch Initialisierung mit dem Gebrauch von ChildCount nicht einfach weg. Vielmehr geschieht er dann "wenn er gebraucht wird". Was in der Regel bedeutet, dass er bei der Visualisierung initialisiert wird. Das kann sogar von Nachteil sein, wenn die Initialisierung rechenintensiv ist und der Anwender viel vom Scrolling Gebrauch macht. |
AW: Datenhaltung mit VirtualStringTree und Trennung der Businesslogik
Zitat:
|
AW: Datenhaltung mit VirtualStringTree und Trennung der Businesslogik
Zitat:
Wenn mein VST 1.000.000 Nodes hat und aktuell wegen der kleinen Größe des Fensters nur 20 angezeigt werden, dann sollten doch eigentlich auch nur diese 20 initialisert werden. Oder nicht? Edit habe das gerade geprüft. Es werden alle auf einen schlag initialisiert. Egal ob aktuell sichtbar oder nicht. |
AW: Datenhaltung mit VirtualStringTree und Trennung der Businesslogik
Sorry, dass ich den Beitrag wieder aufwärme, aber bin auf ein weiteres Problem gestossen. Also der Ansatz mit der der TObjectList zur Verwaltung der Nodedaten in den vorigen Beträgen, wenn diese keine weiteren Unterebenen besitzen, funktioniert sehr gut. Doch wie sieht es dann aus, wenn die Nodes unterebenen besitzen? :gruebel:
lg, jus |
AW: Datenhaltung mit VirtualStringTree und Trennung der Businesslogik
Dann gibt es in deiner
Delphi-Quellcode:
eine zusätzliche Property die ebenfalls eine
TObjectList<T>
Delphi-Quellcode:
oder ein anderer ContainerType ist. Die ChildNodes verweisen dann auf einen Eintrag in dieser Liste. Wenn die Daten vom gleichen Typ sind (wie z.B. bei einer Verzeichnisstruktur), dann ist das recht einfach, da rekursiv. Bedenke, dass du dann im
TObjectList<T>
Delphi-Quellcode:
ein
Constructor
Delphi-Quellcode:
des ChildContainers und im
Create
Delphi-Quellcode:
ein
Destruktor
Delphi-Quellcode:
ausführen solltest.
Free
|
AW: Datenhaltung mit VirtualStringTree und Trennung der Businesslogik
Zitat:
Derzeit OHNE mehrere Unterebenen schaut es bei mir so aus:
Delphi-Quellcode:
Nach der Erweiterung von VST Nodes MIT mehreren Unterebenen:
unit Unit1;
interface //.... type TNodeDataClass = class private FSpalte1: string; FSpalte2: string; FSpalte3: Integer; public property Spalte1: string read FSpalte1 write FSpalte1; property Spalte2: string read FSpalte2 write FSpalte2; property Spalte3: Integer read FSpalte3 write FSpalte3; end; TForm1 = class(TForm) vst: TVirtualStringTree; procedure FormCreate(Sender: TObject); procedure vstInitNode(Sender: TBaseVirtualTree; ParentNode, Node: PVirtualNode; var InitialStates: TVirtualNodeInitStates); procedure vstGetText(Sender: TBaseVirtualTree; Node: PVirtualNode; Column: TColumnIndex; TextType: TVSTTextType; var CellText: WideString); private DataList: TObjectList; //<--- hier die NodeObjekte von TNodeDataClass end; var Form1: TForm1; implementation
Delphi-Quellcode:
unit Unit1;
interface //.... type TNodeDataClass = class private FParentNode: TNodeDataClass; // <------ eine Referenz auf oberen Knoten notwendig???????? FSpalte1: string; FSpalte2: string; FSpalte3: Integer; FSubNodeDataList: TObjectList; // <- Für eventuelle Subnodes public property Spalte1: string read FSpalte1 write FSpalte1; property Spalte2: string read FSpalte2 write FSpalte2; property Spalte3: Integer read FSpalte3 write FSpalte3; end; TForm1 = class(TForm) vst: TVirtualStringTree; procedure FormCreate(Sender: TObject); procedure vstInitNode(Sender: TBaseVirtualTree; ParentNode, Node: PVirtualNode; var InitialStates: TVirtualNodeInitStates); procedure vstGetText(Sender: TBaseVirtualTree; Node: PVirtualNode; Column: TColumnIndex; TextType: TVSTTextType; var CellText: WideString); private RootNodeDataList: TObjectList; //<--- hier die NodeObjekte von TNodeDataClass end; var Form1: TForm1; implementation |
AW: Datenhaltung mit VirtualStringTree und Trennung der Businesslogik
Naja du könntest so etwas machen:
Delphi-Quellcode:
type
TNodeDataClass = class private FParentNodeData: TNodeDataClass; FSpalte1: string; FSpalte2: string; FSpalte3: Integer; public constructor Create(AParent: TNodeDataClass); override; property Spalte1: string read FSpalte1 write FSpalte1; property Spalte2: string read FSpalte2 write FSpalte2; property Spalte3: Integer read FSpalte3 write FSpalte3; end; implementation constructor TNodeDataClass.Create(AParent: TNodeDataClass); begin inherited Create; FParentNodeData := AParent; end; |
AW: Datenhaltung mit VirtualStringTree und Trennung der Businesslogik
Zitat:
Wenn die Knotenanzahl fest steht, dann der VST direkt den gesamten benötigten Speichern mit einer Anfrage belegen. Durch die Ereignisse können dieser dann "on demand" befüllt werden. Also von der Geschwindigkeit her - hervorragend. Ich persönlich habe das aber nie genutzt, weil es die Software imho schwieriger macht. Man muss ggf. seine DB-Komponente globaler haben und die so lange offen lassen bis alles geladen ist. Callbacks sind eh nicht jedermanns Stärke. Zitat:
AddChild hat nur den Nachteil, dass jeweils nur für ein Element der Speicher geholt wird. Hast du mal ein Link für mich, wo ICH mich schlauer machen kann? |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:57 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