A: Delphi は 2009 以降で無名メソッド (匿名メソッド / Anonymous Method) が実装されています。
概要は DocWiki (http://docwiki.embarcadero.com/RADStudio/ja/%E7%84%A1%E5%90%8D%E3%83%A1%E3%82%BD%E3%83%83%E3%83%89) を参照してもらうとして、無名メソッドは以下のような記述をする事もできます。
戻り値 := (関数)(引数, 引数…)
(手続き)(引数, 引数…);
関数の例:
var ret: Integer; begin ret := (function (a: Integer): Integer begin result := a + 1; end )(2); ShowMessage(IntToStr(ret)); end;
手続きの例:
begin (procedure (a: Integer) begin ShowMessage(IntToStr(a + 1)); end )(2); end;
これが理解できれば、"展開後のコードをどう書けばいいのか?" は解ると思います。コードは以下のようになるはずです。
procedure TForm1.Button1Click(Sender: TObject); var i: Integer; begin for i:=1 to 2 do begin // First time (procedure var s: string; begin s := 'ABC' + IntToStr(i); ShowMessage(s); end )(); // Second time (procedure var s: string; begin s := 'DEF' + IntToStr(i); ShowMessage(s); end )(); end; end;
こうですね。「これを *.inc で置き換えろ」という事ですから、最初のブロックは
(procedure
次のブロックは
)();
となります。*.inc を二つ使わずに単一の PrivateVar.inc でこれを展開させるには、{$I 'PrivateVar.inc'} が呼ばれる (という言い方も変ですが) たびにトグル動作させればいいわけです。そして答えはこうなります。
{$IFNDEF PASS_FLG} (procedure {$DEFINE PASS_FLG} {$ELSE} )(); {$UNDEF PASS_FLG} {$ENDIF}
7行で過不足なく書けました。答えは合っていましたか?
See Also:
[Delphi(Object Pascal)でcaseを式にする (山本隆の開発日誌)]
http://www.gesource.jp/weblog/?p=6691
[[Delphi][TIPS]無名メソッドをその場で呼び出す。(全力わはー)]
http://d.hatena.ne.jp/tales/20091026/1256570237
[無名メソッドを使った局所関数 (Delphi Programming) (DEKO の雑談)]
http://ht-deko.com/ft1408.html#140812_04
[Delphi Include File (*.inc) (DEKO の雑談)]
http://ht-deko.com/ft1301.html#130125
|