Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Probleme beim Einlesen von einem File über Stream (https://www.delphipraxis.net/47953-probleme-beim-einlesen-von-einem-file-ueber-stream.html)

GuenterS 18. Jun 2005 13:00


Probleme beim Einlesen von einem File über Stream
 
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.

neolithos 18. Jun 2005 13:44

Re: Probleme beim Einlesen von einem File über Stream
 
Delphi-Quellcode:
WriteBuffer(PChar(FCaption)^, lIntegerData);
Mit deiner Variante schreibst du nur den Zeiger.

GuenterS 18. Jun 2005 13:57

Re: Probleme beim Einlesen von einem File über Stream
 
Dankeschön, das funktioniert einwandfrei. :-D

An und Für sich klar neuer Thread, aber es würd so gut dazupassen, dass ich doch hier eine zweite Frage stelle.


Wenn ich die String Variable in einen Record gebastelt hätte..

z.B.: so
Delphi-Quellcode:
   TData = record
      Caption: string;
   end;
Warum hätte dann
Delphi-Quellcode:
 ...
   var
     lData: TData;
     lIntegerData: integer;
   begin
      with TFileStream.Create(getEntryFullFileName, fmCreate) do
      try
        lData.Caption := 'TEST';
        lIntegerData := length(lData.Caption);
        WriteBuffer(lData.Caption, lIntegerData);
      finally
        Free;
      end;
   end;
 ...
funktioniert? So hatte ich es nämlich schon an anderer Stelle, in einer anderen Unit.


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:30 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz