WideStudio Application Builder User's Guide(Java言語)

EXIT トリガによる終了イベントプロシージャでダイアログを表示するには

ウィンドウを閉じてアプリケーションを終了する場合、データの保存を行った り、終了するか否かをダイアログを表示したい場合があります。そのような場 合、WSCwindow / WSCmainWindow クラスの EXIT トリガでイベントプロシージャ を使うと便利です。WSCwindow/WSCmainWindow クラスは、ウィンドウが不可視 状態になった場合に、EXIT トリガをあげ、アプリケーションが終了する前に、 イベントプロシージャを実行する機能を持っています。

まず、WSCwindow もしくは WSCmainWindow クラスのプロパティ "exit" を True にします。このプロパティは、アプリケーション中のウィンドウで特に メインで用いられるものに設定すると良いでしょう。そしてそのウィンドウに 対して、EXIT トリガでイベントプロシージャを張り付けます。

次のような機能を持つイベントプロシージャを作ってみます。


  • 終了するか否かのダイアログを表示。

  • 「OK」が選択された場合は、処理を行って終了。

  • 「NO」が選択された場合は、処理を行わず終了。

  • 「CANCEL」が選択された場合は、処理を行わず終了もしない。
  • //in delayproc.java
    //----------------------------------------------------------
    //Function for the event procedure
    //----------------------------------------------------------
    import org.widestudio.mwt.*;
    // オブジェクトを表示しなおすタイマープロシージャ
    public class delayproc {
      static WSCvtimer timer = null;
      static WSCbase target = null;
      protected static void delayproc(WSCbase object){
        if (target != null){
          target.setVisible((short)Mwt.True);
        }
      }
    }
    
    //in exit_ep.java
    //----------------------------------------------------------
    //Function for the event procedure
    //----------------------------------------------------------
    import org.widestudio.mwt.*;
    // EXIT イベントプロシージャ本体
    // 終了時にダイアログを表示する。
    public class exit_ep {
      protected static void exit_ep(WSCbase object){
        if (object.getVisible() != Mwt.False){
          return;
        }
        WSCmessageDialog msg = Mwt.WSGIappMessageDialog();  //A
        msg.setProperty("width",500);
        msg.setProperty("no",Mwt.True);
        msg.setProperty("defaultPosition",Mwt.True);
        msg.setProperty("labelString",
          "Exit and save data?\n If you do not want to save and exit,push NO...");
    
        // ダイアログの表示
        long ret = msg.popup();  //B
    
        // 初回実行時、タイマーを作成
        if (delayproc.timer == null){
          WSCbase parent = object.getParentWindow();
          delayproc.timer = new WSCvtimer(parent,"objname");
          delayproc.timer.init();
          delayproc.timer.setVariantData("variable_name","delayproc.timer");
          delayproc.timer.setProperty("interval",250);
          delayproc.timer.setProperty("cont",Mwt.False);
          delayproc.timer.addProcedure("delay-popup","delayproc.delayproc",Mwt.WSEV_ACTIVATE);
        }
    
        if (ret == Mwt.WS_DIALOG_OK){            // OKボタンがおされた場合 C
          // saving some data ...
          System.exit(0);
        }else if (ret == Mwt.WS_DIALOG_NO){      // NOボタンがおされた場合 D
          System.exit(0);
        }else if (ret == Mwt.WS_DIALOG_CANCEL){  // CANCELボタンが押された場合 E
          delayproc.target = object;
          delayproc.timer.setProperty("running",Mwt.True);   // タイマーの起動
        }
      }
    }
    

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