AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Klasse speichern und laden

Ein Thema von Andreas L. · begonnen am 25. Jun 2008 · letzter Beitrag vom 26. Jun 2008
Antwort Antwort
Andreas L.
(Gast)

n/a Beiträge
 
#1

Klasse speichern und laden

  Alt 25. Jun 2008, 18:32
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
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#2

Re: Klasse speichern und laden

  Alt 25. Jun 2008, 18:34
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.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Andreas L.
(Gast)

n/a Beiträge
 
#3

Re: Klasse speichern und laden

  Alt 25. Jun 2008, 18:35
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)
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#4

Re: Klasse speichern und laden

  Alt 25. Jun 2008, 18:55
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.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Andreas L.
(Gast)

n/a Beiträge
 
#5

Re: Klasse speichern und laden

  Alt 25. Jun 2008, 19:32
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 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?
  Mit Zitat antworten Zitat
Benutzerbild von _frank_
_frank_

Registriert seit: 21. Feb 2003
Ort: Plauen / Bamberg
922 Beiträge
 
Delphi 3 Professional
 
#6

Re: Klasse speichern und laden

  Alt 25. Jun 2008, 23:25
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
  Mit Zitat antworten Zitat
Namenloser

Registriert seit: 7. Jun 2006
Ort: Karlsruhe
3.724 Beiträge
 
FreePascal / Lazarus
 
#7

Re: Klasse speichern und laden

  Alt 26. Jun 2008, 00:22
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.
  Mit Zitat antworten Zitat
Benutzerbild von _frank_
_frank_

Registriert seit: 21. Feb 2003
Ort: Plauen / Bamberg
922 Beiträge
 
Delphi 3 Professional
 
#8

Re: Klasse speichern und laden

  Alt 26. Jun 2008, 00:56
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
  Mit Zitat antworten Zitat
Ghostwalker

Registriert seit: 16. Jun 2003
Ort: Schönwald
1.299 Beiträge
 
Delphi 10.3 Rio
 
#9

Re: Klasse speichern und laden

  Alt 26. Jun 2008, 07:06
Dieses Tutorial sollte dir weiterhelfen. Es basiert zwar auf TPersistent, sollte aber mit Tcomponent genauso gehen
Uwe
e=mc² or energy = milk * coffee²
  Mit Zitat antworten Zitat
Antwort Antwort


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 06:21 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