Avatar billede bolorolo Nybegynder
14. februar 2013 - 19:10 Der er 10 kommentarer og
1 løsning

append to ini log file

Hej alle.

jeg har et lille problem med et stykke kode, da jeg laver et program som udskriver en log fra memo1 ned i en log fil.

Det virker egentlig fint nok på nær lige at den overskriver filen
i stedet for at forsætte på den (append).

På en eller anden måde skal den kunne kontrollere om filen allerede findes og hvis ikke skal den oprette den, hvis den findes skal den blot forsætte på filen.

koden ser sådan her ud indtil videre:

unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, registry;

type
  TForm1 = class(TForm)
    Memo1: TMemo;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  ini : tinifile;
  F: Textfile;
  final: string;
  reg: tregistry;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
ini := tinifile.Create('C:\Log.ini');
ini.WriteString('Log','Log',Memo1.Text);
ini.Free;
Memo1.Clear;
end;
end.

-------------------------------

jeg ved det sikkert også kan gøres med textfiles istedet for men
af en eller anden grund var det bare nemmere for mig at arbejde med ini filer.
Avatar billede hugopedersen Nybegynder
14. februar 2013 - 19:50 #1
Den gør helt som forventet - skriver en værdi i sektion log under key log

Du kan ikke bruge en ini fil til det uden at du laver en unik key og skriver værdien der.
F.eks. ini.WriteString('Log', DateTimeToStr(Now),Memo1.Text);

Er ikke sikker på syntaxen for DateTimeToStr - den må du selv checke
Avatar billede kgkg Nybegynder
14. februar 2013 - 21:30 #2
Brug memo komponentens interne SaveToFile funktion og gem dine data i en almindelig tekstfil.

Eks.

Procedure SaveLogFile;
var
  L: TStringList;
  I: Integer;
begin
  try
    L := TStingList.Create;
    L.Clear;
    if FileExists('C:\Log.ini') then
    begin
      // indlæs den gamle logfil i temp stringlist
      L.LoadFromFile('C:\Log.ini');
      for I := 0 to memo1.Lines.Count - 1 do
      begin
        // kopier linjer fra memo1 til temp stringlist
        L.Add(Memo1.Lines[I]);
      end;
    end
    else L.Assign(Memo1.Lines);
    // Gem logfilen
    L.SaveToFile('C:\Log.ini');
  finally
    FreeAndNil(L);
  end;
end;

PS. Koden er ikke afprøvet...

Du kan evt. vælge at indlæse logfilen i din memo komponent ved programstart i stedet for at appende til logfilen når der gemmes.
Avatar billede bolorolo Nybegynder
14. februar 2013 - 23:30 #3
Tak begge for gode svar

Jeg kunne løse det med den kode kgkg skrev, jeg har nu også fået en god forståelse af hvordan man arbejder med tstringlist :-)

kgkg du må meget gerne post det som svar hvis du vil høste points :-)



takker begge for de gode input
Avatar billede martinlind Nybegynder
14. februar 2013 - 23:56 #4
Var

F : TextFile;

assignfile(F,'c:\log.txt');
append(F,Memo1.lines.text);
CloseFile(F);


PS. Ikke testet
Avatar billede bolorolo Nybegynder
15. februar 2013 - 00:03 #5
Martinlind,

takker :-) det virker også
Avatar billede kroning Nybegynder
15. februar 2013 - 00:07 #6
Hvis logfilen er stor er kgkg´s løsning nok ikke brugbar.
Avatar billede kgkg Nybegynder
16. februar 2013 - 00:01 #7
#3

Hermed et svar.

#6

Det er bare et spørgsmål om at bestemme sig for hvor mange linjer logfilen må fylde. Og når grænsen er nået, så er det bare et spørgsmål om at slette x antal af de ældste linjer.
Avatar billede hugopedersen Nybegynder
16. februar 2013 - 11:28 #8
Jeg har en selfmade konstuktion der kan lave logfiler med f.eks.
Max størrelse nået > ny fil
Max filer nået > sletter ældste
Forskellige typer af log - fejl, events, debug, databasefejl
og meget mere.

Hvis du sender mig en mail må du gerne få en kopi. Dog skal du være forberedt på at der måske er noget af det du skal ændre på for at få det til at compilere uden nogen af mine andre units.
Avatar billede hugopedersen Nybegynder
16. februar 2013 - 15:30 #9
Der ligger en lille eksempel på min Logfile unit her:

https://dl.dropbox.com/u/65392149/Logfile.zip

Den er til fri afbenyttelse
Avatar billede hrc Mester
19. februar 2013 - 10:33 #10
Hvis du har adgang til en database så gem det der. Jeg har oplevet alt for mange problemer med kunder hvor IT har gjort pillet ved katalogernes rettigheder og gjort dem skrivbeskyttetde.

Jeg har en lille løsning som holder en TStringList. Der fyldes i og med jævne mellemrum opdaterer den en log (via appendfile, ikke save to file). Jeg sørger i øvrigt for at holde skrivningerne pakket ind i en try-except for det er ikke en log-fil der skal få programmet til at gå ned.

Noget i retning af dette:

type
  TLogList = class
  const
    Threshold = 200; // ms - opdateringsinterval. Gider ikke skrive hver gang der tilføjes
  private
    fList: TStringList; // Skal kun bruge få af TStringLists funktioner
    fTickCount: cardinal;
    fFilename: string;
    procedure Flush;
  public
    constructor Create(aFilename: string);
    destructor Destroy; override;
    procedure Add(aString: string); overload;
    procedure Add(aString: string; aArgs: array of const); overload;
  end;

constructor TLogList.Create(aFilename: string);
begin
  inherited Create;
  fList := TStringList;
  fTickCount := GetTickCount + Threshold;
end;

destructor TLogList.Destroy;
begin
  try
    Flush;
    fList.Free;
  finally
    inherited;
  end;
end;

procedure Add(aString: string);
begin
  fList.Add(aString);
  if fTickCount < GetTickCount then
  begin
    Flush;
    fTickCount := GetTickCount + Threshold;
  end;
end;

procedure Add(aString: string; aArgs: array of const);
begin
  Add(format(aString,aArgs); // eks. Add('Opdateret %s',[TimeToStr(now)]);
end;

procedure TLogList.Flush;
var
  i: integer;
  fp: Text;
begin
  if fList.Count > 0 then
  begin
    assignfile(fp,fFilename);
    appendfile(fp);
    try
      for i := 0 to fList.Count - 1 do
        writeln(fp,fList[i]);
      fList.Clear;
    finally
      closefile(fp);
    end;
  end;
end;
Avatar billede hrc Mester
19. februar 2013 - 10:34 #11
(og så glemte jeg at pakke skrivningen ind i en try-except):


procedure TLogList.Flush;
var
  i: integer;
  fp: Text;
begin
  if fList.Count > 0 then
  begin
    try
      assignfile(fp,fFilename);
      appendfile(fp);
      try
        for i := 0 to fList.Count - 1 do
          writeln(fp,fList[i]);
        fList.Clear;
      finally
        closefile(fp);
      end;
    except
    end;
  end;
end;
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester