Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Klasse speichern und laden


Zuckerwatte - Mi 03.09.03 12:43
Titel: Klasse speichern und laden
Hallo,

ich möchte mehere Instanzen der folgenden Klasse, die in einer PointerListe stehen in einen Stream schreiben bzw. hinteher in eine Datei oder in ein DB-Blobfeld speichern bzw wieder auslesen können.

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
TRecht = class(TObject)
  Private
   FRechtNr    : Integer;
   FRechtName  : string;
   FRechtImage : TBitmap;
   function Get_RechtNr : Integer;
   procedure Set_RechtNr(const Value: Integer);
   function Get_RechtName : string;
   procedure Set_RechtName(const Value: string);
   function Get_RechtImage : TBitmap;
   procedure Set_RechtImage(const Value: TBitmap);
  Public
   Property RechtNr:Integer read Get_RechtNr write Set_RechtNr;
   Property RechtImage:TBitmap read Get_RechtImage write Set_RechtImage;
   Property RechtName:string read Get_RechtName write Set_RechtName;
   Constructor Create;
   destructor Destroy; override;
End;

Hat jemand eine Idee wie das funktionieren soll bzw. wie eine solche Save und Load - Routiene aussehen kann (mit Beispiel), da zum einen das Bitmap ja verschiedene Größen haben kann und zum anderen die Anzahl der Instanzen unterschiedlich sein kann.

Gruß
Zuckerwatte

Moderiert von user profile iconTino: Code- durch Delphi-Tags ersetzt.


barfuesser - Mi 03.09.03 16:21


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
procedure writeToFile(FileName: String);
var
  Datei: File;
  BitmapStream: TMemoryStream;
begin
  BitmapStream := TMemoryStream.Create;
  FRechtImage.saveToStream(BitmapStream);
   Assign(Datei);
  Rewrite(Datei, 1);
  BlockWrite(Datei, FRechtNr, SizeOf(FRechtNr));
  BlockWrite(Datei, FRechtName[1], length(FRechtName));
  BlockWrite(Datei, BitmapStream.Memory, BitmapStream.Size);
  CloseFile(Datei);
  FreeAndNil(BitmapStream);
end;


Achtung - nicht getestet! Nur um Dir eine mögliche Richtung aufzuzeigen.

barfuesser


kasi - Mi 03.09.03 18:02

Mein Vorschlag

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:
procedure TRecht.LoadFromStream(Stream: TStream);
var
  StrLen : integer;
  
begin
Stream.Read(FRechtNr, SizeOf(FRechtNr));
Stream.Read(StrLen, SizeOf(Integer));
SetLength(FRechtName, StrLen);
Stream.Read(FRechtName[1], StrLen);
FRechtImage.LoadFromStream(Stream);
end;

procedure TRecht.SaveToStream(Stream: TStream);
var
  StrLen: integer;
  
begin
Stream.Write(FRechtNr, SizeOf(FRechtNr));
StrLen := Length(FRechtName);
Stream.Write(StrLen, SizeOf(Integer));
Stream.Write(FRechtName[1], Length(FRechtName));
FRechtImage.SaveToStream(Stream);
end;

Ich habe es nur mit einem Objekt getestet. Man sollte aber auch mehrere hintereinander schreiben und Lesen können.

KASI

Moderiert von user profile iconTino: Delphi-Tags hinzugefügt.