Delphi-PRAXiS
Seite 2 von 5     12 34     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)

Codehunter 26. Mär 2019 14:37

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.

DieDolly 26. Mär 2019 14:41

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.

Codehunter 26. Mär 2019 14:58

AW: Datenhaltung mit VirtualStringTree und Trennung der Businesslogik
 
Zitat:

Zitat von DieDolly (Beitrag 1428770)
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.

Eben eben! Das hier landet letztendlich auch im VST. Da habe ich derzeit einen Record wo ein Pointer drin ist auf eine Objektinstanz. Im Grunde will ja der TE auch genau sowas machen. Wäre mit Generics ungleich einfacher.

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).

DieDolly 26. Mär 2019 15:12

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.

Codehunter 26. Mär 2019 15:26

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.

generic 26. Mär 2019 16:55

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:
https://www.delphipraxis.net/712774-post4.html

Aviator 26. Mär 2019 21:39

AW: Datenhaltung mit VirtualStringTree und Trennung der Businesslogik
 
Zitat:

Zitat von Codehunter (Beitrag 1428768)
@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.

Also ich würde mal sagen das es das schon seit 4 Jahren gibt. :lol: https://github.com/Virtual-TreeView/...c4f91c0a096aeb

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:
PClass = ^TClass
dazu zuschreiben stört mich weniger.

DieDolly 26. Mär 2019 21:42

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 PClass = ^TClass dazu zuschreiben stört mich weniger.
Ist mein Code auf der vorherigen Seite so wie du das schreiben würdest? Bin gerade etwas verwirrt, weil du sagst du benutzt keine Generics.

Aviator 26. Mär 2019 22:26

AW: Datenhaltung mit VirtualStringTree und Trennung der Businesslogik
 
Zitat:

Zitat von DieDolly (Beitrag 1428829)
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 PClass = ^TClass dazu zuschreiben stört mich weniger.
Ist mein Code auf der vorherigen Seite so wie du das schreiben würdest? Bin gerade etwas verwirrt, weil du sagst du benutzt keine Generics.

Hmm ja. Das war vielleicht etwas blöd ausgedrückt. Ich meinte, dass ich die generischen Funktionen des VST wie
Delphi-Quellcode:
GetNodeData<T>
nicht benutze. Ich nutze eigentlich immer die standard Funktionen. Wahrscheinlich auch, weil ich eine Zeit lang kompatibel zu alten Versionen geblieben bin.

jus 27. Mär 2019 15:42

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:
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.
Lg,
jus


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:25 Uhr.
Seite 2 von 5     12 34     Letzte »    

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