Tuesday, January 02, 2007
LogFile
Permet generar traces amb informació durant l'execució d'un programa.
unit LogFile;
interface
uses Windows, Classes, SysUtils, DsgnIntf, ShellAPI, Forms;
type TLogFileEd = class(TDefaultEditor)
procedure ExecuteVerb(Index: integer); override;
function GetVerb(Index: integer): string; override;
function GetVerbCount: integer; override;
end;
type TLogFile = class(TComponent)
private
FFileName: string;
FFileStream: TFileStream;
FSaveDate: boolean;
FSaveHour: boolean;
FActive: boolean;
FLineHeader: string;
FDailyFileName: boolean; //adds yyyymmdd before filename
FCurrentDay: string;
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
procedure SaveToFile(str: string);
procedure Delete;
published
property Active: boolean read FActive write FActive;
property FileName: string read FFileName write FFileName;
property SaveDate: boolean read FSaveDate write FSaveDate;
property SaveHour: boolean read FSaveHour write FSaveHour;
property DailyFileName: boolean read FDailyFileName write FDailyFileName;
property LineHeader: string read FLineHeader write FLineHeader;
end;
procedure Register;
implementation
procedure Register;
begin
RegisterComponents('Components Delphi', [TLogFile]);
end;
constructor TLogFile.Create(AOwner: TComponent);
begin
FFileName := 'noname.log';
FSaveHour := True;
FSaveDate := True;
FActive := True;
inherited Create(AOwner);
end;
destructor TLogFile.Destroy;
begin
inherited Destroy;
end;
procedure TLogFile.Delete;
begin
DeleteFile(FFileName);
end;
procedure TLogFile.SaveToFile(str: string);
var
aux: string;
y,m,d: word;
fl: string;
begin
if FActive=False then
Exit;
if FDailyFileName then
begin
DecodeDate(Now,y,m,d);
FCurrentDay := Format('%.04d%.02d%.02d',[y,m,d]);
end
else
begin
FCurrentDay := '';
end;
fl := ExtractFilePath(FFileName)+FCurrentDay+ExtractFileName(FFileName);
try
FFileStream := TFileStream.Create(fl,fmOpenWrite);
except
try
FFileStream := TFileStream.Create(fl,fmCreate);
except
end
end;
if (FSaveDate) and (FSaveHour) then
aux := '<'+DateToStr(Date)+','+TimeToStr(Time)+'>'
else
if FSaveDate then
aux := '<'+DateToStr(Date)+'>'
else
if FSaveHour then
aux := '<'+TimeToStr(Time)+'>';
aux := aux + #32 + FLineHeader + str + #13#10;
try
FFileStream.Seek(FFileStream.Size,soFromBeginning);
FFileStream.Write(Pointer(aux)^, Length(aux));
except
end;
FFileStream.Free;
end;
end.
Amb la propietat Active activem i desactivem la generació de traces. Les propietats SaveDate i SaveHour fan que en cada traça es guardi la data i l'hora respectivament de generació. A LineHeader podem posar un text que es generi a cada línea. Si activem DailyFileName, al nom del fitxer, FileName, s'afegeix la data del dia. Així, cada dia tenim un nom de fitxer difere nt. Finalment, una vegada tenim assignats a les propietats els valor que ens interessen, amb el métode SaveToFile, amb un text com a paràmetre, generem el text que volem que es guardi.