Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Für jeden Tag eine Datei erzeugen (https://www.delphipraxis.net/70964-fuer-jeden-tag-eine-datei-erzeugen.html)

Mirco 7. Jun 2006 12:15


Für jeden Tag eine Datei erzeugen
 
Hallo

Ich habe ein Programm mit dem werden jeden Tag Daten in ein Memo eingetragen.
Alle Eingaben müssen am Ende eines Tages 24:00h in einer Datei gespeichert werden.
Wie kann ich dieses Memo jeden Tag automatisch speichern und die Datei mit einem Datum versehen.
Das Memo soll hinterher einfach geleert werden und eine neue Dtaei mit neuem Datum anlegen.

Mein Problem ist das überprüfen welcher Tag gerade ist und automatische anlegen einer Datei mit dem aktuellen Tagesdatum.
Es darf ja nicht in eine datei vom Vortag geschrieben werden.

Wer mag mir bei meinen Anfangsschwierigkeiten helfen?

Viele Grüsse Mirco

fkerber 7. Jun 2006 12:17

Re: Für jeden Tag eine Datei erzeugen
 
Hi!

Wenn dein Programm immer läuft (durchgehend) könnte ein Timer die Lösung sein.
Da du das aber nicht sicherstellen kannst, würde ich einfach überprüfen, ob es eine Datei mit dem aktuellen Datum schon gibt. Falls ja, brauchst du ja nichts zu machen. Falls nicht, neue Datei mit aktuellem Datum anlegen und Memo löschen...


Ciao Frederic

himitsu 7. Jun 2006 12:23

Re: Für jeden Tag eine Datei erzeugen
 
Delphi-Quellcode:
// globale Variable
Var OldFileName: String;

// OnCreate/Programmstart:
OldFileName := 'irgendwas' + DateToStr(Now) + '.txt';
If FileExists(OldFileName) Then Memo1.Lines.LoadFromFile(OldFileName);

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

// beim Programmbeenden
FileName := 'irgendwas' + DateToStr(Now) + '.txt';
Memo1.Lines.SaveToFile(FileName);
[add]
och menno, da war ja wer schneller :cry:

Na ja, eigentlich würde ja och sowas If NewFileName <> OldFileName Then Begin ausreichen, aber wenn wer an der Zeit spielt, dann könnte es zu problemen kommen und selbst wenn nicht .. ich sag nur Zeitumstellung.

LoadFromFile in onCreate eingefügt, falls das Programm am selben Tag mal beendet/neu gestartet wird.
Und den Abschnitt "beim Programmbeenden" angefügt, damit beim Programmende nichts verloren geht.

Mirco 7. Jun 2006 12:29

Re: Für jeden Tag eine Datei erzeugen
 
Hi

ja das Programm muss immer laufen, aber falls es mal ausversehen
geschlossen wird, ist das überprüfen ob die Datei schon vorhanden ist eine gute Idee.

Danke für das Beispiel

Grüsse Mirco

himitsu 7. Jun 2006 12:38

Re: Für jeden Tag eine Datei erzeugen
 
Zitat:

Zitat von Mirco
Hi

aber falls es mal ausversehen
geschlossen wird, ist das überprüfen ob die Datei schon vorhanden ist eine gute Idee.

hatte noch was nachgetragen, vorallem was das vorzeitig beenden/neustarten betrifft.

Aber am Besten kommst du, wenn du eher einen DateToString-Variante nimst, woo du selber das Vormat angeben kannst, damit es auf allen Rechnern und mit vrschiedenen DateString-Versionen gleich läuft.

Oder halt selber machen ... am Besten macht es sich dabei Jahr-Monat-Tag zu schreiben, dann sind die Dateien im Explorer schön sortiert.


z.B.:
Delphi-Quellcode:
FileName := 'irgendwas' + DateToFormatString('yymmdd', Now); // oder wie du nötige Funktion heißt ._.

// oder
GetSystemTime(D);
FileName := 'irgendwas'
  + IntToStr((D.wYear div 10) mod 10) + IntToStr(D.wYear mod 10)
  + IntToStr(D.wMonth div 10) + IntToStr(D.wMonth mod 10)
  + IntToStr(D.wDay div 10) + IntToStr(D.wDay mod 10);

...

NicoDE 7. Jun 2006 12:38

Re: Für jeden Tag eine Datei erzeugen
 
Zitat:

Zitat von himitsu
Delphi-Quellcode:
DateToStr(Now)

Könnte zu Problemen führen, wenn der Benutzer das Datumsformat ändert.
Man könnte sich eine Funktion dafür schreiben (nur als einfaches Beispiel)
Delphi-Quellcode:
function GetMemoFileName(const ABaseName: string; ADateTime: TDateTime): string;
begin
  Result := ABaseName + '_' + FormatDateTime('yyyy-mm-dd', ADateTime) + '.txt';
end;
edit: hm, da fehlte wohl der rote Kasten :)

