テキストファイルを操作してプログラムの動作記録をとりませんか?ログをとっておくと後からデバッグを行うときにとっても便利。
ログの書き出し用にコンポーネントを作成すると使い回しが利いてさらに便利。
テキストファイルにログを書き込みための手順は以下のようになる。
- テキストファイルのオープン
テキストファイルのオープンは新規の場合と、すでにファイルがある場合とで異なる。
・新規の場合 → 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.
以上のコードがログ出力サンプルコンポーネントです。