title: 黄道編以降の変更
author: YOSHIDA Kazuhiro
mailto: moriq@moriq.com

1. 黄道編以降の変更

1.1. 条件シンボル 'VCL' の導入

  ひとつのソースで Delphi でも Kylix でもコンパイルできるように、条件シンボル 'VCL' を導入しました。
1.1.1. 導入の理由
  Delphi/Kylix の標準条件シンボルとして 'MSWINDOWS', 'WIN32', 'LINUX' が用意されていますが、これらはコンパイルするときの OS を示すためのもので、同一ソース上で VCL/CLX を切り替える用途には使えません。
  そこで、VCL/CLX 混在ソース中で VCL を使う箇所を %c:{$IFDEF VCL} {$ENDIF}% で囲むことにしました。
  'VCL' ではなくて 'CLX' を条件シンボルにしてもいいわけですが、CLX は Windows でも Linux でもコンパイルできますから、CLX をデフォルトとして考えたほうが将来的に良いだろうと判断しました。
1.1.1. 設定の方法
  Apollo で VCL を使う場合は必ず、全ての Apollo 関係のプロジェクトに条件シンボル 'VCL' を定義してください。
  IDE ではメニューから [プロジェクト]->[オプション] を開き [ディレクトリ/条件] タブを選択します。そのタブシートにある [条件定義] に %c:VCL% と入力します。
  コマンドラインではコンパイラオプションとして %c:-DVCL% を指定します。
  一般的には IDE から設定したほうが楽です。IDE から設定すれば、IDE 用の設定ファイル %c:.dof% , コマンドライン用の設定ファイル %c:.cfg% の両方が更新されるからです。ちなみに Kylix では %c:.kof% , %c:.conf% が使われますから、影響ありません。

1.1. DefineCompoClass

  Phi 拡張ライブラリでクラスを定義する際に、以前は次のようにしていました。
--code
  RegisterClass(TDateTimePicker);
  PhiAllocFuncList.AddObject('TDateTimePicker', @DateTimePicker_alloc_v);
  cDateTimePicker := rb_define_class('DateTimePicker', ap_cWinControl);
  DefineProp(cDateTimePicker, TDateTimePicker);
--
  今では次のように書けます。
--code
  cDateTimePicker := DefineCompoClass(ap_mPhi, TDateTimePicker, ap_cWinControl, DateTimePicker_alloc_v);
--
  Delphiクラス名を強制的にRubyクラス名として用いる(頭の "T" を取る)ことが難点といえば難点ですが、VCL/CLX と Phi との同一性を重視する立場からいえば推奨されるべき仕様でしょう。

1.1. Phi 拡張ライブラリにおける %c:require 'phi'% の事前チェック

  すべての Phi 拡張ライブラリは、事前に %c:require 'phi'% しておくことが前提となります。
  %c:require 'phi'% されていない場合に備えて、 %c:Init_foo% 定義の先頭では必ず
--code
  if ap_mPhi = 0 then ap_loaderror('undefined Phi module');
--
  このようにチェックを入れるようにしてください。

