Registriert seit: 15. Sep 2005
Ort: Neu-Ulm
111 Beiträge
RAD-Studio 2009 Arc
|
Re: Abspeichern von Objekten ??
19. Okt 2005, 11:15
Ich würde der OHeader-Klasse zwei Methoden zum Speichern bzw. Laden verpassen:
Delphi-Quellcode:
OHeader = class(TObject)
public
{ ... }
procedure WriteToStream(AStream: TStream);
procedure ReadFromStream(AStream: TStream);
{ ... }
end;
{ ... }
procedure OHeader.WriteToStream(AStream: TStream);
var
s: string;
len: word;
begin
// HDR_TYP
AStream.WriteBuffer(HDR_TYP[0], SizeOf(HDR_TYP));
// No
len := Length(No);
AStream.WriteBuffer(len, SizeOf(len));
AStream.WriteBuffer(No[1], len);
// Datum
AStream.WriteBuffer(Datum, SizeOf(Datum));
// Path
len := Length(Path);
AStream.WriteBuffer(len, SizeOf(len));
AStream.WriteBuffer(Path[1], len);
{ ... }
// RegistrierNr
s := RegistrierNr.Text;
len := Length(s);
AStream.WriteBuffer(len, SizeOf(len));
AStream.WriteBuffer(s[1], len);
{ ... }
end;
procedure OHeader.ReadFromStream(AStream: TStream);
var
s: string;
len: word;
begin
// HDR_TYP
AStream.ReadBuffer(HDR_TYP[0], SizeOf(HDR_TYP));
// No
AStream.ReadBuffer(len, SizeOf(len));
SetLength(No, len);
AStream.ReadBuffer(No[1], len);
// Datum
AStream.ReadBuffer(Datum, SizeOf(Datum));
// Path
AStream.ReadBuffer(len, SizeOf(len));
SetLength(Path, len);
AStream.ReadBuffer(Path[1], len);
{ ... }
// RegistrierNr
AStream.ReadBuffer(len, SizeOf(len));
SetLength(s, len);
AStream.ReadBuffer(s[1], len);
RegistrierNr.Text := s;
{ ... }
end;
Meine Speicher- bzw. Laden-Prozedur kann dann so aussehen (ich würde mir aber eine eigene SL_Header-Klasse implementieren!):
Delphi-Quellcode:
procedure DatenSpeichern(Filename: string);
var
TmpStream: TFileStream;
Header: OHeader;
len, i: integer;
begin
if not FileExists(Filename)
then TmpStream := TFileStream.Create('C:\test.dat', fmCreate)
else TmpStream := TFileStream.Create(Filename, fmOpenWrite);
len := SL_Header.Count;
TmpStream.Write(len, SizeOf(len)); // abspeichern wie viele Datensätze
for i := 0 to SL_Header.Count - 1 do
begin
Header := SL_Header.Objects[i] as OHeader;
Header.WriteToStream(TmpStream);
end;
FreeAndNil(TmpStream);
end;
procedure DatenLaden(Filename: string);
var
TmpStream: TFileStream;
Header: OHeader;
len, i: integer;
begin
if not FileExists(Filename)
then
begin
ShowMessage('Datei "'+Filename+'" nicht gefunden!');
Exit;
end;
TmpStream:=TFileStream.Create(Filename, fmOpenRead);
TmpStream.ReadBuffer(len, SizeOf(len));
SL_Header.Clear; // ACHTUNG: bereits eingefügte Objekte werden mMn NICHT (per .Free) freigegeben!
for i := 0 to len - 1 do
begin
Header := OHeader.Create;
Header.ReadFromStream(TmpStream);
SL_Header.AddObject(Header.No, Header);
end;
FreeAndNil(TmpStream);
end;
Das Ganze ist nicht getestet, aber ich hoffe - sollte es nicht gleich funktionieren - das Prinzip ist verständlich!
Mach' etwas idiotensicher und irgendjemand erfindet einen besseren Idioten!
|
|
Zitat
|