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


用户对话框



作成简单的用户对话框

利用WSCdialog 制作具有以下功能的简单用户对话框。


  • 点击某按钮时,显示对话框。

  • 在对话框上有输入字段和无线按钮组。

  • 对话框结束时,核对输入是否正确。

  • 在标签中显示对话框的输入结果。


  • [使用用户对话框的范例]

    这个范例,作为ws/sampes/Ocaml/dialog/newproject.prj 提供。

    用户对话框的自动启动控制

    将在提供的ws/sampes/share/dialog/newproject.prj范例基础上,实现用户对话框的自动启动控制。 对话框往往作为输入或显示专用窗口被使用。因此,作为通常窗口制作时有难处理情况。 譬如,想从多个事件过程调用同样的对话框时。

    此时,如果作为普通的窗口进行处理的话,对话框的输入是否结束的判断处理就复杂。 然而,如果制作为对话框的话,对话框输入结束后,可以通过popup函数实现同期回归处理, 可简单地通过事件过程对对话框的输入进行控制。

    下图中,显示了当被显示窗返回结果时的普通窗口和对话框的差异。



    [使用普通窗口和对话框的差异]

    接着,我们将逐顺序说明简单对话框的处理次序。 首先制作对话框。制作WSCdialog Class的一个Instance。 然后在对话框上部署各种对象。在范例中,部署了下列对象。


  • WSCvifield* newvifi_003

  • WSCradioGroup* newradi_006


  • [简单的用户对话框例子]

    然后,记述点击对话框的 OK,NO,CANCEL 按钮时所做的处理。 通过对话框 ACITVATE 触发器,连接事件过程。使用该这个事件过程, 可以确认对话框输入值是否正确,如果不正确,通过消息对话框显示错误。

    (*----------------------------------------------------------*)
    (*Function for the event procedure                          *)
    (*----------------------------------------------------------*)
    open Swig
    open Mwt
    open Mwtlib
    open Newwin000
    
    let dialogep obj =
      (* do something...*)
      if get_int (obj -> getStatus()) <> get_int _WS_DIALOG_OK then begin (* A *)
        ignore(obj -> setVisible(_False));
      end else begin
        let str = ((!newvifi_003) -> getProperty("labelString")) in
        if get_string (str -> getCharPtr()) = "" then begin               (* B *)
          let msg = _WSGIappMessageDialog '() in
          msg->setProperty("defaultPosition",_True);
          msg->setProperty("width",500);
          msg->setProperty("labelString",
              "Please input some string to the input field.");
          ignore(msg->popup());                                           (* C *)
        end else begin
          let value = !newradi_006->getProperty("value") in
          if get_int value = 0 then begin                                 (* D *)
            let msg = _WSGIappMessageDialog '() in
            msg->setProperty("defaultPosition",_True);
            msg->setProperty("width",500);
            msg->setProperty("labelString",
                "Please select a item of the radio group.");
            ignore(msg->popup());                                         (* E *)
           end else begin
            ignore(obj -> setVisible(_False));                            (* F *)
           end;
        end;
      end;
      ()
    let _ = Callback.register "dialogep" dialogep
    

    首先,取得事件过程对话框的Class pointer。通过访问对话框类 固有的getStatus 函数,确认被按按钮的种类。

    A ,不是对话框类的情况,结束事件过程。

    B ,核对被按按钮。OK 按钮以外,不显示对话框。

    C 判断 newvifi_003中的输入。没被输入的情况,D 显示消息对话框,然后结束处理。

    E 判断newradi_006是否被选择。没被选择的情况,用F显示消息对话框,然后结束处理。

    下面是调出对话框的事件过程例子。



    [调用用户对话框画面的例子]

    按下[dialog!]按钮时,对话框将被显示,输入结果将被显示在3个标签上。 在第1个的标签上,显示对话框的 OK,NO,CANCEL 按钮被按时的结果。 第2个标签上,显示被输入newvifi_003的结果,第3个标签上,显示newradi_006被选择的结果。

    (*----------------------------------------------------------*)
    (*Function for the event procedure                          *)
    (*----------------------------------------------------------*)
    open Swig
    open Mwt
    open Mwtlib
    open Newwin000
    
    let btnep obj =
      (* do something...*)
      let value = !newdial_001 -> popup() in
      if get_int value = get_int _WS_DIALOG_OK then begin
        ignore(!newvlab_007 -> setProperty("labelString","DIALOG OK!"));
      end else
      if get_int value = get_int _WS_DIALOG_NO then begin
        ignore(!newvlab_007 -> setProperty("labelString","DIALOG NO!"));
      end else
      if get_int value = get_int _WS_DIALOG_CANCEL then begin
        ignore(!newvlab_007 -> setProperty("labelString","DIALOG CANCEL!"));
      end;
    
      let tmp = !newvifi_003 -> getProperty("labelString") in
      let tmp2 = "INPUT:" ^ (get_string(tmp->getCharPtr())) in
      ignore(!newvlab_010 -> setProperty("labelString",(make_string(tmp2))));
    
      let tmp = !newradi_006 -> getProperty("value") in
      let tmp2 = "SELECT:" ^ (get_string(tmp->getCharPtr())) in
      ignore(!newvlab_011 -> setProperty("labelString",(make_string(tmp2))));
    
      ()
    let _ = Callback.register "btnep" btnep
    


    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