Einzelnen Beitrag anzeigen

Benutzerbild von GuenterS
GuenterS

Registriert seit: 3. Mai 2004
Ort: Österreich > Bad Vöslau
760 Beiträge
 
Turbo Delphi für Win32
 
#1

Probleme beim Einlesen von einem File über Stream

  Alt 18. Jun 2005, 14:00
Hallo,

ich sitze gerade über einem Code für ein Informationsverwaltungssystem ähnlich wie Scribbles Papers und such und such und seh den Fehler nicht.

Ich versuch meine Objekte in einen FileStream zu schreiben und von dort wieder zu lesen

Meine Klasse:
Delphi-Quellcode:
  TEntryType = (etCATEGORY, etNOTICE, etURL, etFILE);

  TEntry = class(TObject)
  private
    FCaption: string;
    FEntryType: TEntryType;
    FEntryFolder: string;
    FEntryFilename: string;
    function getEntryFullFileName: string;
    function getDataSize: integer;
  public

    procedure SaveMeToFile(aSourceComponent: TComponent); virtual;
    procedure LoadMeFromFile(aTargetComponent: TComponent; const aFilename: string); virtual;

    property EntryType: TEntryType read FEntryType write FEntryType;
    property Caption: string read FCaption write FCaption;
    property EntryFolder: string read FEntryFolder write FEntryFolder;
    property EntryFilename: string read FEntryFilename write FEntryFilename;
    property EntryFullFileName: string read getEntryFullFileName;
    property DataSize: integer read getDataSize;
  end;
Probleme machen eigentlich nur die Methoden SaveMeToFile bzw. LoadMeFromFile. Die Parameter aSourceComponent und aTargetComponent spielen bei dieser Klasse nicht mit, dieser wird erst bei von TEntry abgeleiteten Klassen verwendet.

Methode SaveMeToFile:
Delphi-Quellcode:
procedure TEntry.SaveMeToFile(aSourceComponent: TComponent);
var
  lIntegerData: integer;
begin
  with TFileStream.Create(getEntryFullFileName, fmCreate) do
  try
    Seek(0, soFromBeginning);
    lIntegerData := Ord(FEntryType);
    WriteBuffer(lIntegerData, sizeOf(lIntegerData));
    lIntegerData := length(FCaption);
    WriteBuffer(lIntegerData, sizeOf(lIntegerData));
    WriteBuffer(FCaption, lIntegerData);
    lIntegerData := length(FEntryFolder);
    WriteBuffer(lIntegerData, sizeOf(lIntegerData));
    WriteBuffer(FEntryFolder, lIntegerData);
    lIntegerData := length(FEntryFilename);
    WriteBuffer(lIntegerData, sizeOf(lIntegerData));
    WriteBuffer(FEntryFilename, lIntegerData);
  finally
    Free;
  end;
end;
Es soll also zuerst der EntryType gespeichert werden, danach die Länge der Caption, dann die Caption selber, danach Länge des Foldernamen, Foldernamen, Länge des Filenamens, Filename.

Wenn ich mir die Textdatei anschau, seh ich eigentlich nicht das was ich erwartet habe. Ich bin schon durchgesteppt und habe mir zur Laufzeit die Werte von FEntryType und FCaption angeschaut, die sind zu diesem Zeitpunkt richtig.

Die Methode LoadMeFromFile mit der ich versuche das Objekt wieder zu laden:
Delphi-Quellcode:
procedure TEntry.LoadMeFromFile(aTargetComponent: TComponent; const aFilename: string);
var
  lIntegerData: integer;
begin
  with TFileStream.Create(aFilename, fmOpenRead) do
  try
    Seek(0, soFromBeginning);
    ReadBuffer(FEntryType, sizeOf(lIntegerData));
    ReadBuffer(lIntegerData, sizeOf(lIntegerData));
    setLength(FCaption, lIntegerData);
    ReadBuffer(FCaption[1], lIntegerData);
    ReadBuffer(lIntegerData, sizeOf(lIntegerData));
    setLength(FEntryFolder, lIntegerData);
    ReadBuffer(FEntryFolder[1], lIntegerData);
    ReadBuffer(lIntegerData, sizeOf(lIntegerData));
    setLength(FEntryFilename, lIntegerData);
    ReadBuffer(FEntryFileName[1], lIntegerData);
  finally
    Free;
  end;
end;
Da gehe ich wieder an den Anfang und lese zuerst den EntryType raus, danach die Länge der Überschrift, setze die Überschrift auf die Entsprechende Länge und lese sie dann aus, das geht für die anderen Properties sinngemäß so weiter.

Nur stimmen die Inhalte der Variablen nach dem Auslesen nicht mehr mit den Inhalten überein die ich geschrieben habe.


Vielleicht kann mir ja wer einen Tip geben, oder sagen (schreiben) was ich falsch mache.
Günter
Pünktlichkeit ist die Fähigkeit vorherzusagen um wieviel sich der Andere verspäten wird.
  Mit Zitat antworten Zitat