AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Algorithmen, Datenstrukturen und Klassendesign Delphi Datenhaltung mit VirtualStringTree und Trennung der Businesslogik
Thema durchsuchen
Ansicht
Themen-Optionen

Datenhaltung mit VirtualStringTree und Trennung der Businesslogik

Ein Thema von jus · begonnen am 24. Mär 2019 · letzter Beitrag vom 2. Mai 2019
Antwort Antwort
Seite 1 von 5  1 23     Letzte »    
jus

Registriert seit: 22. Jan 2005
344 Beiträge
 
Delphi 2007 Professional
 
#1

Datenhaltung mit VirtualStringTree und Trennung der Businesslogik

  Alt 24. Mär 2019, 17:57
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?
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

Geändert von jus (24. Mär 2019 um 18:00 Uhr)
  Mit Zitat antworten Zitat
Aviator

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

AW: Datenhaltung mit VirtualStringTree und Trennung der Businesslogik

  Alt 24. Mär 2019, 19:59
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 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.
  Mit Zitat antworten Zitat
Ghostwalker

Registriert seit: 16. Jun 2003
Ort: Schönwald
1.299 Beiträge
 
Delphi 10.3 Rio
 
#3

AW: Datenhaltung mit VirtualStringTree und Trennung der Businesslogik

  Alt 25. Mär 2019, 04:49
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)
Uwe
e=mc² or energy = milk * coffee²
  Mit Zitat antworten Zitat
jus

Registriert seit: 22. Jan 2005
344 Beiträge
 
Delphi 2007 Professional
 
#4

AW: Datenhaltung mit VirtualStringTree und Trennung der Businesslogik

  Alt 25. Mär 2019, 23:36
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.
  Mit Zitat antworten Zitat
jus

Registriert seit: 22. Jan 2005
344 Beiträge
 
Delphi 2007 Professional
 
#5

AW: Datenhaltung mit VirtualStringTree und Trennung der Businesslogik

  Alt 25. Mär 2019, 23:38
Bezüglich der Datenhaltung solltest du dir 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?
  Mit Zitat antworten Zitat
DieDolly

Registriert seit: 22. Jun 2018
2.175 Beiträge
 
#6

AW: Datenhaltung mit VirtualStringTree und Trennung der Businesslogik

  Alt 26. Mär 2019, 00:14
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.

Geändert von DieDolly (26. Mär 2019 um 00:18 Uhr)
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.858 Beiträge
 
Delphi 11 Alexandria
 
#7

AW: Datenhaltung mit VirtualStringTree und Trennung der Businesslogik

  Alt 26. Mär 2019, 08:02
Ist vielleicht auch für dein Problem etwas (https://bitbucket.org/urupprecht/datatree)
Oder https://github.com/davidberneda/GenericTree
Markus Kinzler
  Mit Zitat antworten Zitat
Aviator

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

AW: Datenhaltung mit VirtualStringTree und Trennung der Businesslogik

  Alt 26. Mär 2019, 12:55
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;
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

Registriert seit: 12. Aug 2003
Ort: Soest
4.017 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#9

AW: Datenhaltung mit VirtualStringTree und Trennung der Businesslogik

  Alt 26. Mär 2019, 13:43
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.
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight
  Mit Zitat antworten Zitat
DieDolly

Registriert seit: 22. Jun 2018
2.175 Beiträge
 
#10

AW: Datenhaltung mit VirtualStringTree und Trennung der Businesslogik

  Alt 26. Mär 2019, 14:22
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)
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;

Geändert von DieDolly (26. Mär 2019 um 15:34 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 5  1 23     Letzte »    


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 23:01 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