AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Für jeden Tag eine Datei erzeugen

Ein Thema von Mirco · begonnen am 7. Jun 2006 · letzter Beitrag vom 16. Jun 2006
Antwort Antwort
Seite 2 von 4     12 34      
Benutzerbild von himitsu
himitsu

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

Re: Für jeden Tag eine Datei erzeugen

  Alt 7. Jun 2006, 15:15
Klar gibt's auch andere Wege (hatte vorletze Woche och ma angefangen mir wowas zu machen), aber wenn er es nur in das Memo einträgt und dann immer im Mitternacht gespeichert werden soll, dann muß man halt per Zeit prüfen.

Also entweder man speichert immer sofort in der Datei und ändert notfalls vorm LogAdd (oder darin am Anfang) den Dateinamen, wenn ein neuer Tag begonnen wurde, oder mann muß es eben so machen.

Notfalls könnte man natürlich auch nocht das Timerintervall anpassen. (wenn man beim Memo bleibt)
z.B. im Memo1.onChage die verbleibende Zeit bis Mitternacht errechnen und das Intervall entsprechend setzen ^^
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

Re: Für jeden Tag eine Datei erzeugen

  Alt 7. Jun 2006, 15:54
Zitat von marabu:
Ich würde dann beim Schreiben eines Eintrages prüfen, ob es wiedermal so weit ist.
Dann würde aber nicht immer am Tagesende die Log gespeichert ... was passiert z.B. wenn mal einen Tag lang nichts in dieLog reingeht, dann stimmt das Datum nicht ... und so weiter.


PS: dachte jetzt in deiner LogUtils.pas wäre was ganz großes drin ._.
AutoLoad und AutoSave würde ich eventuell mit in die Klasse reinmachen und es wäre bestimmt nich schlecht, wenn diese Klasse die daten immer sofort in einer Datei speichert (kann ja auch notfalls nur 'ne TempDatei sein), denn was passiert, wenn das Programm abstürtzt, dann ist alles weg -.-''

Meine aktuelle Version sieht so aus:
Es wird bestimmt noch ein paar Änderungen geben (ist ja noch im "Kleinkindstadium", das Teil).
Allerdings wird da 'ne Binärdatei erstellt (also keine "reine" Textdstei, welche man sich z.B. mit 'nem einfachen Editor anschauen kann).
Dafür kann man aber auch Binärdaten loggen und das Ganze über mehrere/verschiedene "Module" hinweg.

Nur ist diese Version nicht eigenständig lauffähig ... ist also nur'n Beispiel.
Angehängte Dateien
Dateityp: pas fns_log_111.pas (28,2 KB, 10x aufgerufen)
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Mirco

Registriert seit: 7. Mai 2006
71 Beiträge
 
#13

Re: Für jeden Tag eine Datei erzeugen

  Alt 8. Jun 2006, 13:42
Hallo

Nochml Danke für die ganzen Codes.
Muss aber sagen das ich nun etwas verwirrt bin, deshalb habe ich das Beispiel genommen:

Delphi-Quellcode:
// globale Variable
Var OldFileName: String;

// zusätzliche Funktionen:
function GetMemoFileName(const ABaseName: string; ADateTime: TDateTime): string;
begin
  Result := ABaseName + '_' + FormatDateTime('yyyy-mm-dd', ADateTime) + '.txt';
end;

// OnCreate/Programmstart:
OldFileName := GetMemoFileName;
If FileExists(OldFileName) Then Memo1.Lines.LoadFromFile(OldFileName);

// OnTimer (kannst ja im Minuten-, oder Sekundenintervall laufen lassen)
NewFileName := GetMemoFileName;
If (NewFileName <> OldFileName) and not FileExists(NewFileName) Then Begin
  Memo1.Lines.SaveToFile(NewFileName);
  Memo1.Lines.Clear;
  OldFileName := NewFileName;
End;

// beim Programmbeenden
FileName := GetMemoFileName;
Memo1.Lines.SaveToFile(FileName);
bekomme eine Fehlermeldung bei
OldFileName := GetMemoFileName; [Fehler] Unit1.pas(72): Nicht genügend wirkliche Parameter

