Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   VST in Datenbank speichern und wieder laden (https://www.delphipraxis.net/213249-vst-datenbank-speichern-und-wieder-laden.html)

NoName1 24. Jun 2023 12:08

VST in Datenbank speichern und wieder laden
 
Moin Delphi-Gemeinde,
ich möchte ein VirtualStringTree (VST) mit mehreren Ebenen (Nodes) in einer Tabelle speichern.
Der Nutzer soll beliebig viele Ebenen anlegen können. Momentan habe ich keine Vorstellung
wie man dabei vorzugehen hat. Hat eventuell jemand ein nachvollziebares Beispiel (Quelltext)
zur Hand den er zur Verfügung stellen kann?

Vielen Dank für alle evtl. erhaltene Hilfen

himitsu 24. Jun 2023 12:12

AW: VST in Datenbank speichern und wieder laden
 
Wozu den Tree speichern?

Man speichert doch die internen Daten, welche hinter dem Tree liegen. :zwinker:

Und dann werden diese Daten so wieder aus der DB geladen, wie sie vorher schonmal in den Tree gekommen sind.

Steku 24. Jun 2023 12:20

AW: VST in Datenbank speichern und wieder laden
 
Vielleicht als generellen Einstieg hilfreich...

VG
Steku


unit GeneralAbilitiesDemo;

// Virtual Treeview sample form demonstrating following features:
// - General use and feel of TVirtualStringTree.
// - Themed/non-themed painting.
// - Node button styles.
// - Selection rectangle styles.
// - Multiple columns, header, customize column backgrounds, header popup.
// - Unicode strings.
// - OLE drag'n drop image.
// - Switchable main column.
// - Right click select and drag.
// - Node specific popup menu.
// - Save tree content as text file.


https://github.com/JAM-Software/Virt...litiesDemo.pas

mytbo 24. Jun 2023 17:12

AW: VST in Datenbank speichern und wieder laden
 
Zitat:

Zitat von NoName1 (Beitrag 1523708)
Hat eventuell jemand ein nachvollziebares Beispiel (Quelltext) zur Hand den er zur Verfügung stellen kann?

Als Einstieg könnte dir vielleicht der Artikel Einen JSON-Viewer mit DocVariant und Virtual TreeView realisieren helfen.

Bis bald...
Thomas

Blup 24. Jun 2023 18:28

AW: VST in Datenbank speichern und wieder laden
 
Für die reinen Datensätze benötigst du eine primären Tabelle it ID und den Feldern für die eigentlichen Daten.
Aber achte darauf die Beziehungen zwischen den einzelnen Datensätzen (ID, ID_PARENT, optional: POSITION) in einer separaten sekundären Tabelle darzustellen.
Andernfalls kannst du schon mal den Begriff "lock conflict" nachschlagen.

BigAl 25. Jun 2023 07:34

AW: VST in Datenbank speichern und wieder laden
 
Zu disem Thema gibt es im Internet eigetnlich recht gute Ansätze, Erklärungen, Beispiele. Einfach mal nach "tree structure database" googeln.

Bei mir sieht die Struktur meist (vereinfacht) so aus:

Code:
CREATE TABLE TreeStruct (
  ID INT IDENTITY,
  MasterID INT NULL,
  Position INT NOT NULL,
  (...daten...)
)
Wobei MasterID immer auf den Parent zeigt. Ist MasterID = NULL, dann ist es die oberste Ebene.

Das Feld Position nutze ich dazu die relative Position zu speichern, damit der Baum wieder genau so geladen werden kann wie er gespeichert wurde (Reihenfolde der child-Knoten). Das könnte dann z.B. so aussehen:

Code:
ID   MasterID   Position
 1   NULL   0
 2   1   0
 3   2   0
 4   2   1
 5   2   2
 6   2   3
 7   2   4
 8   7   0
 9   7   1
10   2   5
11   2   6
12   2   7
13   12   0
Laden der Struktur ist relativ einfach. Es sollte beim Laden immer nach MasterID, Positition sortiert werden (ORDER BY MasterID, Position), damit beim Erzugen der der Untereinträge der Master existiert und die Untereinträge in der gewünschten Reihenfolge erzeugt werden.

Speichern ist mit etwas Aufand verbunden. Bei kleinen Strukturen kann man die kompletten Daten löschen und einfach neu erzeugen (einfachster Weg). Bei umfangreicheren Strukturen nutze ich spzielle Mechanismen, die intern prüfen ob Datnsätze erzeugt, geändert, verschoben oder gelöscht wurden. Neue Datnsätze werden z.B. über ID = -1 identifiziert. Modifizierte Einträge werden an einem "Modified" flag identifiziert. Für gelöschte Einträge gibt es ein Array, welches die ID der gelöschten Datensätze enthält.

Das ganze ist mit etwas Aufwand verbunden, hat aber den Vorteil, dass man nach belieben ändern kann und alles bei Bedarf in einem Rutsch gespeichert werden kann (Transaction).

NoName1 26. Jun 2023 07:57

AW: VST in Datenbank speichern und wieder laden
 
Vielen Dank für Eure Antworten/Hinweise.
Dann werde ich mich mal an die Arbeit machen und die Hinweise abarbeiten.


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:31 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