既存のレコードにヘルパーメソッドを追加する。
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では)