![]() | Programming Guide | WideStudio/MWT Index 目次 |
EXIT トリガによる終了イベントプロシージャでダイアログを表示するには
ウィンドウを閉じてアプリケーションを終了する場合、データの保存を行った り、終了するか否かをダイアログを表示したい場合があります。そのような場 合、WSCwindow / WSCmainWindow クラスの EXIT トリガでイベントプロシージャ を使うと便利です。WSCwindow/WSCmainWindow クラスは、ウィンドウが不可視 状態になった場合に、EXIT トリガをあげ、アプリケーションが終了する前に、 イベントプロシージャを実行する機能を持っています。
まず、WSCwindow もしくは WSCmainWindow クラスのプロパティ "exit" を True にします。このプロパティは、アプリケーション中のウィンドウで特に メインで用いられるものに設定すると良いでしょう。そしてそのウィンドウに 対して、EXIT トリガでイベントプロシージャを張り付けます。
次のような機能を持つイベントプロシージャを作ってみます。
終了するか否かのダイアログを表示。 「OK」が選択された場合は、処理を行って終了。 「NO」が選択された場合は、処理を行わず終了。 「CANCEL」が選択された場合は、処理を行わず終了もしない。 (*----------------------------------------------------------*) (*Function for the event procedure *) (*----------------------------------------------------------*) open Swig open Mwt open Mwtlib let timer = ref C_void let target = ref C_void (* インスタンスを表示しなおすタイマープロシージャ*) let delayproc obj = if (get_int (!target) <> 0) then ignore(!target -> setVisible ( _True)); () let _ = Callback.register "delayproc" delayproc (* EXIT イベントプロシージャ本体 *) (* 終了時にダイアログを表示する。 *) let exit_ep obj = (* do something...*) if get_int (obj -> getVisible()) = get_int _False then let msg = _WSGIappMessageDialog '() in begin (* A *) msg -> setProperty ( "width", 500); msg -> setProperty ( "no", _True); msg -> setProperty ( "defaultPosition", _True); msg -> setProperty ( "labelString", "Exit and save data?\n If you do not want to save and exit,push NO..."); end; (* ダイアログの表示 *) let ret = msg -> "popup"() in begin (* B *) (* 初回実行時、タイマーを作成 *) if (timer = ref C_void) then let parent = obj -> getParentWindow () in begin timer := new_WSCvtimer ( C_list [parent; C_string "timer"]); let _ = Callback.register "timer" !timer in !timer -> init (); !timer -> setProperty ( "interval", 250 ); !timer -> setProperty ( "cont", _False ); !timer -> addProcedure ( "delay-prop", "delayproc",_WSEV_ACTIVATE ); end; if ( get_int ret = get_int _WS_DIALOG_OK ) then (* OKボタンがおされた場合 C *) exit 0; if ( get_int ret = get_int _WS_DIALOG_NO) then (* NOボタンがおされた場合 D *) exit 0; if ( get_int ret = get_int _WS_DIALOG_CANCEL) then begin (* CANCELボタンが押された場合 E *) target := obj; ignore(!timer -> setProperty ( "running", _True)); (* タイマーの起動 *) end; end; () let _ = Callback.register "exit_ep" exit_epA で、メッセージダイアログインスタンスを取得し、B でメッセージダイアログを 表示します。
C、D、E でダイアログの結果を判定し、OKボタンがおされたならば C、NO ボ タンがおされたならば D、CANCEL ボタンがおされたならば E となります。
E の終了せずに再び、表示しなおす場合、タイマーを使って、少しタイミング を送らせる必要があります。これは、ウィンドウシステムに対し、既に画面終 了イベントが発生しているため、そのイベントの処理が確実に処理されてから、 表示を行わなければならないからです。
[終了確認ダイアログ]
Copyright(C) WideStudio/MWT Development Team, 1999-2005 | Last modified: Jul 31, 2005 |