アプリケーションの構造は,ActiveX コントロールを含まないダイアログボックスを使っていた時の構造と同じままになっています。詳細は,「ダイアログ・アプリケーションの作成」を参照してください。この節では,ActiveX コントロールに関するプログラミングについて説明します。
ActiveX コントロールを含むダイアログボックスを DLGINIT で呼び出す前に,アプリケーションは COMINITIALIZE を呼び出さなければなりません。COMINITIALIZE を参照するために,アプリケーションには USE DFCOM 文が含まれていなければなりません。ActiveX コントロールの使用が終了した時に,アプリケーションは COMUNINITIALIZE を呼び出さなければなりません。
ActiveX コントロールのメソッドを呼び出したり,Fortran Module Wizard で作成したインタフェースや DFAUTO ルーチンを使って,プロパティ値を設定したり取り出したりすることができます。これを行うには,オブジェクトの IDispatch インタフェース・ポインタを持たなければなりません。ActiveX コントロール名,DLG_IDISPATCH コントロール指標,IDispatch ポインタを受け取るための整数引数を指定した DLGGET を使います。次にその例を示します。
retlog = DlgGet( dlg, IDC_ACTIVEX, idispatch, DLG_IDISPATCH )
DLG_IDISPATCH コントロール指標を指定する必要はありません。それが ActiveX コントロールの基本整数指標であるためです。
しかしながら,コントロールの IDispatch ポインタは,コントロールが作成された後でなければ利用可能ではなく,ダイアログボックスが閉じられるまでの間で有効であることに注意していください。コントロールは,DLGMODAL または DLGMODELESS の呼び出し中に作成されます。DLGMODAL または DLGMODELESS を呼び出す前に,IDispatch ポインタを受け取るために DLGGET を呼び出した場合,値 0 が返されます。
アプリケーション・ユーザーにダイアログボックスを表示する前に,コントロールのメソッドやプロパティを使用したい場合,DLG_INIT コールバックを使うことができます。ダイアログボックス名とコールバックを定義する DLG_INIT 指標を使って DLGSETSUB を呼び出します。次にその例を示します。
retlog = DlgSetSub( dlg, IDD_DIALOG, DlgSub, DLG_INIT )
DLG_INIT コールバックは,ダイアログボックスが作成された後で,表示される前 (callbacktype=DLG_INIT で) に,そしてダイアログボックスが破壊される前 (callbacktype=DLG_DESTROY で) に呼び出されます。DLG_INIT コールバックは,コントロールの IDispatch ポインタが利用可能になればすぐに実行されます。DLG_DESTROY コールバックは,ActiveX コントロールが破壊された後実行されます。
コントロールが破壊される前に,コントロール・プロパティの状態をリセットするために DLG_INIT コールバックを使う例を以下に示します。
SUBROUTINE mmplayerSub( dlg, id, callbacktype ) use dflogm use dfcom use dfauto implicit none type (dialog) dlg integer id, callbacktype include 'resource.fd' integer obj, iret logical lret if (callbacktype == dlg_init) then lret = DlgGet(dlg, IDC_ACTIVEMOVIECONTROL1, obj) ! ダイアログボックスが表示される前に,ここでメソッドと ! プロパティ呼び出しを追加します。 else if (callbacktype == dlg_destroy) then ! 現在のファイルを閉じるために,FileName を "" にリセットします。 lret = DlgGet(dlg, IDC_ACTIVEMOVIECONTROL1, obj) iret = AUTOSETPROPERTY(obj, "FileName", "") endif END SUBROUTINE mmplayerSub
ActiveX コントロール用に Fortran Module Wizard で作成したモジュールには,数個のセクションが含まれています。
ActiveX コントロール・クラスを識別する GUID 構造型パラメタ。一般的に,アプリケーションがこのパラメタを使う必要はありません。
ActiveX コントロールのソース (イベント) インタフェースを識別する GUID 構造型パラメタ。アプリケーションは,DLGSETCTRLEVENTHANDLER (以下を参照) の呼び出しでこれらの値を使用することができます。
ActiveX コントロール・インタフェースで使用される定数を識別する整数型パラメタ。
ActiveX コントロールが定義するソース (イベント) インタフェースに対するインタフェース。0,1 またはそれ以上のコントロールが実装するソース・インタフェースがあります。コントロールは,イベントをサポートする必要はありません。
コントロールのメソッドを簡単に呼び出すことができ,コントロール・プロパティを簡単に設定したり取り出したりするためのラッパ・ルーチン。
Fortran Module Wizard が生成したメソッドとプロパティのインタフェースの使い方については,「Module Wizard によって生成されたルーチンの呼び出し」を参照してください。
メソッドとプロパティに加えて,ActiveX コントロールはまた,コントロールで何かが発生したことをアプリケーションに通知するためのイベントも定義しています。ダイアログ手続は,イベントが発生した時,実行するルーチンを定義できる DLGSETCTRLEVENTHANDLER ルーチンを提供しています。
DLGSETCTRLEVENTHANDLER 関数は,以下のようなインタフェースを持っています。
integer DlgSetCtrlEventHandler(dlg, controlid, handler, dispid, iid)
dlg | (入力) DIALOG 構造型。ダイアログボックス・パラメタを含みます。 |
controlid | (入力) 整数型。ダイアログボックス内のコントロール識別子を指定します (.FD ファイルから)。 |
handler | (入力) 外部関数。イベントが発生した時呼び出されるルーチン名です。 |
dispid | (入力) 整数型。イベントを識別するイベント・インタフェース中のメソッドのメンバ ID を指定します。 |
iid | (入力,省略可能) GUID 構造型。ソース (イベント) インタフェースのインタフェース識別子を指定します。省略すると,ActiveX コントロールの基本ソース・インタフェースが使われます。 |
次の関数呼び出しを考えます。
ret = DlgSetCtrlEventHandler( dlg, IDC_ACTIVEMOVIECONTROL1, & ActiveMovie_ReadyStateChange, -609, IID_DActiveMovieEvents2 )
IDC_ACTIVEMOVIECONTROL1 は,ダイアログボックスの ActiveMovie コントロールを識別します。
ActiveMovie_ReadyStateChange は,イベント処理ルーチン名です。
-609 は,ActiveMovie コントロールの ReadyStateChange イベントのメンバ ID です。この番号を以下から得ることができます。
Fortran Module Wizard が生成したモジュールから。ソース・インタフェース中の各メソッド用に生成された注釈「MEMBERID = nn」があります (以下の例を参照)。
ActiveX コントロールのマニュアルから。
ActiveX コントロールのタイプ情報を検証できるツールから。たとえば,「Compaq Visual Fortran 6」プログラム・フォルダ中の「OLE-COM Object Viewer」などがあります。
IID_DActiveMovieEvents2 は,ソース (イベント) インタフェースの識別子です。
ReadyStateChange イベント用に Fortran Module Wizard が生成したインタフェースは,以下の通りです。
INTERFACE ! ActiveMovie コントロールの ReadyState プロパティが ! 「MEMBERID = -609」に変更されたことを報告します。 SUBROUTINE DActiveMovieEvents2_ReadyStateChange($OBJECT,& & ReadyState) INTEGER(4), INTENT(IN):: $OBJECT ! オブジェクト・ポインタ !DEC$ ATTRIBUTES VALUE:: $OBJECT INTEGER(4):: ReadyState !DEC$ ATTRIBUTES VALUE:: ReadyState !DEC$ ATTRIBUTES STDCALL :: DActiveMovieEvents2_ReadyStateChange END SUBROUTINE DActiveMovieEvents2_ReadyStateChange END INTERFACE
アプリケーションで定義したハンドラは,同じインタフェースを持っていなければなりません。そうしないと,アプリケーションのスタックが不正な状態になるため,アプリケーションが予期しない方法でクラッシュするかもしれません。
オブジェクトは,常にイベント・ハンドラの第 1 パラメタであることに注意してください。このオブジェクト値は,コントロールのソース (イベント) インタフェースのポインタであって,コントロールの IDispatch ポインタではありません。コントロールの IDispatch ポインタを取り出すためには前述のように DLGGET を使うことができます。