AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi Klassen in Streams speichern und wiederherstellen
Thema durchsuchen
Ansicht
Themen-Optionen

Klassen in Streams speichern und wiederherstellen

Ein Thema von Dezipaitor · begonnen am 14. Mai 2003 · letzter Beitrag vom 14. Mai 2003
Antwort Antwort
Dezipaitor

Registriert seit: 14. Apr 2003
Ort: Stuttgart
1.701 Beiträge
 
Delphi 7 Professional
 
#1

Klassen in Streams speichern und wiederherstellen

  Alt 14. Mai 2003, 18:37
ich habe mehrere Klassen die voneinander abgeleitet sind und immer zusätzliche Daten enthalten.
die erste Klasse (TItem) ist abgeleitet von TPersistent und wird in funktionen verwendet, um einen gemeinsamen nenner bei der datenanylse (in den klassen) zu erhalten.

ich habe diese verschiedenen klassen in eine TList gespeichert,
und speichere sie in einen stream
indem ich einfach den Pointer in die erste Klasse TItem typecaste, und die virtuelle methode Store, zum speichern der Daten aufrufe.
dann werde ja die überschriebenen methoden store der gespeicherten Klassen (alle sind ja von TItem abgeleitet) aufgerufen.

so nu sollen alle klassen wieder geladen werden.
aber um alle klassen wiederherzustellen muss ich doch
genau die klassen wieder laden, die gespeichert wurden.
aber woher weiß ich welcher klassentype geschrieben wurde?

um eine klasse zu laden wird ja zuersteinmal Create mit dem KlassenTyp aufgerufen, und dann sollte Load aufgerufen werden, um die eigenschaften zu belegen.
ich könnte ja TItem.Create verwenden, aber dann werden ja bei Load nur die Daten geladen, die in TItem.Load definiert wurden.
Wenn nun eine Klasse abgeleitet von TItem mehr Daten geschrieben hat (mit eigenen Store und inherited Store), aber dann weniger gelesen werden, bleiben noch einige übrig, die beim nächsten Lesen zur Verwirrung führen.

Code:
readfromstream...
var List : TList;
      anitem : TItem;
begin
  for i := 1 to count do
   begin
      anItem := TItem.Create; //    <--- was ist wenn die gespeicherte klasse vom Typ TSubItem ist?
      anItem.Load(Stream); //
      List.Add(anitem);
end;
ich könnte natürlich den klassentyp auch speichern :
z.b. ClassName oder ähnliches
aber müsste dann beim laden ja unterscheiden:
Code:
if loadedclassname = 'TSubItem' then
   anItem := TItem(TSubItem.Create);
aber bei mehreren zig Klassen ist dass wirklich umständlich.

am liebsten möchte ich den code auch unter freepascal ausführen, was für mich heißt, dass ich nur wenige VCL Klassen verwenden kann.

THX
Christian
Windows, Tokens, Access Control List, Dateisicherheit, Desktop, Vista Elevation?
Goto: JEDI API LIB & Windows Security Code Library (JWSCL)
  Mit Zitat antworten Zitat
Benutzerbild von sakura
sakura

Registriert seit: 10. Jun 2002
Ort: Unterhaching
11.412 Beiträge
 
Delphi 12 Athens
 
#2
  Alt 14. Mai 2003, 18:45
Du kannst die Objekte auch direkt als TItem casten, wenn die Klasse bereits über die nötigen Methodenbezeichner "informiert" ist.

.....
Daniel Lizbeth
Ich bin nicht zurück, ich tue nur so
  Mit Zitat antworten Zitat
Dezipaitor

Registriert seit: 14. Apr 2003
Ort: Stuttgart
1.701 Beiträge
 
Delphi 7 Professional
 
#3
  Alt 14. Mai 2003, 18:55
was meinst du?
Christian
Windows, Tokens, Access Control List, Dateisicherheit, Desktop, Vista Elevation?
Goto: JEDI API LIB & Windows Security Code Library (JWSCL)
  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 18:26 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