WideStudio Application Builder User's Guide(Ocaml言語)
>

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_ep
    

    A で、メッセージダイアログインスタンスを取得し、B でメッセージダイアログを 表示します。

    C、D、E でダイアログの結果を判定し、OKボタンがおされたならば C、NO ボ タンがおされたならば D、CANCEL ボタンがおされたならば E となります。

    E の終了せずに再び、表示しなおす場合、タイマーを使って、少しタイミング を送らせる必要があります。これは、ウィンドウシステムに対し、既に画面終 了イベントが発生しているため、そのイベントの処理が確実に処理されてから、 表示を行わなければならないからです。



    [終了確認ダイアログ]


    Document Release 3.80 for WideStudio ver 3.80, Jan 2005


    WideStudio documents index | 目次
    バグ情報、ご質問等ございましたら、メーリングリストでご確認の上、 御気軽にこちらの方までよろしくお願いいたします。