アプリケーションにコードを追加

アプリケーションの構造は,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 で作成したモジュールには,数個のセクションが含まれています。

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 )

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 を使うことができます。