Autor Beitrag
monty.ms
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 47



BeitragVerfasst: So 18.11.07 17:42 
Hallo

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

ausblenden 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:
ausblenden 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:
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10183
Erhaltene Danke: 1256

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Mo 19.11.07 22:26 
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: ;)
ausblenden volle Höhe 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

_________________
There are 10 types of people - those who understand binary and those who don´t.