Ich hab noch nicht ganz verstanden wie das funktioniert.

Viele Grüsse
Mirco
Mirco Hallenga
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

Re: Für jeden Tag eine Datei erzeugen

  Alt 8. Jun 2006, 13:55
upps ja ... abr das hätte dir auch auffallen können ... GetMemoFileName will noch ein paar Parameter haben.
Code:
// globale Variable
Var OldFileName: String;

// zusätzliche Funktionen:
[color=#ff001f]function GetMemoFileName(const ABaseName: string; ADateTime: TDateTime): string;
begin
  Result := ABaseName + '_' + FormatDateTime('yyyy-mm-dd', ADateTime) + '.txt';
end;[/color]

// OnCreate/Programmstart:
OldFileName := [color=#ff0000]GetMemoFileName('Dir/FilePrefix', Now)[/color];
If FileExists(OldFileName) Then Memo1.Lines.LoadFromFile(OldFileName);

// OnTimer (kannst ja im Minuten-, oder Sekundenintervall laufen lassen)
NewFileName := [color=#ff0000]GetMemoFileName('Dir/FilePrefix', Now)[/color];
If (NewFileName <> OldFileName) and not FileExists(NewFileName) Then Begin
  Memo1.Lines.SaveToFile(NewFileName);
  Memo1.Lines.Clear;
  OldFileName := NewFileName;
End;

// beim Programmbeenden
FileName := [color=#ff0000]GetMemoFileName('Dir/FilePrefix', Now)[/color];
Memo1.Lines.SaveToFile(FileName);
oder
Code:
// globale Variable
Var OldFileName: String;

// zusätzliche Funktionen:
[color=#ff001f]function GetMemoFileName: string;
begin
  Result := 'Dir/FilePrefix_' + FormatDateTime('yyyy-mm-dd', Now) + '.txt';
end;[/color]

// OnCreate/Programmstart:
OldFileName := [color=#ff0000]GetMemoFileName[/color];
If FileExists(OldFileName) Then Memo1.Lines.LoadFromFile(OldFileName);

// OnTimer (kannst ja im Minuten-, oder Sekundenintervall laufen lassen)
NewFileName := [color=#ff0000]GetMemoFileName[/color];
If (NewFileName <> OldFileName) and not FileExists(NewFileName) Then Begin
  Memo1.Lines.SaveToFile(NewFileName);
  Memo1.Lines.Clear;
  OldFileName := NewFileName;
End;

// beim Programmbeenden
FileName := [color=#ff0000]GetMemoFileName[/color];
Memo1.Lines.SaveToFile(FileName);
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Mirco

Registriert seit: 7. Mai 2006
71 Beiträge
 
#15

Re: Für jeden Tag eine Datei erzeugen

  Alt 8. Jun 2006, 16:47
Stimmt, jetzt wo du es gesagt hast, danke für's zeigen.
Grüsse Mirco
Mirco Hallenga
  Mit Zitat antworten Zitat
Mirco

Registriert seit: 7. Mai 2006
71 Beiträge
 
#16

Re: Für jeden Tag eine Datei erzeugen

  Alt 11. Jun 2006, 16:07
Hallo

Dein Beispiel funktioniert super, Danke nochmal.
Eine Frage habe ich noch, kann es sein das der Inhalt vom alten Tag in die Datei des neuen Tages geschrieben wird, oder täusche ich mich?
Kann auch gespeichert werden während das Programm läuft und nicht nur wenn es beendet wird?
Viele Grüße
Mirco


Delphi-Quellcode:
var
  Form1: TForm1;
  Var OldFileName,NewFileName, FileName : String;

implementation

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

procedure TForm1.FormCreate(Sender: TObject);
begin
 // OnCreate/Programmstart:
OldFileName := GetMemoFileName;
If FileExists(OldFileName) Then Memo1.Lines.LoadFromFile(OldFileName);end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
// OnTimer (kannst ja im Minuten-, oder Sekundenintervall laufen lassen)
NewFileName := GetMemoFileName;
If (NewFileName <> OldFileName) and not FileExists(NewFileName) Then Begin
  Memo1.Lines.SaveToFile(NewFileName);
  Memo1.Lines.Clear;
  OldFileName := NewFileName;
End;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
 FileName := GetMemoFileName;
Memo1.Lines.SaveToFile(FileName);
end;

end.
Angehängte Dateien
Dateityp: rar test_846.rar (5,6 KB, 4x aufgerufen)
Mirco Hallenga
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

Re: Für jeden Tag eine Datei erzeugen

  Alt 11. Jun 2006, 17: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
Mirco

Registriert seit: 7. Mai 2006
71 Beiträge
 
#18

Re: Für jeden Tag eine Datei erzeugen

  Alt 11. Jun 2006, 18:54
Hallo
Stimmt, am besten wird gleich in die aktuelle Tagesdatei geschrieben.
Wie funktioniert das mit deiner procedure AddToLog(S: String); ?

Hab dein Bespiel ausprobiert, wird da auch gleich in die Datei geschrieben?
Ach ich kriegs trotz der vielen Beispiele nicht hin, er schreib nicht während das Programm gestartet ist in die Datei.
Ich versteh vieles noch nicht, z.B.  Then Append(T) Else Rewrite(T); und OldTime := Trunc(Now); Das hab ich ausprobiert
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.
Mirco Hallenga
  Mit Zitat antworten Zitat
Benutzerbild von Sharky
Sharky

Registriert seit: 29. Mai 2002
Ort: Frankfurt
8.252 Beiträge
 
Delphi 2006 Professional
 
#19

Re: Für jeden Tag eine Datei erzeugen

  Alt 12. Jun 2006, 06:44
Hai ihr,

ich habe einfach auch mal etwas zusammen getippt
Eventuell ist das ja auch ein Lösungsansatz?
Delphi-Quellcode:
uses
  Math;

const
  myDateFormat = 'yyyy-mm-dd';
  myTimeFormat = 'HH:mm';

function LogFileName(const ABaseName: string; ADateTime: TDateTime): string;
begin
  Result := ABaseName + '_' + FormatDateTime(myDateFormat, ADateTime) + '.txt';
end;

procedure WriteToLog(const aLogBase, aLogText: string; aLastLog: TDateTime;
  aStrings: TStrings = NIL);
var
  LogName: string;
  Mode: Cardinal;
  LogFile: TFileStream;
  LogLine: string;
  LogTime: TDateTime;
begin
  LogTime := now;
  LogLine := FormatDateTime(Format('%s %s', [myDateFormat, myTimeFormat]), LogTime) +
    ' ' + aLogText;
  LogName := LogFileName(aLogBase, LogTime);
  ForceDirectories(ExtractFilePath(LogName));
  Mode := IfThen(FileExists(LogName), fmOpenWrite, fmCreate);
  LogFile := TFileStream.Create(LogName, Mode);
  try
    LogFile.Position := LogFile.Size;
    LogFile.Write(LogLine[1], Length(LogLine));
    LogFile.Write(sLineBreak, 2);
  finally
    LogFile.Free;
  end;
  if Assigned(aStrings) then
  begin
    if Trunc(LogTime) > Trunc(aLastLog) then
    begin
      aStrings.Clear;
    end;
    aStrings.Add(LogLine);
  end;
  aLastLog := LogTime;
end;

// Demo Aufruf
procedure TDemoForm.btn_testClick(Sender: TObject);
var
  LastLog : TDateTime;
begin
  WriteToLog('c:\logs\log_', Edit1.Text, LastLog, ListBox1.Items);
end;
Stephan B.
  Mit Zitat antworten Zitat
scp

Registriert seit: 31. Okt 2003
1.120 Beiträge
 
Delphi 7 Personal
 
#20

Re: Für jeden Tag eine Datei erzeugen

  Alt 12. Jun 2006, 08:54
myTimeFormat = 'HH:mm'; ...dürfte bei Dateinamen schwierig werden (.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 4     12 34      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:12 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz