テキストファイルを操作してプログラムの動作記録をとりませんか?ログをとっておくと後からデバッグを行うときにとっても便利。
ログの書き出し用にコンポーネントを作成すると使い回しが利いてさらに便利。
テキストファイルにログを書き込みための手順は以下のようになる。
- テキストファイルのオープン
テキストファイルのオープンは新規の場合と、すでにファイルがある場合とで異なる。
・新規の場合 → Reset
・すでに存在する場合 → Rewrite
- 次にオープンしたファイルを上書き用に変更します。変更にはAppendを使用する。
- 書き込みには Writeln と Flush を使用します。Writeln でバッファに書き込みし、Flush でバッファからテキストファイルに書き出す。
- 書き込みが終わったら、CloseFileでクローズして終わる。
以下にサンプルでログ出力用のサンプルのソースを掲載するので参考に。
unit FileLogger;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs;
type
TFileLogger = class(TComponent)
private
FFile: TextFile;
FFilename: String;
FSeparator: String;
FDateFormat: String;
FTimeFormat: String;
protected
procedure Loaded; override;
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
procedure Report(sMsg: String);
published
property Filename: String read FFileName write FFileName;
property Separator: String read FSeparator write FSeparator;
property DateFormat: String read FDateFormat write FDateFormat;
property TimeFormat: String read FTimeFormat write FTimeFormat;
end;
procedure Register;
implementation
procedure Register;
begin
RegisterComponents('Sample', [TFileLogger]);
end;
{ TFileLogger }
constructor TFileLogger.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
// フォーマットの初期化
FDateFormat := 'yyyy/mm/dd';
FTimeFormat := 'hh:nn:ss';
FSeparator := #9;
end;
destructor TFileLogger.Destroy;
begin
inherited;
CloseFile(FFile);
end;
procedure TFileLogger.Loaded;
var
sFileName: String;
begin
inherited;
if (csDesigning in ComponentState) then Exit;
// ファイルポインタの初期化
if (FFilename <> '') then
sFilename := FFileName
else
sFilename := FormatDateTime('yyyymmdd', Date) + '.txt';
AssignFile(FFile, sFilename);
if FileExists(sFilename) then
Reset(FFile)
else
Rewrite(FFile);
Append(FFile);
end;
procedure TFileLogger.Report(sMsg: String);
var
s: String;
begin
s := FDateFormat + FSeparator + FTimeFormat + FSeparator;
s := FormatDateTime(s, Now) + sMsg;
Writeln(FFile, s);
Flush(FFile);
end;
end.
以上のコードがログ出力サンプルコンポーネントです。