![]() |
Datenhaltung mit VirtualStringTree und Trennung der Businesslogik
Hallo,
ich versuche seit einiger Zeit ein paar von meinen Programmen zwischen GUI und Businesslogik aufzutrennen. Da kommt man dann vermutlich um die Begriffe wie MVVM oder generell MV* Sachen nicht mehr herum. Mich hat das MVVM Modell irgendwie eher zugesagt. Ich muß zu zugeben, dass ich noch nicht soweit bin, dass ich irgendwie konform mit dem MVVM Modell bin. Fürs Erste versuche ich mal das Programm auf 3 Schichten (GUI, Verbindungsschicht zwischen GUI und Businesslogik, Businesslogik) aufzutrennen. Im Prinzip speichere ich die benötigten Daten der GUI Komponenten(TEdit.Text, TCombox.Itemindex,...) in der Verbindungsschicht um diese bei Bedarf weiterverbeiten zu können. Da in in meinen Programmen aber öfters auch mal VirtualStringTree einsetze bin ich auf ein grundlegendes Dilemma für mich gestossen und hätte gerne Eure Expertenmeinung benötigt. Und zwar enthält der VST implizit die sämtliche Daten, die man dann mit "VSTIrgendwas.GetNodeData(Node)" aufruft. Bei mir ist es so, dass der VST-Node ein einfaches Datenrecord enthält. Doch irgendwie widerspricht es doch irgendwie meinem Verständnis, dass die GUI Komponente alle Daten beherbergt. Sollte es nicht eigentlich eher die darunterliegenden Schichten sein, die alle Daten enthalten und kennen? :gruebel: Derzeit mache ich es so, dass ich bei OnChange Ereignis von VST den Record von aktuell ausgewählten Node in die Verbindungsschicht mitschicke. Doch meine Frage ist, wir würde ihr das machen? Lg, jus |
AW: Datenhaltung mit VirtualStringTree und Trennung der Businesslogik
MVVM ist ja mit Delphi wohl nicht so schön möglich wie bspw. mit C# und WPF. Zumindest gibt es hier im Forum diverse Threads darüber.
Bezüglich der Datenhaltung solltest du dir
Delphi-Quellcode:
anschauen. Dort werden deine Instanzen gespeichert. Die Node erhält dann als NodeData nur noch einen Pointer oder alternativ den ItemIndex das Objekt in der Liste. Zumindest mache ich das so und das hat sich auch bewährt. Die Daten können auch ohne Tree existieren und man kann problemlos mit ihnen arbeiten.
TObjectList<T>
|
AW: Datenhaltung mit VirtualStringTree und Trennung der Businesslogik
Hi,
vor einiger Zeit stand ich vor einem Ähnlichen Problem mit VST, weshalb ich mir eine Klasse geschrieben hat, die, die Daten in der gleichen Art und Weise handhabt, wie VST, diese aber eben nur verwaltet und nix mit der Darstellung zu tun hat. Ist vielleicht auch für dein Problem etwas ( ![]() |
AW: Datenhaltung mit VirtualStringTree und Trennung der Businesslogik
Zitat:
|
AW: Datenhaltung mit VirtualStringTree und Trennung der Businesslogik
Zitat:
|
AW: Datenhaltung mit VirtualStringTree und Trennung der Businesslogik
Ich bin mir nicht sicher aber ich finde die oben genannte Klasse macht alles nur noch viel komplizierter. Besonders für jemanden der noch nie was mit VST und paralleler Datenhaltung dafür zu tun hatte.
Mit einer ganz einfachen eventuell generischen TObjectList und 1 oder 2 Helferprozeduren, wenn überhaupt welche..., braucht man diese Klasse nicht. Selbstgeschriebener Code ist noch immer am besten. Den den versteht man auch am besten. Nur als kleines Beispiel, warum die Klasse eigentlich nicht notwendig ist.
Delphi-Quellcode:
Das da findet man schon von Haus aus im VST Code. Andere Sachen sicherlich auch.
function TVirtualNode.IsAssigned: Boolean;
// Returns False if this node is nil, True otherwise begin Exit(@Self <> nil); end; |
AW: Datenhaltung mit VirtualStringTree und Trennung der Businesslogik
Zitat:
![]() |
AW: Datenhaltung mit VirtualStringTree und Trennung der Businesslogik
Also eine sehr abgespeckte Variante wäre diese hier. (Aus dem Kopf geschrieben und auch nicht vollständig). Damit weist du der Node eine Objekt Instanz aus einer ObjectList zu. Dieses Objekt muss natürlich mit dem Index auch existieren. Beim Sortieren sollte sogar dann auch nichts passieren, da die Referenz ja bleibt. Es wird nur im Init Event einmal auf die ObjectList zugegriffen und das Item genommen, das mit dem NodeIndex übereinstimmt.
Delphi-Quellcode:
procedure TForm1.VSTInitNode(Sender: TBaseVirtualTree; Node: PVirtualNode; var InitialStates: TVTInitialStates);
var NodeData: PNodeData; begin NodeData := Sender.GetNodeData(Node); NodeData^ := ObjectList[Node^.Index]; end; |
AW: Datenhaltung mit VirtualStringTree und Trennung der Businesslogik
Wir nutzen dafür schon seit Jahren erfolgreich den TTreeViewPresenter aus DSharp. Der Übernimmt die Interaktion zwischen Daten (funktioniert über Spring4D IObjectList), Darstellungslogik (data template steuert, was wie ausgegeben und wie Daten strukturiert sind) und dem TVirtualTreeView.
|
AW: Datenhaltung mit VirtualStringTree und Trennung der Businesslogik
Ich würde es so machen
1. Datenklasse
Delphi-Quellcode:
2. Instanz(variable) der generischen Datenklassenliste bereitstellen und Datenklassenliste erzeugen
unit Datenklasse;
interface type TNodeData = class(TClass) private FText: string; public property Text: string read FText write SetText; end; type TNodeDataList = TObjectList<TNodeData>; implementation procedure TNodeData.SetText(const Value: string); begin FText:= 'Hallo ' + Value + '!'; end; end.
Delphi-Quellcode:
3. Daten der Liste hinzufügen
var // irgendwo ...
NodeDataList: TNodeDataList; // FormCreate oder so NodeDataList := NodeDataList.Create(True);
Delphi-Quellcode:
4. Node (löscht automatisch Datenklasseninstanz)
var
NodeData: TNodeData; begin NodeData := TNodeData.Create; NodeData.Text := 'jus'; NodeDataList.Add(NodeData); VST.RootCount := NodeDataList.Count;
Delphi-Quellcode:
5. Node im VST initialisieren
NodeDataList.Delete(2);
Delphi-Quellcode:
6. Node-Daten anzeigen
procedure TNodeEvents.VSTInitNode(Sender: TBaseVirtualTree; ParentNode, Node: PVirtualNode; var InitialStates: TVirtualNodeInitStates);
begin Node.SetData<TNodeData>(NodeDataList[Node.Index]); end;
Delphi-Quellcode:
procedure TNodeEvents.VSTGetText(Sender: TBaseVirtualTree; Node: PVirtualNode; Column: TColumnIndex; TextType: TVSTTextType; var CellText: string);
var NodeData: TNodeData; begin NodeData := Node.GetData<TNodeData>; if not Assigned(NodeData) then Exit; case Column of 0: CellText := NodeData.Text; end; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:00 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