ich möchte eine Liste von Objekten in einer typisierten Datei speichern. Ein Objekt hat natürlich einen Namen (hier: fTitle/Title). Allerdings habe ich Probleme, diesen korrekt zu speichern und wieder auszulesen. Nach einer Weile und einigen unsauberen Tricks habe ich es geschafft, den String zumindest ohne Laufzeitfehler abzuspeichern. Allerdings wird beim Ausleseversuch mit einem SIGSEV-Fehler abgebrochen und beim Rantasten mit Debugger wahlweise eine Zeichenfolge mit diversen Steuerzeichen oder aber ein Hinweis á la "uncomparsed character" oder so angezeigt.
Definition der wichtigen Klassen:
Code: Alles auswählen
{ TSession }
TSession = class(TTimer)
private
{ unwichtig (weitere Zeitstempel) }
fMemDur: TDateTime;
fTitle: string[50];
function getTitle(): string;
public
{ unwichtig (Konstruktor und weitere Prozeduren) }
function getDuration(): TDateTime;
{ unwichtig (weitere Properties) }
property memDur: TDateTime read fMemDur;
property Title: string read getTitle;
end;
{ TSessFile }
TSessFile = file of TSession;
{ TSessionList }
TSessionList = class
private
fSessionFile: TSessFile;
fActiveSession: integer;
fFilePath: string;
fSessions: array of TSession;
function getSession(id: integer): TSession;
procedure setSession(id: integer; session: TSession);
procedure load();
procedure save();
public
{ unwichtig (Konstruktor und weitere Prozeduren) }
{ unwichtig (Properties) }
end;
var list: TSessionList;
Code: Alles auswählen
function TSession.getTitle(): string;
begin
result := fTitle;
end;
function TSession.getDuration(): TDateTime;
begin
{ calculate new memory Duration }
result := fMemDur + (Now() - fStartStamp);
end;
Code: Alles auswählen
procedure TSessionList.load();
var memSession: TSession;
i: integer;
begin
closeSessions(); // close all sessions
assignFile(fSessionFile, fFilePath);
if not DirPathExists(ExtractFilePath(fFilePath)) then
CreateDir(ExtractFilePath(fFilePath));
if fileExists(fFilePath) then
reset(fSessionFile)
else
rewrite(fSessionFile);
{ read file content }
SetLength(fSessions, fileSize(fSessionFile));
i := 0;
while not ((eof(fSessionFile)) or (i = length(fSessions))) do
begin
Read(fSessionFile, memSession);
fSessions[i] := memSession;
Inc(i);
end;
closeFile(fSessionFile);
end;
procedure TSessionList.save();
var i: integer;
memSession: TSession;
begin
assignFile(fSessionFile, fFilePath);
rewrite(fSessionFile);
i := 0;
while not (i = length(fSessions)) do
begin
memSession := fSessions[i];
Write(fSessionFile, memSession);
Inc(i);
end;
closeFile(fSessionFile);
end;
Code: Alles auswählen
msg := '';
for i:=0 to list.count-1 do
begin
msg := msg + 'Name: ' + list.sessions[i].Title + #13#10 +
'Dauer: ' + FormatDateTime('hh:mm:ss', list.sessions[i].getDuration()) +
#13#10#13#10;
end;
ShowMessage(msg);
Aber sei's drum, ich hoffe einfach Mal, dass jemand von Euch eine Lösung findet

LG
ConcApptLab