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 3 von 5     123 45      
DieDolly

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

AW: Datenhaltung mit VirtualStringTree und Trennung der Businesslogik

  Alt 27. Mär 2019, 16:57
Zur Sicherheit würde ich immer einfügen ...
Delphi-Quellcode:
data:= Sender.GetNodeData(Node);

if not Assigned(data) //
 Exit; //
Zitat:
Leider habe ich immer noch Delphi 2007 im Einsatz darum gehen keine Generics.
Delphi Rio Community Edition womöglich eine Lösung?
  Mit Zitat antworten Zitat
jus

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

AW: Datenhaltung mit VirtualStringTree und Trennung der Businesslogik

  Alt 27. Mär 2019, 22:19
Zur Sicherheit würde ich immer einfügen ...
Delphi-Quellcode:
data:= Sender.GetNodeData(Node);

if not Assigned(data) //
 Exit; //
Zitat:
Leider habe ich immer noch Delphi 2007 im Einsatz darum gehen keine Generics.
Delphi Rio Community Edition womöglich eine Lösung?
yep... hast recht, sollte noch rein
  Mit Zitat antworten Zitat
DieDolly

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

AW: Datenhaltung mit VirtualStringTree und Trennung der Businesslogik

  Alt 27. Mär 2019, 22:24
Und der Vollständigkeit halber, so gehts auch

Delphi-Quellcode:
data:= Sender.GetNodeData(Node);

if not data.IsAssigned then
 Exit;
Geschmackssache, was man wählt.
  Mit Zitat antworten Zitat
jus

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

AW: Datenhaltung mit VirtualStringTree und Trennung der Businesslogik

  Alt 27. Mär 2019, 22:46
Und der Vollständigkeit halber, so gehts auch

Delphi-Quellcode:
data:= Sender.GetNodeData(Node);

if not data.IsAssigned then
 Exit;
Geschmackssache, was man wählt.
Ich vermute, dass es bei den neueren VST den Befehl "data.IsAssigned" gibt. Bei meiner alten VST kennt er den Befehl noch nicht. Was bei meiner alten VST gerade noch aufgefallen ist, ist, dass mit der Prüfung von folgenden Befehl nicht getan ist, da es immer ASSIGNED ist:
Delphi-Quellcode:
data:= Sender.GetNodeData(Node);
if not Assigned(data) then Exit;
Es müßte eigentlich heissen, oder zumindest bei meiner alten VST Version unter Delphi 2007:
Delphi-Quellcode:
data:= Sender.GetNodeData(Node);
if not Assigned(data^.FObject) then Exit;
Lg,
jus
  Mit Zitat antworten Zitat
jus

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

AW: Datenhaltung mit VirtualStringTree und Trennung der Businesslogik

  Alt 27. Mär 2019, 23:50
So zur späten Stunde noch eine neue Version mit einer kleinen Automatisierung beim Verknüpfen von VST mit TObjectList, indem ich eine neue Methode mit TBindVSTToObjectListHelperClass.BindVST einführe.

Die Code in TForm1.Button1Click ist ein bisschen kürzer geworden und TForm1.vstInitNode wurde entfernt.
Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Contnrs, StdCtrls, VirtualTrees, VSTBindObjectListUnit;

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;

  TForm1 = class(TForm)
    vst: TVirtualStringTree;
    Button1: TButton;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    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);
begin
  TBindVSTToObjectListHelperClass.BindVST(VST,DataList);
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);
  if not Assigned(data^.FObject) then Exit;

  case Column of
    0: CellText := TNodeDataClass(data^.FObject).FSpalte1;
    1: CellText := TNodeDataClass(data^.FObject).FSpalte2;
    2: CellText := IntToStr(TNodeDataClass(data^.FObject).FSpalte3);
  end;
end;

end.
Dafür wurde das Verknüpfen in VSTBindObjectListUnit.pas ausgelagert.
Delphi-Quellcode:
unit VSTBindObjectListUnit;

interface

uses Contnrs, VirtualTrees;

