Delphi-PRAXiS
Seite 2 von 3     12 3      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Eigene Klassen-Objects mit TStream speichern (https://www.delphipraxis.net/51526-eigene-klassen-objects-mit-tstream-speichern.html)

Der_Pate86 24. Aug 2005 18:05

Re: Eigene Klassen-Objects mit TStream speichern
 
Zitat:

Zitat von jfheins
Nimm die dpCollection, das ist das beste ;)

na gut, ich probier es mal aus. und danke für die hilfe.
aber ein bissl hätte ich da noch was:

Zitat:

Du erstellst dir eine TMyItem Klasse, die du speichern möchtest (muss von TCollectionItem abgeleitet sein) und eine Collection (quasi ein Array of TMyItem)

d.h. du brauchst eine zusätzliche Collectionklasse, trägst deine Items dort ein und speicherst alles mit einem SaveToFile.
hmmm....was ist denn eine collection in delphi?? und noch wichtiger, wie sieht das ding aus und wie erstelle ich eins?

jfheins 24. Aug 2005 18:54

Re: Eigene Klassen-Objects mit TStream speichern
 
Ach, wie ich mich freue, dass alci das Tut endlich fertig hat :mrgreen:

http://www.alcaeus.org/filelib.php?cat_id=13

Da kannst du dir ein tolles Tutorial herunterladen, dass dir hoffentlich alle fragen beantwortet ;)

Der_Pate86 24. Aug 2005 21:49

Re: Eigene Klassen-Objects mit TStream speichern
 
herzlichen dank auch! sieht mal sehr informativ aus. (hab es mal kurz nach dem ausdrucken überflogen) werde mich die nächsten tage nochmal richtig dransetzen. falls dann doch noch fragen aufkommen sollten, melde ich mich einfach hier nochmal.

MfG,
Der_Pate86

Der_Pate86 25. Aug 2005 12:59

Re: Eigene Klassen-Objects mit TStream speichern
 
so, ich hab das ganze jetzt mal in mein projekt eingebaut und es läuft auch. das probelm ist: es wird richtig gespeichert, aber die datei ist leer! der speichert zwar das CollectionItem, aber nicht dessen Objekte und die darin enthaltenen Attribute. =(
was nun?

jfheins 25. Aug 2005 13:04

Re: Eigene Klassen-Objects mit TStream speichern
 
Die Unterobjekte der Collection-Items müssen von TPersistent abgeleitet werden ;)

alcaeus 25. Aug 2005 13:10

Re: Eigene Klassen-Objects mit TStream speichern
 
Zitat:

Zitat von jfheins
Die Unterobjekte der Collection-Items müssen von TPersistent abgeleitet werden ;)

Das stimmt nur teilweise. Ich kann auch einen Integer in mein CollectionItem reinpacken, und es wird gespeichert. Wenn du aber kompliziertere Strukturen speichern willst, musst du diese aber tatsaechlich von TPersistent ableiten, das Delphi-Streaming-System erfasst nur solche Klassen.

@Der_Pate: Kannst du vielleicht mal dein CollectionItem hier posten (einfach die Klassendeklaration)? Das wuerde die Fehlersuche ein bisschen erleichtern ;)

Greetz
alcaeus

jfheins 25. Aug 2005 13:18

Re: Eigene Klassen-Objects mit TStream speichern
 
Ich weis, ich bin besserwisserisch, und ich versuche auch, mich zu ändern aber ein "Das stimmt nur teilweise." kann ich einfach nicht auf mir sitzen lassen :mrgreen:

Ich hatte nämlich von Unterobjekten gesprochen, die von TPersistent abgeleitet werden müssen - und in diesem Fall (Win32) sind Integers etc. keine Objekte - und müssen somit auch nicht von TPersistent abgeleitet werden :zwinker: :mrgreen:

Der_Pate86 25. Aug 2005 20:05

Re: Eigene Klassen-Objects mit TStream speichern
 
aha, ok danke. das versuche ich jetzt gleich mal. aber bringt das irgendwelche veränderungen beim umgang mit den unterobjekten, oder so?

Der_Pate86 25. Aug 2005 20:16

Re: Eigene Klassen-Objects mit TStream speichern
 
hmmm...es wird trotzdem nicht sogespeichert wie es sollte.
hier die gesammte objekt-deklaration:

Delphi-Quellcode:
type
  TEquipment = class(TPersistent)
    public
    Name:string[30];
    Kosten:integer;
    FuerKlasse:array [0..4] of boolean;
    Verfuegbarkeit:array [0..9] of boolean;
    end;

type
  TRumpf = class(TEquipment)
    public
    Klasse,Waffenslots,Equipmentslots,Panzerung,Wendigkeit:integer;
    end;

type
  TWaffe = class(TEquipment)
    public
    Kategorie,Waffenslots,Schaden,Munition:integer;
    end;

type
  TSchild = class(TEquipment)
    public
    Absorbtion:integer;
    end;                                  

type
  TAusstattung = class(TEquipment)
    public
    Kategorie,Faktor:integer;
    WirkungAuf:array [0..4] of string[30];
    end;

type
  TAntrieb = class(TEquipment)
    public
    TopSpeed,WS:integer;
    end;

type
  TPlanet = class(TPersistent)
    public
    Name,Volk,Regierung,Event,Benoetigt,WeedProTag:string;
    Weedproduktion:integer;
    end;

type
  TCharacter = class(TPersistent)
    public
    Erfahrung,Level,Coolness,Credits,Zielgenau,Flugkenntnis:integer;
    end;

type
  TSchiff = class(TPersistent)
    public
    Name:string[30];
    Rumpf:TRumpf;
    Waffen:array [0..49] of TWaffe;
    Schild:TSchild;
    Ausstattung:array [0..49] of TAusstattung;
    Antrieb:TAntrieb;
    constructor Create;
    end;

type
  TSpieler = class(TPersistent)
    public
    Name,Passwort,Rasse:string[30];
    PWschutz:boolean;
    Character:TCharacter;
    Schiff:TSchiff;
    constructor Create;
    end;

type
  TGameData = class(TPersistent)
    public
    PlanetID:integer;
    Rumpf:array [0..5] of TRumpf;
    Waffen:array [0..6] of TWaffe;
    Schild:array [0..4] of TSchild;
    Ausstattung:array [0..34] of TAusstattung;
    Antrieb:array [0..5] of TAntrieb;
    Planeten:array [1..10] of TPlanet;
    constructor Create;
    end;

type
  TGame = class(TCollectionItem)
    Spieler1:TSpieler;
    GameData:TGameData;
    end;

Robert_G 25. Aug 2005 20:38

Re: Eigene Klassen-Objects mit TStream speichern
 
Nur mal schnell ein paar Dinge, die mir gerade ins Auge gesprungen sind. Für mehr habe ich keine Lust, da ich nur wiederholen würde, was du bisher schon nicht lesen wolltest... :wall:
  1. Wozu shortstrings? Deine strings werden mit der dpCollection eingelesen und ausgelesen egal wieviel drinsteht.
    Shortstrings sind _immer_ 30 Zeichen lang.
  2. Hast du dir das überhaupt durchgelesen?
    Du scheinst wohl den teil übersprungen zu haben, der sagt, dass nur published properties per default erfasst werden.
    btw: Das steht hier in fast jedem Thread zur dpCollection X-mal... :roll:
  3. Arrays werden nicht erfasst.
    Wobei die Arrays nicht viel Sinn machen. Das geht sicher auch eleganter. ;)


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:18 Uhr.
Seite 2 von 3     12 3      

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