コンパイラ指令Includeの便利な使い方
54 UseInclude 動作確認 Delphi2007 更新日 2008/01/30(水)

Delphiにはテンプレートが無い(D2007時点)ので
別々な型に対しておなじソースコードで
操作をしようとすることは基本的に不可能です。

しかし、同じソースなのに別な型に対して
コピーペーストしてプログラム組むのはよくありません。


そこでコンパイラ指令のIncludeを上手く使って
ソースを共通化してしまいましょう。

DelphiのIncludeは単にファイルの内容を挿入するだけの機能しか
持ち合わせていません。(C++とは違うらしい)

Include指令を単独で使うと挿入部分ひとつに対して
1つのテキストファイルを指定しなければいけないので
ソースの一部だけを差し替えたい場合には
Includeするファイルが増えて大変になりますが

他のコンパイラ指令と組み合わせることで
かなり使えるようになります。

呼び出すソースを Unit1.pas
Includeされるテキストファイルを File1.txt
として、以下のように記述してみます。

Unit1.pas
    {$define No1}
    {$include File1.txt}
    処理U1
    {$define No2}
    {$include File1.txt}
    処理U2
    {$define No3}
    {$include File1.txt}
    処理U3

File1.txt
    {$ifdef No1}
    {$undef No1}
    処理F1
    {$endif}

    {$ifdef No2}
    {$undef No2}
    処理F2
    {$endif}

    {$ifdef No3}
    {$undef No3}
    処理F3
    {$endif}

こうすることで、Unit1.pasは
    処理F1
    処理U1
    処理F2
    処理U2
    処理F3
    処理U3
このような動作を行うソースになります。

具体的に書くと以下のような記述が可能になります。

Unit1.pas
    interface

    uses xx,xx;

    {$define interface}
    {$include File1.txt}

    implementation

    {$define implementation}
    {$include File1.txt}

    end.

File1.txt

    {$ifdef interface}
    {$undef interface}

    type
      TA = class(TObject)
      private
        procedure MyMethod;
      end;

    {$endif}

    {$ifdef implementation}
    {$undef implementation}

    procedure TA.MyMethod;
    begin
      //...
    end;

    {$endif}
────────────────────

参考────────────────────
TemplateList
http://delfusa.main.jp/delfusafloor/opensource/delfusalibrary/20070828160200/TemplateList/index.html
    様々な型に対するTListを作成したサンプル
    例えばRectList.pasやPointList.pasをみると
    非常に短いソースコードでRect型やPoint型のListを作成出来ることがわかる。
    RecordList.inc.pasでソースを共通化している。