Prinzipiell deckt sich Deine Beschreibung mit meiner Vermutung für das gedachte Vorgehen. Nur bin ich mir nicht sicher, ob es auch so funktioniert
Delphi-Quellcode:
procedure addline (s:
string);
var
i : integer;
begin
try
form1.Memo_Log.Lines.Add(datetimetostr(now)+'
: ' + s);
if form1.Memo_Log.Lines.Count > 5000
then begin
// Wenn form1.Memo_Log.Lines mal über 5000 Zeilen hatte, kann diese Datei existieren.
if tfile.Exists(programmpfad + '
log_OLD.txt')
then begin
// Wir laden sie dann.
ts_log.loadfromfile(programmpfad+'
log_OLD.txt');
// Sollte sie mehr als 20000 Zeilen enthalten,
if ts_log.Count > 20000
then begin
// schmeißen wir den Inhalt weg
ts_log.Clear;
// und fangen neu an.
ts_log.Add(Datetimetostr(now)+'
Altes Log wurde automatisch zurückgesetzt da über 20 000 zeilen.')
end;
// Dann hängen wir den Inhalt von form1.Memo_Log.Lines an
for I := 0
to form1.Memo_Log.Lines.Count-1
do ts_log.Add(form1.Memo_Log.Lines[i]);
// und haben das alles im Speicher.
end;
// Memo hat mehr als 5000 Zeilen, dann schreiben wir das in log_OLD.txt
// und überschreiben damit die Datei, die wir gerade eben mit ts_log.loadfromfile geladen haben.
form1.Memo_Log.Lines.SaveToFile(programmpfad + '
log_OLD.txt');
// und schmeißen unseren Memo-Inhalt weg.
form1.Memo_Log.Clear;
// Damit kann log_OLD.txt immer nur maximal den Inhalt von einem form1.Memo_Log.Lines haben.
// Da ts_log nie gespeichert wird, halten wir alles, was per ts_log.Add(form1.Memo_Log.Lines[i]);
// hinzugefügt wird, immer nur im Speicher vor. Da man die Stringlist aber eh nicht sehen kann
// könnte man darauf auch verzichten :-(
end;
form1.Memo_Log.Lines.SaveToFile(programmpfad+'
log.txt');
except on e:
exception do form1.Memo_Log.Lines.Add('
Fehler beim speichern des Log Files: '+e.
Message);
end;
end;
Versuch einer Korrektur:
Delphi-Quellcode:
procedure addline(s:
string);
var
ts_log : TStringList;
// Es gibt keinen Grund, warum wir hierfür eine globale Stringliste nehmen sollten
// und deren Inhalt immer im Speicher halten sollten.
begin
ts_log := TStringList.Create;
try
try
form1.Memo_Log.Lines.Add(Format('
%s: %s',[datetimetostr(now),s]));
if form1.Memo_Log.Lines.Count > 5000
then begin
// Wenn form1.Memo_Log.Lines mal über 5000 Zeilen hatte, kann diese Datei existieren
// und wir laden sie.
if tfile.Exists(programmpfad + '
log_OLD.txt')
then ts_log.loadfromfile(programmpfad + '
log_OLD.txt');
// Sollte sie mehr als 20000 Zeilen enthalten,
if ts_log.Count > 20000
then begin
// schmeißen wir den Inhalt weg
ts_log.Clear;
// und fangen neu an.
ts_log.Add(Format('
%s: %s',[Datetimetostr(now),'
Altes Log wurde automatisch zurückgesetzt da über 20 000 Zeilen.']));
end;
// Dann hängen wir den Inhalt von form1.Memo_Log.Lines an, das geht auch am Stück und nicht nur zeilenweise.
ts_log.AddStrings(form1.Memo_Log.Lines);
// und speichern es in der Datei
ts_log.SaveToFile(programmpfad + '
log_OLD.txt');
// form1.Memo_Log wird geleert.
form1.Memo_Log.Clear;
// und hängen die Meldung, die zum Aufruf von AddLines führte an.
// Andernfalls bekämen wir grundsätzlich jede 5001. Meldung (im Memo) nie zu Gesicht.
form1.Memo_Log.Lines.Add(Format('
%s: %s',[datetimetostr(now),s]));
end;
form1.Memo_Log.Lines.SaveToFile(programmpfad + '
log.txt');
except
on e:
exception do begin
form1.Memo_Log.Lines.Add('
Fehler beim Speichern der Logfiles: ' + e.
Message);
end;
end;
finally
ts_log.free;
end;
end;
Da Addline_Debug eigentlich genau das Gleiche macht, kann man da ja eventuell mal ein bisserl was an (redundantem) Quelltext sparen:
Delphi-Quellcode:
procedure Addline_Debug(s : String);
begin
if form1.CheckBox_DebugLog.Checked then AddLine(Format('(Debug) %s',[s]));
end;
Das ist jetzt nur hingedaddelt, keine Ahnung, ob es jetzt wirklich das macht, was ursprünglich angedacht war.