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.