himitsu 7. Jun 2006 12:46

Re: Für jeden Tag eine Datei erzeugen
 
joo, die RedBox fehlt hier och ständig ma :wall:

Das mit der Funktion ist och nicht schlecht, damit hat man nur noch eine Funktion, wo der Dateiname erstellt ... fals man also mal daran was ändert, kann man wenigstens nicht irgendwo vergessen etwas mitzuändern, als wenn es mehrfah dastehen würde ^^

Und jupp, das FormatDateTime meinte ich ... ich nehme wohl einfach zuviel "optimiertes" selbstgemachtes Zeugs.

Mirco 7. Jun 2006 12:55

Re: Für jeden Tag eine Datei erzeugen
 
Hallo....so viele Antworten. :cheers:

Wie verwende ich den Code?
Muss ich vorher eine Datei anlegen?

Delphi-Quellcode:
function GetMemoFileName(const ABaseName: string; ADateTime: TDateTime): string;
begin
  Result := ABaseName + '_' + FormatDateTime('yyyy-mm-dd', ADateTime) + '.txt';
end;
Grüße
Mirco

himitsu 7. Jun 2006 13:09

Re: Für jeden Tag eine Datei erzeugen
 
Einfach nur da eintragen, wo ein Dateiname erstellt wird.

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[/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);

marabu 7. Jun 2006 13:53

Re: Für jeden Tag eine Datei erzeugen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hi folks,

wollt ihr wirklich ständig in einem OnTimer-Event nachschauen, ob wer an der Uhr gedreht hat? Wenn die Logdatei in einem Memo mitgeschrieben wird, dann wird wohl nicht unbändig viel rein geschrieben. Ich würde dann beim Schreiben eines Eintrages prüfen, ob es wiedermal so weit ist.

Mit der angehängten Unit geht das so:

Delphi-Quellcode:
procedure TMainForm.FormCreate(Sender: TObject)
begin
  self.Log := TLogStrings.Create(Memo.Lines, ParamStr(0));
end;

// ...
begin
  Log.AddLine('so long');
end;
Getippt und kaum getestet...

Freundliche Grüße vom marabu

himitsu 7. Jun 2006 14:15

Re: Für jeden Tag eine Datei erzeugen
 
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 ^^

himitsu 7. Jun 2006 14:54

Re: Für jeden Tag eine Datei erzeugen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

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.

Mirco 8. Jun 2006 12:42

Re: Für jeden Tag eine Datei erzeugen
 
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
Delphi-Quellcode:
OldFileName := GetMemoFileName;
[Fehler] Unit1.pas(72): Nicht genügend wirkliche Parameter

Ich hab noch nicht ganz verstanden wie das funktioniert.

Viele Grüsse
Mirco

himitsu 8. Jun 2006 12:55

Re: Für jeden Tag eine Datei erzeugen
 
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);

Mirco 8. Jun 2006 15:47

Re: Für jeden Tag eine Datei erzeugen
 
Stimmt, jetzt wo du es gesagt hast, danke für's zeigen.
Grüsse Mirco

Mirco 11. Jun 2006 15:07

Re: Für jeden Tag eine Datei erzeugen
 
Liste der Anhänge anzeigen (Anzahl: 1)
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.

himitsu 11. Jun 2006 16:29

Re: Für jeden Tag eine Datei erzeugen
 
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);

Mirco 11. Jun 2006 17:54

Re: Für jeden Tag eine Datei erzeugen
 
Hallo
Stimmt, am besten wird gleich in die aktuelle Tagesdatei geschrieben.
Wie funktioniert das mit deiner
Delphi-Quellcode:
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.
Delphi-Quellcode:
 Then Append(T) Else Rewrite(T);
und
Delphi-Quellcode:
 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.

Sharky 12. Jun 2006 05:44

Re: Für jeden Tag eine Datei erzeugen
 
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;

scp 12. Jun 2006 07:54

Re: Für jeden Tag eine Datei erzeugen
 
Delphi-Quellcode:
myTimeFormat = 'HH:mm';
...dürfte bei Dateinamen schwierig werden (:).

marabu 12. Jun 2006 07:59

Re: Für jeden Tag eine Datei erzeugen
 
Gut, dass die Uhrzeit nicht Namensbestandteil ist.

Grüße vom marabu

Sharky 12. Jun 2006 16:26

Re: Für jeden Tag eine Datei erzeugen
 
Zitat:

Zitat von scp
...dürfte bei Dateinamen schwierig werden (:).

Hai scp,
wenn Du meinen Demo-Code ansiehst wirst Du erkennen das:

Zitat:

Zitat von marabu
Gut, dass die Uhrzeit nicht Namensbestandteil ist.

Grüße vom marabu

Ich gehe zu das der Code nicht zu 100% optimal ist. Aber ich denke das ich die wichtigsten Sprachelemente benutzt habe :?: um damit zu zeigen was man, wie, in bestimmten Situationen machen kann?

