program raiiexample;

{$mode objfpc}{$H+}

uses
  SysUtils;

type
  TAutoTimer = class
  private
    FStart: QWord;
  public
    constructor Create;
    destructor Destroy; override;
  end;

constructor TAutoTimer.Create;
begin
  FStart := GetTickCount64;
  WriteLn('Timer started');
end;

destructor TAutoTimer.Destroy;
begin
  WriteLn('Elapsed: ', GetTickCount64 - FStart, ' ms');
  inherited Destroy;
end;

begin
  // ブロックを抜けると自動で Destroy が呼ばれる
  with TAutoTimer.Create do
  try
    Sleep(500);
  finally
    Free;
  end;
end.