Create  Edit  Diff  Phillro Industries  Index  Search  Changes  History  Source  RSS  Note  wikifarm  Login

PhiHandle.pas

$(Apollo)/src/PhiHandle.pas は、Delphiのイベントを受けてApolloのイベントハンドラを呼び出すための仕組みを記述するファイル。

記述した後に $(Apollo)/src/PhiProp.bat を実行して $(Apollo)/src/PhiProp.inc に反映させる必要がある。

イベントハンドラの処理の概要

  1. メソッドの実体は、Delphiのイベントハンドラで、
  2. Delphiのイベントが発生した時に呼び出されるモノです。
  3. Delphiからのイベント発生の通知を受けて、
  4. そのデータをApolloのデータに変換して、
  5. Apolloのイベントハンドラを呼び出し、
  6. 戻り値があればそれをDelphiに返します。

記述例

**$(Apollo)/src/PhiHandle.pas より**

procedure TPhiHandle.KeyPressOnKeyPress(Sender: TObject; var Key: Char);
var
 recv, data, ret: Tvalue;
begin
 recv := TComponent(Sender).tag;                //SenderのApolloのオブジェクト
 if recv = 0 then Exit;
 data := rb_ary_new;
 rb_ary_push(data, rb_intern('on_key_press'));  //Apolloのハンドラ名
 rb_ary_push(data, recv);
 rb_ary_push(data, INT2FIX(Ord(Key)));          // Apolloのデータへ変換
 ret := PhiCallProtect(data);                  // Apolloのイベントハンドラの呼び出し
 if ret <> Qnil then Key := Char(FIX2INT(ret)); // 戻り値をDelphiに返す。
end;

メソッド名の仕組み

「KeyPressOnKeyPress」というメソッド名は「KeyPress」←「TKeyPressEvent型」という型名と「OnKeyPress」というDelphiのイベント名とから合成されている。

**Delphiヘルプより**

OnKeyPress イベントは,キーが押されたときに発生します。

type TKeyPressEvent? = procedure (Sender: TObject; var Key: Char) of object;

property OnKeyPress: TKeyPressEvent?;

「NotifyOnChange」というメソッド名であれば「Notify」←「TNotifyEvent型」という型名と「OnChange」というイベント名とから合成されている。

**$(Apollo)/src/PhiHandle.pas より**

procedure TPhiHandle.NotifyOnChange(Sender: TObject);

**Delphiヘルプより**

OnChange? イベントは,編集コントロールのテキストに変更が加えられたときに発生します。

property OnChange?: TNotifyEvent?;

TNotifyEvent? 型は,パラメータを要求しないイベントが使います。

ユニット Classes

type TNotifyEvent? = procedure (Sender: TObject) of object;

recv := TComponent(Sender).tag

var
 recv, data, ret: Tvalue;
・・
recv := TComponent(Sender).tag

はDelphiのオブジェクトに保管されているrubyオブジェクトへのポインタを取り出します。「tag」というのはDelphiのComponentオブジェクトに用意されている用途の決まっていないプロパティです。Apolloではこれを「rubyオブジェクトへのポインタ」を格納する用途で使っています。

**Delphiヘルプより**

Tag プロパティは,整数値をコンポーネントの一部として格納します。

property Tag: Longint;

説明

Tag は,あらかじめ定義された意味のあるプロパティではありません。Tag プロパティは,開発時の利便性のために提供されます。追加の整数値を格納したり,コンポーネント参照またはポインタなどの 32 ビット値に型キャストできます。

Last modified:2005/12/14 11:45:57
Keyword(s):
References:[PhiHandle.pas]