メソッドは、ユーザーインタフェース内でイベントに応答して呼び出されるアプリケーション手順およびコールバックに似ています。実際には、メソッドの呼び出しはやや異なっています。また、メソッドは、C++ クラスのメンバー関数として宣言されます。
X ツールキットは、C++ を認識しないため、X-Designer は C++ クラスと OSF/Motif とのインタフェースの間接参照を行います。
メソッドに対してコードを生成する場合、実際には、X-Designer はユーザーが宣言する各メソッドに対して 2 個のエントリを生成します。静的メンバー関数が X-Designer により宣言され、OSF/Motif で指定されているイベントに対してのコールバックとして登録されます。このコールバックは、private_data 引数を使用しますが、この引数は常にクラスインスタンスへのポインタ、つまり「this」ポインタとなります。静的メンバー関数が呼び出される場合には、 private_data 引数を介して参照を行い、クラスインスタンスデータを検索します。そして、非静的メンバー関数、つまりユーザー作成の関数を呼び出し、Motif からのウィジェットとコールバック固有データを渡します。この 2 番目のクラス関数は、仮想と宣言されているため、派生クラスで動作を書き換えることができます。
例として、クラス「my_class」のメソッド「my_method」を宣言します。X-Designer は、以下の宣言およびコードを生成します。
class my_class: public ... {
...
/* Motif が参照するため、X-Designer はコールバックを生成しました */
static void my_method(Widget,XtPointer,XtPointer);
/* あなたのアプリケーション関数は、上記より呼び出されます */
virtual void my_method(Widget,XtPointer);
...
} ;
...
typedef my_class_p *my_class ;
...
/* X-Designerは、静的メンバー関数の実装を生成しました */
void my_class::my_method(Widget widget,
XtPointer client_data,
XtPointer call_data)
{
my_class_p instance = (my_class_p) client_data ;
/* ユーザー定義アプリケーション関数を呼び出します */
instance->my_method(widget,call_data) ;
}
X-Designer が Motif にコールバックを登録する場合 (生成クラス作成関数において)、以下の形式をとります。
XtAddCallback(widget,XmNactivateCallback,my_method,(XtPointer) this)
ここでの my_method 引数は、X-Designer 生成の静的メンバー関数であり、(仮想) アプリケーション定義のメソッドではありません。
アプリケーションで設定したメソッドは、引数を 2 個持つことになっているという点で、コールバックとは異なります。
void my_class::my_method(Widget widget, XtPointer call_data)
{
XmAnyCallbackStruct *cb = (XmAnyCallbackStruct *) call_data ;
...
}
このため、X-Designer は、宣言された各メソッドに対して 2 個のメンバー関数を生成します。1 個は静的で宣言され、もう 1 個は仮想宣言されます。X-Designer はまた、静的メンバー関数の実装を生成します。その唯一の用途は、クラスインスタンスデータを検索してから、適切な引数を使用して第 2 のアプリケーション定義のクラス関数を呼び出します。
検索機能を使用すると、デザイン内のすべてのウィジェットを対象としてメソッド(またはメソッドにある文字列) を検索することができます。
注意
イベントへの応答で呼び出されるメソッドは、ウィジェット (それ自身がクラスである場合) またはクラスとして宣言されたウィジェットの最も近くの祖先に属しているものです。
関連項目: