Delphiのインターフェースを使うと、参照カウントが0になったオブジェクトは自動で破棄されます。
この機能を使って、変数がスコープを離れた時にリソースを返却するRAIIを実現できます。
今回はスコープを離れたら自動的に削除される一時ファイルを作成します。
使用例
procedure TForm1.Button1Click(Sender: TObject);
var
TempFile: ITempFile; //一時ファイルオブジェクト
FileName: String; //一時ファイルのファイル名
begin
TempFile := CreateTempFile; //一時ファイルを作成する
FileName := TempFile.GetFileName; //一時ファイルのファイル名を取得する
DoSomething(FileName); //一時ファイルを使用する
end; //スコープを離れたら一時ファイルは削除される
実装方法は次のようになります。
type
/// <summary>一時ファイルを管理するRAIIのインターフェース</summary>
ITempFile = interface
/// <summary>一時ファイルのファイル名を取得する</summary>
function GetFileName: String;
end;
/// <summary>RAIIのオブジェクトを取得する</summary>
/// <returns>RAIIのオブジェクト。実体はTTempFileクラス</returns>
function CreateTempFile():ITempFile;
implementation
type
/// <summary>ITempFileの実装。このクラスは公開しない。</summary>
TTempFile = class(TInterfacedObject, ITempFile)
private
FFileName: String; //一時ファイルのファイル名
public
constructor Create();
destructor Destroy; override;
/// <summary>一時ファイルのファイル名を取得する</summary>
function GetFileName: String;
end;
function CreateTempFile():ITempFile;
begin
Result := TTempFile.Create();
end;
constructor TTempFile.Create;
begin
//一時ファイルを作成してファイル名を取得する
FFileName := IOUtils.TPath.GetTempFileName;
end;
destructor TTempFile.Destroy;
begin
try
IOUtils.TFile.Delete(FFileName)
except on E: Exception do
//削除に失敗した時は例外を無視する
end;
inherited;
end;
function TTempFile.GetFileName: String;
begin
Result := FFileName;
end;
なかなか便利ではないかと思いますが、いかがでしょうか。