ダイアログ・コールバック・ルーチン

すべてのコールバック・ルーチンは,次のインタフェースを持っていなくてはなりません。

SUBROUTINE callback(dlg, control_name, callbacktype )

dlg

ダイアログボックスを引用します。これにより,コールバックはダイアログ・コントロール値を変更することができます。

control_name

コールバックを引き起こしたコントロールの名前。

callbacktype

どのようなコールバックが起こっているかを示します (DLG_CLICKEDDLG_CHANGEDLG_DBLCLICK など)。

最後の 2 つのパラメタを使うと,複数のコントロールからの複数のコールバックで使用することができる 1 つのサブルーチンを作成することができます。一般に,これは論理的なグループを形成するコントロールに対して行います。たとえば,前例の「Temperature」ダイアログの全コントロールは,UpdateTemp という同じコールバック・ルーチンに関連付けられています。また,同じコントロールに複数のコールバック・ルーチンを関連付けることもできますが,この場合,どのコールバックを使用するかを示す指標パラメタを指定しなくてはなりません。

次にコールバック・ルーチンの例を示します。

	SUBROUTINE UpdateTemp( dlg, control_name, callbacktype )
	USE DFLOGM
	IMPLICIT NONE
	TYPE (dialog) dlg
	INTEGER control_name
	INTEGER callbacktype
	INCLUDE 'RESOURCE.FD'
	CHARACTER(256) text
	INTEGER cel, far, retint
	LOGICAL retlog
!	引用されていない引数に関するコンパイラ警告を抑止します。
	INTEGER local_callbacktype
	local_callbacktype = callbacktype

	SELECT CASE (control_name)
	  CASE (IDC_EDIT_CELSIUS)
!		Celsius 値はユーザーが修正したため,
!		Fahrenheit 値とスクロールバー値の両方を更新します。
		retlog = DlgGet( dlg, IDC_EDIT_CELSIUS, text )
		READ (text, *, iostat=retint) cel
		IF ( retint .eq. 0 ) THEN
		  far = (cel-0.0)*((212.0-32.0)/100.0)+32.0
		  WRITE (text,*) far
		  retlog = DlgSet( dlg, IDC_EDIT_FAHRENHEIT,		&
		&		TRIM(ADJUSTL(text)) )
		  retlog = DlgSet( dlg, IDC_SCROLLBAR_TEMPERATURE, cel,	&
		&		DLG_POSITION )
		END IF
	  CASE (IDC_EDIT_FAHRENHEIT)
!		Fahrenheit 値はユーザーが修正したため,
!		Celsius 値とスクロールバー値の両方を更新します。
		retlog = DlgGet( dlg, IDC_EDIT_FAHRENHEIT, text )
		READ (text, *, iostat=retint) far
		IF ( retint .eq. 0 ) THEN
		  cel = (far-32.0)*(100.0/(212.0-32.0))+0.0
		  WRITE (text,*) cel
		  retlog = DlgSet( dlg, IDC_EDIT_CELSIUS, TRIM(ADJUSTL(text)) )
		  retlog = DlgSet( dlg, IDC_SCROLLBAR_TEMPERATURE, cel,	&
		&		DLG_POSITION )
		END IF
	  CASE (IDC_SCROLLBAR_TEMPERATURE)
!		スクロールバー値はユーザーが修正したため,
!		Celsius 値と Fahrenheit 値の両方を更新します。
		retlog = DlgGet( dlg, IDC_SCROLLBAR_TEMPERATURE, cel,	&
		&		DLG_POSITION  )
		far = (cel-0.0)*((212.0-32.0)/100.0)+32.0
		WRITE (text,*) far
		retlog = DlgSet( dlg, IDC_EDIT_FAHRENHEIT, TRIM(ADJUSTL(text)) )
		WRITE (text,*) cel
		retlog = DlgSet( dlg, IDC_EDIT_CELSIUS, TRIM(ADJUSTL(text)) )
	  END SELECT
	END SUBROUTINE UpdateTemp

ダイアログボックス内のすべてのコントロールは,プッシュボタンを例外として,何も動作を実行しない基本コールバックを持っています。プッシュボタンのクリック・イベントの基本コールバックは,ダイアログの戻り値をプッシュボタン名に設定した後に,ダイアログを終了します。これにより,基本設定では,すべてのプッシュボタンがダイアログを終了させることになり,「OK」ボタンと「CANCEL」ボタンに適切な基本動作を与えることになります。この場合,DLGMODAL を呼び出したルーチンは,検証を行って,どのプッシュボタンがモーダル・ダイアログを終了させたのかを調べることができます。

特定のコントロールのコールバックは,そのコントロール値がユーザーの動作によって変更された後に呼び出されます。DLGSET を呼び出した結果としてコントロール値が変化しても,コールバックは呼び出されません。特に,コールバック中でコントロールに対して DLGSET を実行しても,そのコントロールに関連付けられたコールバックが呼び出されることはありません。

DLGMODAL または DLGMODELESS が呼び出される前後で DLGSET を呼び出しても,コールバックは呼び出されません。コールバックを呼び出す必要がある場合,DLGSET を実行した後に,CALL を使って手動で呼び出す必要があります。