Einzelnen Beitrag anzeigen

Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.167 Beiträge
 
Delphi 12 Athens
 
#17

Re: Für jeden Tag eine Datei erzeugen

  Alt 11. Jun 2006, 16:29
Beim automatischen Speichern um Mitternacht nicht, da dort per Memo1.Lines.Clear; die Memo geleert wird.



Es wird höchstens was doppelt sein, wenn das Programm mehrmals am Tag gestartet/beendet wird.
Beim Beenden wir die Datei ja mit dem aktuellen Datum gespeichert und bei starten wird dieses wieder ausgelesen, welches allerings um Mitternacht mit dem Datum des nächsten Tags gespeichert wird, also der Dateianfang wird doppelt sein.

Dieses ließe sich aber beheben, indem du existierende Dateien nicht überschreibst, sondern nur den Memoinhalt anhängst ... da dann bei Starten der inhalt einer existierenden Datei nicht mehr ausgelesen werden müsste, kann er auch nicht mehrfach gespeichert werden ... aktuell wird der Inhalt beim Starten nur ausgelesen, da er sonst verloren ginge (würde überschrieben), wenn die nochmal eine Datei mit dem selben Datum gespeichert würde (also am selben Tag).

Delphi-Quellcode:
var
  Form1: TForm1;
  OldTime: TDateTime;

implementation

{$R *.dfm} 
function GetMemoFileName: string;
begin
  Result := 'FilePrefix_' + FormatDateTime('yyyy-mm-dd', Now) + '.txt';
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  OldTime := Trunc(Now);
end;

procedure TForm1.Timer1Timer(Sender: TObject);
var T: TextFile;
  FileName: String;
begin
If Trunc(Now) > OldTime Then Begin
  FileName := GetMemoFileName;
  AssignFile(T, FileName);
  If FileExists(FileName) Then Append(T) Else Rewrite(T);
  Write(T, Memo1.Lines.Text);
  CloseFile(T);
  Memo1.Lines.Clear;
  OldTime := Trunc(Now);
End;

procedure TForm1.FormDestroy(Sender: TObject);
var T: TextFile;
  FileName: String;
begin
  FileName := GetMemoFileName;
  AssignFile(T, FileName);
  If FileExists(FileName) Then Append(T) Else Rewrite(T);
  Write(T, Memo1.Lines.Text);
  CloseFile(T);
end;

end.

Im Endefekt könnte man es auch so machen ... statt in die Memo die Zeile direkt einzufügen, mach man es halt über die Prozedur AddToLog ... damit wird die Zeile sofort in der Log-Datei für den aktuellen Tag gespeichert und bei einem Prgrammabsturz kommt nichts weg.
Beim Programmende braucht dann auch nicht mehr gespeichert zu werden, da ja schon alles in der Datei ist.
Delphi-Quellcode:
var
  Form1: TForm1;

implementation

{$R *.dfm} 
procedure AddToLog(S: String);
var T: TextFile;
  FileName: String;
begin
  FileName := 'FilePrefix_' + FormatDateTime('yyyy-mm-dd', Now) + '.txt';
  AssignFile(T, FileName);
  If FileExists(FileName) Then Append(T) Else Rewrite(T);
  WriteLn(T, S);
  CloseFile(T);
  Memo1.Lines.Add(S);
  While Memo1.Lines.Count > 100 Then Memo1.Lines.Delete(0);
end;

end.
Da um Mitternacht die Memo nicht regelmäßig gelöscht wird, kann man über Delete (siehe letzte Zeile) dafür sorgen, daß die Memo nicht zu lang wird (hier maximal 100 Zeilen).


Und wenn man das Einfügen "umdreht", dann steht in der Memo immer in der ersten Zeile das Aktuellste.
Delphi-Quellcode:
While Memo1.Lines.Count >= 100 Then Memo1.Lines.Delete(99);
Memo1.Lines.Insert(0, S);
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat