Entwickler-Ecke

Dateizugriff - Speichern von Komponenten


monty.ms - So 18.11.07 17:42
Titel: Speichern von Komponenten
Hallo

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


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
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-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
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-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
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


Narses - Mo 19.11.07 22:26
Titel: Re: Speichern von Komponenten
Moin!

user profile iconmonty.ms hat folgendes geschrieben:
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?
Es werden nur published-Eigenschaften gesichert, deshalb landen deine Eigenschaften gar nicht erst im Stream! :idea: Weiterhin erstellst du Objekt, ohne sie wieder freizugeben :shock: Und obendrein brauchst du den TMemoryStreamgar nicht, wenn du in eine Datei speichern willst, kannst du auch gleich einen TFileStreamnehmen: ;)

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
type
  TTest = class(TComponent)
  private
    FE1: String;
  published
    property E1: String read FE1 write FE1;
  end;

procedure TForm1.Button1Click(Sender: TObject);
  var
    MeinStream: TFileStream;
    MeinObjekt: TTest;
begin
  MeinObjekt := TTest.Create(NIL);
  try
    MeinObjekt.E1 := 'Test';
    MeinStream := TFileStream.Create('F:\test.dat',fmCreate);
    try
      MeinStream.WriteComponent(MeinObjekt);
    finally
      MeinStream.Free;
    end;
  finally
    MeinObjekt.Free;
  end;
end;

procedure TForm1.Button2Click(Sender: TObject);
  var
    MeinStream: TFileStream;
    MeinObjekt: TTest;
begin
  MeinObjekt := TTest.Create(NIL);
  try
    MeinStream := TFileStream.Create('F:\test.dat',fmOpenRead or fmShareDenyWrite);
    try
      MeinStream.ReadComponent(MeinObjekt);
    finally
      MeinStream.Free;
    end;
    ShowMessage(MeinObjekt.E1);
  finally
    MeinObjekt.Free;
  end;
end;

cu
Narses