![]() |
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:
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.
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; Methode SaveMeToFile:
Delphi-Quellcode:
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.
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; 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:
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.
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; 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. |
Re: Probleme beim Einlesen von einem File über Stream
Delphi-Quellcode:
Mit deiner Variante schreibst du nur den Zeiger.
WriteBuffer(PChar(FCaption)^, lIntegerData);
|
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:
Warum hätte dann
TData = record
Caption: string; end;
Delphi-Quellcode:
funktioniert? So hatte ich es nämlich schon an anderer Stelle, in einer anderen Unit.
...
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; ... |
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