Delphi-PRAXiS
Seite 1 von 5  1 23     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Delphi Datenhaltung mit VirtualStringTree und Trennung der Businesslogik (https://www.delphipraxis.net/200152-datenhaltung-mit-virtualstringtree-und-trennung-der-businesslogik.html)

jus 24. Mär 2019 16:57

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

Aviator 24. Mär 2019 18:59

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:
TObjectList<T>
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.

Ghostwalker 25. Mär 2019 03:49

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 (https://bitbucket.org/urupprecht/datatree) :)

jus 25. Mär 2019 22:36

AW: Datenhaltung mit VirtualStringTree und Trennung der Businesslogik
 
Zitat:

Zitat von Ghostwalker (Beitrag 1428599)
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 (https://bitbucket.org/urupprecht/datatree) :)

@Ghostwalter: Vielen Dank für die Unit. Die muß ich mir in Ruhe mal anschauen.

jus 25. Mär 2019 22:38

AW: Datenhaltung mit VirtualStringTree und Trennung der Businesslogik
 
Zitat:

Zitat von Aviator (Beitrag 1428584)
Bezüglich der Datenhaltung solltest du dir
Delphi-Quellcode:
TObjectList<T>
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.

Hallo Aviator, könntest du mir bitte ein Beispiel zeigen, wie man die Objekte von einer ObjectList mit VST Nodedaten verknüpft?

DieDolly 25. Mär 2019 23:14

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:
function TVirtualNode.IsAssigned: Boolean;

// Returns False if this node is nil, True otherwise

begin
  Exit(@Self <> nil);
end;
Das da findet man schon von Haus aus im VST Code. Andere Sachen sicherlich auch.

mkinzler 26. Mär 2019 07:02

AW: Datenhaltung mit VirtualStringTree und Trennung der Businesslogik
 
Zitat:

Zitat von Ghostwalker (Beitrag 1428599)
Ist vielleicht auch für dein Problem etwas (https://bitbucket.org/urupprecht/datatree) :)

Oder https://github.com/davidberneda/GenericTree

Aviator 26. Mär 2019 11:55

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;

Stevie 26. Mär 2019 12:43

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.

DieDolly 26. Mär 2019 13:22

AW: Datenhaltung mit VirtualStringTree und Trennung der Businesslogik
 
Ich würde es so machen

1. Datenklasse
Delphi-Quellcode:
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.
2. Instanz(variable) der generischen Datenklassenliste bereitstellen und Datenklassenliste erzeugen
Delphi-Quellcode:
var // irgendwo ...
 NodeDataList: TNodeDataList;

// FormCreate oder so
NodeDataList := NodeDataList.Create(True);
3. Daten der Liste hinzufügen
Delphi-Quellcode:
var
 NodeData: TNodeData;
begin
 NodeData := TNodeData.Create;
 NodeData.Text := 'jus';

 NodeDataList.Add(NodeData);
 VST.RootCount := NodeDataList.Count;
4. Node (löscht automatisch Datenklasseninstanz)
Delphi-Quellcode:
NodeDataList.Delete(2);
5. Node im VST initialisieren
Delphi-Quellcode:
procedure TNodeEvents.VSTInitNode(Sender: TBaseVirtualTree; ParentNode, Node: PVirtualNode; var InitialStates: TVirtualNodeInitStates);
begin
 Node.SetData<TNodeData>(NodeDataList[Node.Index]);
end;
6. Node-Daten anzeigen
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 04:27 Uhr.
Seite 1 von 5  1 23     Letzte »    

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