Einzelnen Beitrag anzeigen

Benutzerbild von Grishnak
Grishnak

Registriert seit: 15. Sep 2005
Ort: Neu-Ulm
111 Beiträge
 
RAD-Studio 2009 Arc
 
#10

Re: Abspeichern von Objekten ??

  Alt 19. Okt 2005, 10: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!
  Mit Zitat antworten Zitat