[Delphi] テキストファイル操作

テキストファイルを操作してプログラムの動作記録をとりませんか?ログをとっておくと後からデバッグを行うときにとっても便利。
ログの書き出し用にコンポーネントを作成すると使い回しが利いてさらに便利。
テキストファイルにログを書き込みための手順は以下のようになる。

  1. テキストファイルのオープン
    テキストファイルのオープンは新規の場合と、すでにファイルがある場合とで異なる。
      ・新規の場合 → Reset
      ・すでに存在する場合 → Rewrite
  2. 次にオープンしたファイルを上書き用に変更します。変更にはAppendを使用する。
  3. 書き込みには Writeln と Flush を使用します。Writeln でバッファに書き込みし、Flush でバッファからテキストファイルに書き出す。
  4. 書き込みが終わったら、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.

以上のコードがログ出力サンプルコンポーネントです。

コメント (0件)


くろねこ研究所
https://www.blackcat.xyz/article.php/ProgramingFAQ_del0029