Delphiで関数内関数を関数ポインタとして引き渡す

僕が愛用しているEOFile作者さんのところに、こんな記事があるのですが、
http://hp.vector.co.jp/authors/VA028375/delphi/delphipascal_xx_lambda.html
ここまで手の込んだことをしなくても、単純な関数ポインタとして関数内関数を渡すことは実はそんなに難しいことではなかったのですね。つまり、Pointer型に代入してやって、使うときに関数型にキャストしてやればいいのです。気をつけることは、親関数の変数やSelfオブジェクトに触らないようにすることです。これは結構便利です。

procedure SomeFunction(x: Integer; y: [0,1])
  type
    TFunc = function (z: Integer): Integer;
  function RunSubFunction(pfunc: Pointer; z: Integer): Integer;
    var
      func: TFunc;
    begin
      func := TFunc(pfunc);
      Result := func(z);
    end;
  function SubFunc1(z: Integer): Integer;
    begin
      Result := z*2;
    end;
  function SubFunc2(z: Integer): Integer
    begin
      Result := z*z;
    end;
  begin
    case y of
    0: Result := RunSubFunction(@SubFunc1, x);
    1: Result := RunSubFunction(@subFunc2, x);
    end;
  end;