![]() |
Klasse speichern und laden
Hallo,
ich habe eine Klasse wie das folgende Beispiel:
Delphi-Quellcode:
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.
type
TmyClass = class(TComponent) private FList: TObjectList; FSomeInt: Integer; FBildchen: TPicture; end; 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 |
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.
|
Re: Klasse speichern und laden
Zitat:
|
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. |
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:
|
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): ![]() ü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 |
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. |
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 |
Re: Klasse speichern und laden
![]() |
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