![]() |
AW: Datenhaltung mit VirtualStringTree und Trennung der Businesslogik
@DieDolly: Huch, seit wann kann denn der VST generische Daten? Ich nutz den schon soooo lange, dass ich immer noch mit klassischen Records arbeite. Geht auch, aber dein Beispiel würde hier auch vieles sehr vereinfachen. Irgendwie ist dieses Feature komplett an mir vorbei gegangen.
|
AW: Datenhaltung mit VirtualStringTree und Trennung der Businesslogik
Die OOP/generischen Ansätze gingen schon mehrmals hier durch die Praxis. Wie man sieht, jetzt schon wieder.
Ich benutze das VST nur noch so und es ist so unglaublich viel einfacher als vorher. Man braucht keine riesen Helferklassen im Hintergrund. Mein Beispiel ist das was man braucht, um seine Daten getrennt vom VST halten und managen zu können. Natürlich kommen noch mehr Properties und Helferprozeduren hinzu. Je nachdem was man denn braucht. Aber das ist dann noch immer einfacher als mit den hier erwähnten Helferklassen. |
AW: Datenhaltung mit VirtualStringTree und Trennung der Businesslogik
Zitat:
![]() Allerdings, wenn man mit dem VST noch nicht viel Erfahrung hat, kann einen das völlig erschlagen, dieses Featuremonster. Egal ob mit Records oder Generics. Man kann auch viele Vorteile zunichte machen, zum Bsp. wenn man iterativ Add() statt ChildCount verwendet. Wobei letzteres wiederum tricky ist bei der Initialisierung, wenn man keine indizierten Listen hat (z.B. TDictionary). |
AW: Datenhaltung mit VirtualStringTree und Trennung der Businesslogik
Ganz einfach erklärt kann man sich das so vorstellen.
Man stelle sich einen Node im VST vor. Jeder dieser Nodes hat nun als Datengrundlage eine komplette Instanz der TNodeData-Klassendaten. In der Natur vergleichbar mit einer Goldfruchtpalme. Jeder Strang ist ein Node und jeder Node hat eine Klasseninstanz mit allen Properties (die Blätter am Strang). Ich habe mich damit anfangs auch sehr schwer getan. Und eben deswegen habe ich dann auch erst Add() und sowas benutzt was das Ziel Daten von GUI trennen natürlich verfehlte. Irgendwann habe ich mich hingesetzt und einfach Code aus der Praxis abgeschrieben. Der Lerneffekt kommt dann irgendwann von alleine, wenn man mal selber eine listenbasierte Datenhaltung benötigt. |
AW: Datenhaltung mit VirtualStringTree und Trennung der Businesslogik
Wobei man der Versuchung widerstehen muss, seinen Datenobjekten in irgendeiner Form einen PVirtualNode als Property zu verpassen. Das geht schnell, dass man dann wieder versucht die Visualisierung aus den Datenobjekten heraus zu steuern.
Ich nutze den VST jedenfalls bevorzugt als Grid. Da gibt es IMHO nichts effizienteres. Schon gar nicht solche Schwergewichte wie z.B. DevExpress. Wenn man die Daten ohnehin schon irgendwo im Speicher rumliegen hat, braucht man die nicht noch drölfzig Mal hin und her alloziieren bis man sie mal auf den Bildschirm gepinselt hat. |
AW: Datenhaltung mit VirtualStringTree und Trennung der Businesslogik
Ich werfe mal einfach folgendes zur Diskussion bei:
Meine Geschäftslogik ruft Emails ab. D.h. ich habe eine Liste von Emails. Wenn ich diese Emails nun zur Anzeige bringen will, kommt die Darstellungsfrage auf. D.h. möchte ich diese z.B. nach Datum, Betreff oder Thread sortiert/gruppiert sehen. Abhängig davon würde ich jetzt anfangen meinen VST mit Knoten und Unterknoten zu erstellen. Die Knotendaten selbst sind aber nur ein Zeiger auf das Objekt in meiner Liste. Objekte verlinken hatte ich u.a. 2007 im Stammtisch #2 gezeigt: ![]() |
AW: Datenhaltung mit VirtualStringTree und Trennung der Businesslogik
Zitat:
![]() Ich selbst benutze die Generics auch kaum bis gar nicht. Ich arbeite nur noch mit Objekt Instanzen in einer TObjectList<T>. Und da noch ein
Delphi-Quellcode:
dazu zuschreiben stört mich weniger.
PClass = ^TClass
|
AW: Datenhaltung mit VirtualStringTree und Trennung der Businesslogik
Zitat:
|
AW: Datenhaltung mit VirtualStringTree und Trennung der Businesslogik
Zitat:
Delphi-Quellcode:
nicht benutze. Ich nutze eigentlich immer die standard Funktionen. Wahrscheinlich auch, weil ich eine Zeit lang kompatibel zu alten Versionen geblieben bin.
GetNodeData<T>
|
AW: Datenhaltung mit VirtualStringTree und Trennung der Businesslogik
Liste der Anhänge anzeigen (Anzahl: 1)
Vielen Dank an die Mitwirkenden, besonders Aviator und DieDolly. Leider habe ich immer noch Delphi 2007 im Einsatz darum gehen keine Generics.
Anbei der Ansatz für Leute, die noch ein altes Delphi wie ich einsetzen. Ich hoffe, dass ich da keinen logischen Fehler drin habe.
Delphi-Quellcode:
Lg,
unit Unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, Contnrs, StdCtrls, VirtualTrees; 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; PTreeData = ^TTreeData; TTreeData = record FObject : TObject; end; TForm1 = class(TForm) vst: TVirtualStringTree; Button1: TButton; procedure FormCreate(Sender: TObject); procedure Button1Click(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 { Private-Deklarationen } DataList: TObjectList; public { Public-Deklarationen } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); var I: Integer; Node: PVirtualNode; begin VST.NodeDataSize := SizeOf(TTreeData); VST.RootNodeCount := DataList.Count; end; procedure TForm1.FormCreate(Sender: TObject); var i: Integer; NodeData: TNodeDataClass; begin DataList := TObjectList.Create; for i := 0 to 3 do begin NodeData := TNodeDataClass.Create; NodeData.Spalte1 := IntToStr(i); NodeData.Spalte2 := 'Spalte '+IntToStr(i); NodeData.Spalte3 := i; DataList.Add(NodeData); end; end; procedure TForm1.vstGetText(Sender: TBaseVirtualTree; Node: PVirtualNode; Column: TColumnIndex; TextType: TVSTTextType; var CellText: WideString); var data: PTreeData; begin data:= Sender.GetNodeData(Node); case Column of 0: CellText := TNodeDataClass(data^.FObject).FSpalte1; 1: CellText := TNodeDataClass(data^.FObject).FSpalte2; 2: CellText := IntToStr(TNodeDataClass(data^.FObject).FSpalte3); end; end; procedure TForm1.vstInitNode(Sender: TBaseVirtualTree; ParentNode, Node: PVirtualNode; var InitialStates: TVirtualNodeInitStates); var data: PTreeData; begin data := Sender.GetNodeData(Node); data^.FObject := DataList[Node.Index]; end; end. jus |
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:25 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