Swanman's Horizon

性欲をもてあましつつなんらかの話をするよ。

既存のレコードにヘルパーメソッドを追加する。

SyncObjs.pasを何気なく眺めていたところ、こんな記述が。

TCriticalSectionHelper = record helper for TRTLCriticalSection
...

どうやらクラスヘルパーはレコードに対しても使える模様*1。ただ、VCL内でもたったの3箇所*2しか使われていない、"record helper for"でググると37件しかヒットせず、日本のサイトではどこにも触れられていないなど、相当にマイナーな存在みたい。
TCriticalSectionHelperはまさにレコードヘルパーの良い利用例だけど、他にもTPointやTRectなどわりと頻繁に使うであろうレコードに適用してみると結構便利かも。ただし演算子オーバーロードはレコードヘルパー内では使えなかった。比較だけでも書けたら(P1 = P2とかP1 <> P2みたいにしたい)楽なんだけど。

TPointHelper = record helper for TPoint
  class function Create(X, Y: Integer): TPoint; inline; // これはOK
  class operator Add(P1, P2: TPoint): TPoint; inline; // これはダメ
end;

var
  Pt: TPoint;
begin
  Pt := TPoint.Create(0, 0);
end;

*1:Hallvard's Blogのエントリを見たところ、2006の時点でUndocumentedながらすでに実装されてたらしい…でも未だにこれに関する記述なんてどこにもない気が

*2:SyncObjsに2箇所、D2D1に1箇所(Delphi2010では)