himitsu 12. Jun 2006 16:49

Re: Für jeden Tag eine Datei erzeugen
 
Für die letzte ariante ist nur diese eine Prozedur nötig ... nichts weiter.
Delphi-Quellcode:
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;
Du brauchst also nur AddToLog(...), statt Memo1.Lines.Add(...); aufzurufen und der Timer ist dan auch nicht mehr nötig.

Es iwrd in dieser Prozedure ja mit WriteLn(T, S); der Text in die Datei geschrieben und per Memo1.Lines.Add(S); in das Memo.


Delphi-Quellcode:
If FileExists(FileName) Then Append(T) Else Rewrite(T);
Zu APPEND und REWRITE findest du was in der OH, da aber APPEND fehlschlägt, wenn die Datei nicht existiert, wird in diesem Fall REWRITE verwendet ... getestet per FILEEXISTS.

Mirco 14. Jun 2006 09:00

Re: Für jeden Tag eine Datei erzeugen
 
Ich möchte nur nochmal Danke sagen für die WAHNSINN'S Unterstützung.
Mirco

Mirco 16. Jun 2006 15:17

Re: Für jeden Tag eine Datei erzeugen
 
Hallo...
ich hab noch eine Bitte.
Kann mir jemand diesen Quelltext kommentieren.
Ich würde gerne verstehen was da genau passiert.
Zum Beispiel würde ich gerne alle doppelten Zeilen aus der Textdatei entfernen.
Verwende dafür folgenden Source:
Delphi-Quellcode:
function doppeltweg(datei:string):longword;
var m1,m2:longword;
sl:TStringlist;
begin
sl:=TStringlist.Create;
sl.loadfromfile(datei);
m1:=sl.count;
sl.sorted:=true;
sl.loadfromfile(datei);
m2:=sl.count;
result:=m1-m2;
sl.savetofile(datei);
sl.free;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
doppeltweg('c:\test.txt');
end;
Nun weiß ich nicht welchen Dateinamen ich dem Code unten eingeben muss.
Unten steht ja
WriteToLog('c:\logs\log_', Edit1.Text, LastLog, ListBox1.Items);
und um die doppelten Zeilen wegzubekommen muss ich ja folgendes machen:
doppeltweg('c:\test.txt');




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;

stoxx 16. Jun 2006 15:36

Re: Für jeden Tag eine Datei erzeugen
 
isch hab jetzt nicht alles gelesen, aber möchte hinzufügen, dass es bei mir eine Funktion MakeDString gibt, die erzeugt für den aktuellen Tag einen Namen, der z.B. so aussieht:

2006 (06) 16.Juni - TWS1 -ErrorMsg.txt

Für Logfiles sehr gut geeignet und für einen Menschen sehr gut lesebar, hat aber den Vorteil, dass die Dateien sortiert im Verzeichnis vorliegen.
Vielleicht nützt Dir das ja was.

Gruß
stoxx



Delphi-Quellcode:
function makeDstring : string;
var Y, M, D : word;
   st : string;
begin
decodeDate(now, Y, M, D);
result := inttostr(Y) + ' (' +  Formatfloat('00', M) + ') ' +    Formatfloat('00', D)   + '.' ;
case M of
   1: st := 'Januar';
   2: st := 'Februar';
   3: st := 'März';
   4: st := 'April';
   5: st := 'Mai';
   6: st := 'Juni';
   7: st := 'Juli';
   8: st := 'August';
   9: st := 'September';
  10: st := 'Oktober';
  11: st := 'November';
  12: st := 'Dezember';
end; {ende case iMonat}

result := result + st;


end; // von MakeDString

Mirco 16. Jun 2006 15:49

Re: Für jeden Tag eine Datei erzeugen
 
Hallo stoxx
JA vielen Dank, ich habs auch schon integrieren können und das BESTE, ich habs auch verstanden.
Viele Grüße
Mirco

Hawkeye219 16. Jun 2006 15:54

Re: Für jeden Tag eine Datei erzeugen
 
Hallo,

warum nutzt ihr nicht die VCL-Routinen?

Delphi-Quellcode:
function makeDstring: string;
begin
  Result := FormatDateTime('yyyy (mm) dd.mmmm', Date);
end;
Gruß Hawkeye

stoxx 16. Jun 2006 15:58

Re: Für jeden Tag eine Datei erzeugen
 
Zitat:

warum nutzt ihr nicht die VCL-Routinen?
das nächste mal ;-)
die Routine ist schon etwas älter ;-)

himitsu 16. Jun 2006 16:00

Re: Für jeden Tag eine Datei erzeugen
 
Wie wäre es mit LogFileName, welche ja schon in WriteToLog verwendet wird?

Also
Delphi-Quellcode:
doppeltweg(LogFileName('c:\logs\log_', Now));

Mirco 16. Jun 2006 16:03

Re: Für jeden Tag eine Datei erzeugen
 
Jepp...mach ich :) :) :-D


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:28 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