type

  PTreeData = ^TTreeData;
  TTreeData = record
    FObject : TObject;
  end;

  TBindVSTToObjectListHelperClass = class
  private
    class var fObList: TObjectList;
    class var fVST: TVirtualStringTree;
    class procedure VstInitNode(Sender: TBaseVirtualTree; ParentNode, Node: PVirtualNode; var InitialStates: TVirtualNodeInitStates);
  public
    class procedure BindVST(AVST: TVirtualStringTree; AObList: TObjectList);
  end;

implementation

{ TBindVSTToObjectListHelperClass }

class procedure TBindVSTToObjectListHelperClass.BindVST(AVST: TVirtualStringTree; AObList: TObjectList);
begin
  if not assigned(AObList) then exit;
  fObList := AObList;
  fVST := AVST;
  fVST.Clear;
  fVST.NodeDataSize := SizeOf(TTreeData);
  fVST.OnInitNode := TBindVSTToObjectListHelperClass.VstInitNode;
  fVST.RootNodeCount := fObList.Count;
end;

class procedure TBindVSTToObjectListHelperClass.VstInitNode(Sender: TBaseVirtualTree; ParentNode, Node: PVirtualNode; var InitialStates: TVirtualNodeInitStates);
var
  data: PTreeData;
begin
  data := fVST.GetNodeData(Node);
  data^.FObject := fObList[Node.Index];
end;

end.
Wie schon vorher erwähnt für die Leute die noch ein Delphi 2007 im Einsatz haben.

Lg,
jus
Angehängte Dateien
Dateityp: rar VSTObjectList.rar (3,0 KB, 10x aufgerufen)

Geändert von jus (27. Mär 2019 um 23:56 Uhr)
  Mit Zitat antworten Zitat
DieDolly

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

AW: Datenhaltung mit VirtualStringTree und Trennung der Businesslogik

  Alt 28. Mär 2019, 00:09
Denk dran RootNodeCount neu zu setzen, wenn du einen Eintrag aus deiner ObjectList löschst.
Ich glaube jedenfalls, dass das notwendig ist.
  Mit Zitat antworten Zitat
generic

Registriert seit: 24. Mär 2004
Ort: bei Hannover
2.416 Beiträge
 
Delphi XE5 Professional
 
#27

AW: Datenhaltung mit VirtualStringTree und Trennung der Businesslogik

  Alt 1. Apr 2019, 12:36
Code:
  PTreeData = ^TTreeData;
  TTreeData = record
    FObject : TObject;
  end;
Ich sehe immer diesen Quelltext.

Wir sehen ein Zeiger auf ein Objekt welches in einen Record gespeichert wird.
Also ist der Record genau so groß wie der Zeiger.
Wieso speichert Ihr den Objekt Zeiger nicht direkt im VST?
Dann braucht ihr die Zwischenklasse TTreeData nicht.

Code:
vst.NodeDataSize= sizeof(TMeinObjekt); // Zeigergröße - es geht auch TObject da alle Objektzeiger gleich groß sind.

vst.addChild(nil, MeinObjektInsatz); // Hinzufügen mit Zeigers


var
  data: TMeinObjekt;
begin
  data := TMeinObjekt(fVST.GetNodeData(Node)^);
end;
  Mit Zitat antworten Zitat
DieDolly

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

AW: Datenhaltung mit VirtualStringTree und Trennung der Businesslogik

  Alt 1. Apr 2019, 13:46
AddChild benutzt man nicht. Das ist eine Todsünde, so wie ich das immer lese.

Wenn man AddChild benutzt, dann kann man auch gleich ein TListView benutzen mit Add().
  Mit Zitat antworten Zitat
Benutzerbild von Codehunter
Codehunter

Registriert seit: 3. Jun 2003
Ort: Thüringen
2.272 Beiträge
 
Delphi 10.4 Sydney
 
#29

AW: Datenhaltung mit VirtualStringTree und Trennung der Businesslogik

  Alt 1. Apr 2019, 16:58
