Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Speichern von Komponenten (https://www.delphipraxis.net/103627-speichern-von-komponenten.html)

monty.ms 18. Nov 2007 18:34


Speichern von Komponenten
 
Hallo

Ich wollte eine Komponente mittels MemoryStream speichern und laden, aber irgendwie funktioniert das nicht ganz:

Delphi-Quellcode:
type
  TTest = class(TComponent)
  public
    E1: String;
    E2: String;
    E3: String;
    I1: Integer;
    constructor Create(Text: String); overload;
    procedure Irgendwas(Text:String);
  end;
Speichern:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
VAR MeinStream : TMemoryStream;
    MeinObjekt : TTest;
begin
MeinObjekt := TTest.Create('Bla');
MeinObjekt.E1 := 'Test';

MeinStream := TMemoryStream.Create;
MeinStream.Clear;
MeinStream.WriteComponent(MeinObjekt);
MeinStream.SaveToFile('c:\test.dat');
MeinStream.Free;
end;
Laden:
Delphi-Quellcode:
procedure TForm1.Button2Click(Sender: TObject);
VAR MeinStream : TMemoryStream;
    MeinObjekt : TTest;
begin
MeinObjekt := TTest.Create('Bla');

MeinStream := TMemoryStream.Create;
MeinStream.LoadFromFile('c:\test.dat');
MeinStream.ReadComponent(MeinObjekt);
MeinStream.Free;

ShowMessage(MeinObjekt.E1);
end;
Das Problem ist, dass wenn ich lade, die Variable E1 nicht den String "Test" enthält sondern leer ist. Weis einer was ich falsch gemacht habe? Warum die Variable nicht mit abgespeichert wird?

Danke schonmal für die Hilfe!

monty

teebee 18. Nov 2007 18:50

Re: Speichern von Komponenten
 
Die Elemente einer Klasse, die speicherbar sein sollen, müssen so weit ich weiß als published deklariert werden, da nur so die nötigen Laufzeit-Typinformationen erzeugt werden.

Gruß, teebee

monty.ms 18. Nov 2007 19:00

Re: Speichern von Komponenten
 
Das hatte ich auch schonmal versucht, aber wenn ich die auf published setze bekomm ich immer:

[Error] Unit1.pas(12): Published field 'E1' not a class nor interface type

Muss man die irgendwie anders einbinden, oder geht das einfach nicht?

Delphi-Quellcode:
type
  TTest = class(TComponent)
  published
    E1: String;
    E2: String;
    [...]
Eigentlich sollte die Klasse nicht von TComponent abgeleitet sein, aber da .ReadComponent ja ein TComponent haben will wusste ich nicht, wie ich es anders hätte machen können.

DeddyH 18. Nov 2007 19:13

Re: Speichern von Komponenten
 
Delphi-Quellcode:
type
  TTest = class(TComponent)
  private
    FE1: string;
    FE2: string;
  published
    E1: String read FE1 write FE1;
    E2: String read FE2 write FE2;
    [...]

monty.ms 18. Nov 2007 19:27

Re: Speichern von Komponenten
 
Ah ok, hätt ich auch drauf kommen können, vielen dank!

PS:
Delphi-Quellcode:
published
    property E1: String read FE1 write FE1;
    property E2: String read FE2 write FE2;

DeddyH 18. Nov 2007 19:33

Re: Speichern von Komponenten
 
:oops: jepp, übersehen


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:19 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