Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Klasse speichern und laden (https://www.delphipraxis.net/116254-klasse-speichern-und-laden.html)

Andreas L. 25. Jun 2008 18:32


Klasse speichern und laden
 
Hallo,
ich habe eine Klasse wie das folgende Beispiel:

Delphi-Quellcode:
type
  TmyClass = class(TComponent)
  private
    FList: TObjectList;
    FSomeInt: Integer;
    FBildchen: TPicture;
  end;
In meiner richtigen Klasse sind viel mehr Variablen (welche übrigens als public bzw. published Eigenschaften deklariert sind). Ich möchte jetzt alle Informationen (Variablen) in eine Datei speichern und wieder auslesen. Auch die ObjectList, TPicture und was sonst noch kommt.

1. Ini-Datei - Sehr viel Schreibarbeit und die Methode ReadBinaryData bzw. WriteBinaryData will keine TPictures speichern (wie mein Test ergab)
2. XML-Datei - Ebenfalls sehr viel Schreibarbeit, die Bilder werde ich wohl irgendwie in Stirngs umwandeln müssen (so wie die in DFM-Dateien gespeichert werden)
3. Eine embedded-Datenbank - Ich habe damit keinerlei Erfahrung, denke aber, dass das sowieso zu überladen ist

Gibts nicht eine Möglichkeit die komplette Komponente in einen FileStream zu schreiben und diesen auch wieder zu lesen? Ich denke das wäre am einfachsten.

Ich freue mich auf eure Vorschläge :-)

Ciao,
Andy

SirThornberry 25. Jun 2008 18:34

Re: Klasse speichern und laden
 
welchen Sinn macht es die Objectlist zu speichern? Darin sind ja nur Pointer enthalten und wenn du diese später lädst ist an diesen Stellen im Speicher was ganz anderes.

Andreas L. 25. Jun 2008 18:35

Re: Klasse speichern und laden
 
Zitat:

Zitat von SirThornberry
welchen Sinn macht es die Objectlist zu speichern? Darin sind ja nur Pointer enthalten und wenn du diese später lädst ist an diesen Stellen im Speicher was ganz anderes.

Ich meinte, ich möchte die referenzierten Objekte speichern. (die haben übrigens alle den selben Vorfahren, falls das hilfreich ist)

SirThornberry 25. Jun 2008 18:55

Re: Klasse speichern und laden
 
Was ich damit aussagen wollte - nur du weißt was sich hinter Pointer etc. verbirgt also kannst auch nur du sagen was du wie speichern willst.
Es gibt einige die sich über diese Probleme schon Gedanken gemacht haben. Ergebnis ist letztendlich das man sich in der Verwendung der Objecte einschränken muss so das man nur bestimmte Sachen hat wofür vom Object her definiert ist wie das Object diese später speichert.

Andreas L. 25. Jun 2008 19:32

Re: Klasse speichern und laden
 
Ich habe jetzt ein bisschen rumprobiert. ReadComponentResFile bzw. WriteComponentResFile machen genau das was ich will. Nur, wie oben schon festgestellt, werden die in der Objektliste referenzierten Objekte nicht gespeichert. Doch wie soll ich das lösen?
Zitat:

Zitat von SirThornberry
Ergebnis ist letztendlich das man sich in der Verwendung der Objecte einschränken muss so das man nur bestimmte Sachen hat wofür vom Object her definiert ist wie das Object diese später speichert.

Aber wie soll ich mich einschränken? Ich muss eine variable Anzahl an Objekten abgeleitet von TComponent speichern. Die ObjectList durchzugehen und jedes Objekt in eine eigene Ressource-Datei speichern will ich nicht, es soll alles in eine Datei. Geht mein Vorhaben evtl. mit TCollection? Das referenziert auch nur, oder?

_frank_ 25. Jun 2008 23:25

Re: Klasse speichern und laden
 
du könntest schon alles in nen filestream speichern, aber du musst ggf. zusatzinfos reinbauen. z.b. bei dynamischen werten die Länge (strings,TPicture bzw. TBitmap) oder die Anzahl (Listen).

evtl. hilft dir das weiter (anhand von Binär-DFM-Dateien):
http://dfmedit.svn.sourceforge.net/v...lp/dfm-format/

übrigends ein Binärformat in einen string zu bekommen ist nicht wirklich schwer...einfach wie bei DFM jedes byte in seinen Hex-Code umwandeln.
evtl. baust du dir einen separaten Dateiheader um die positionen/Typen schnell herausfinden zu können.sonst läufts halt nur sequenziell. kommt halt immer auf das einsatzgebiet an und wie groß die zieldatei wird.

HTH Frank

Namenloser 26. Jun 2008 00:22

Re: Klasse speichern und laden
 
Hallo Andreas,

du kannst die zu speichernden Teile auch einfach unter published statt private Eintragen, sodass du dann alle Eigenschaften automatisiert per RTTI aus/einlesen und in eine Datei speichern kannst. Beachte, dass deine Klasse von TPersistent oder einem ihrer Nachfahren (TComponent ist auch einer) abgeleitet sein muss. So macht das auch die IDE selbst übrigens auch.
Verschachtelte Objekte, die auch gespeichert werden sollen, müssen ebenfalls von TPersistent abgeleitet werden.

Such hier im Forum mal nach RTTI (*duck*), wenn du nicht weiterkommst kann ich vielleicht auch nochmal ein paar Codefetzen von mir raussuchen.

_frank_ 26. Jun 2008 00:56

Re: Klasse speichern und laden
 
ganz so einfach ist das imho nicht.
nur published machen (mal davon abgesehen, dass es zweckfremd ist) reicht meist nicht. bei bestimmten properties (wie der ObjectList) musst du afair per DefineProperties eine Speicherroutine schreiben, die trotzdem deine Liste durchgeht und die Objekte speichert statt der Pointer. ich würde eine eigene save/load-routine schreiben, da bist du bisschen flexibler. denke mal als Speicherform entwder TFileStream (feld/längendefinition nötig) oder XML (binärfelder müssen umgewandet werden).

für den binäraufbau kannst du dich ja an der DFM-Definition orientieren (siehe dfm-structure.txt). bei fragen einfach vertrauensvoll an mich wenden.

Gruß Frank

Ghostwalker 26. Jun 2008 07:06

Re: Klasse speichern und laden
 
Dieses Tutorial sollte dir weiterhelfen. Es basiert zwar auf TPersistent, sollte aber mit Tcomponent genauso gehen :)


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:52 Uhr.

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-2025 by Thomas Breitkreuz