Wieso speichert Ihr den Objekt Zeiger nicht direkt im VST?
Dann braucht ihr die Zwischenklasse TTreeData nicht.
Ich vermute, das sind Altlasten. Lange Zeit ging das beim VST gar nicht anders. Die alten Tutorials im Netz haben leider kein Verfallsdatum. Mir ging das ganz genauso: Ich nutze den VST schon seit den allerersten Tagen und hab eben die alten Vorgehensweisen verinnerlicht. Dass er inzwischen auch Generics kann, hab ich auch erst jetzt mitbekommen...

AddChild benutzt man nicht. Das ist eine Todsünde, so wie ich das immer lese.

Wenn man AddChild benutzt, dann kann man auch gleich ein TListView benutzen mit Add().
Naja ganz so schlimm ist es nun auch wieder nicht. Kommt ganz auf den Einzelfall an. Wenn man eine Struktur von ein paar Dutzend Nodes hat (wie. z.B. in der Delphi-IDE die Projektverwaltung), dann ist es völlig Wumpe ob man iterativ mit AddChild arbeitet oder mit Root/Childcount. Im Zweifel opfere ich da sogar ein paar Millisekunden Runtime zugunsten lesbareren Codes.

Bei Anwendungen wie z.B. HeidiSQL, wo der VST hingegen ein Grid für viele Tausende Datensätze bilden kann, da macht das absolut Sinn. Wobei ich mich an der Stelle schon wieder Frage, ob die Vorteile die man mit Rootnodecount gewinnt, nicht durch das ganze Generics-RTTI-Gedönse wieder drauf geht.
Ich mache grundsätzlich keine Screenshots. Schießen auf Bildschirme gibt nämlich hässliche Pixelfehler und schadet der Gesundheit vom Kollegen gegenüber. I und E zu vertauschen hätte den selben negativen Effekt, würde aber eher dem Betriebsklima schaden
  Mit Zitat antworten Zitat
jus

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

AW: Datenhaltung mit VirtualStringTree und Trennung der Businesslogik

  Alt 1. Apr 2019, 19:03
Wieso speichert Ihr den Objekt Zeiger nicht direkt im VST?
Dann braucht ihr die Zwischenklasse TTreeData nicht.
Ich vermute, das sind Altlasten. Lange Zeit ging das beim VST gar nicht anders. Die alten Tutorials im Netz haben leider kein Verfallsdatum. Mir ging das ganz genauso: Ich nutze den VST schon seit den allerersten Tagen und hab eben die alten Vorgehensweisen verinnerlicht. Dass er inzwischen auch Generics kann, hab ich auch erst jetzt mitbekommen...
Yep, ich habe mich bisher immer an das Tutorial gehalten. Vermutlich würde es auch direkt funktionieren.

AddChild benutzt man nicht. Das ist eine Todsünde, so wie ich das immer lese.

Wenn man AddChild benutzt, dann kann man auch gleich ein TListView benutzen mit Add().
Naja ganz so schlimm ist es nun auch wieder nicht. Kommt ganz auf den Einzelfall an. Wenn man eine Struktur von ein paar Dutzend Nodes hat (wie. z.B. in der Delphi-IDE die Projektverwaltung), dann ist es völlig Wumpe ob man iterativ mit AddChild arbeitet oder mit Root/Childcount. Im Zweifel opfere ich da sogar ein paar Millisekunden Runtime zugunsten lesbareren Codes.

Bei Anwendungen wie z.B. HeidiSQL, wo der VST hingegen ein Grid für viele Tausende Datensätze bilden kann, da macht das absolut Sinn. Wobei ich mich an der Stelle schon wieder Frage, ob die Vorteile die man mit Rootnodecount gewinnt, nicht durch das ganze Generics-RTTI-Gedönse wieder drauf geht.
Davon würde ich gerne mehr erfahren wollen? Also der Grund, warum man nicht AddChild verwenden soll, ist nur die Performance oder gibt es noch andere Gründe? Gab es Performancetests dazu?
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 3 von 5     123 45      


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 12:45 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