WideStudio/MWT Logo
WideStudio/MWT
Programming Guide
WideStudio/MWT Index
Table of contents


在退出 EXIT 事件处理过程中通过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 *)
          (* saving some data ... *)
          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 判断对话框的返回值。

    E 继续运行重新显示时,需要使用计时器实现少许延时处理。 这是因为,在窗口系统中要求在重新显示窗口之前产生结束事件。



    [确认结束的对话框]


    Document Release 3.90 for WideStudio/MWT ver 3.90, Jul 2005


    WideStudio/MWT documents index | Table of contents

    Copyright(C) WideStudio/MWT Development Team, 1999-2005 Last modified: Jul 31, 2005