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

ユーザダイアログ



簡単なユーザダイアログの作成

WSCdialog を利用して簡単なユーザダイアログを作成してみましょう。次の様 な機能をもっているものとします。


  • あるボタンを押すと、ダイアログが表示されます。

  • ダイアログには、インプットフィールドとラジオボタングループがあります。

  • ダイアログ終了時に、正しく入力が行われているかチェックをします。

  • ダイアログの入力結果をラベルに表示します。


  • [ユーザダイアログを使ったサンプル]

    このサンプルは、ws/sampes/Ocaml/dialog/newproject.prj で 提供されています

    ユーザダイアログのポップアップ制御

    ws/sampes/share/dialog/newproject.prj で提供されるサンプルをもとにユー ザダイアログのポップアップ制御をみていきましょう。ダイアログは、入力、 もしくは表示を行うための専用ウィンドウとしてよく用いられます。したがっ て、通常のウィンドウとして作成すると都合の悪い場合があります。たとえば、 複数の場所(イベントプロシージャ)から、同じダイアログを呼び出したいとし ます。

    この場合、通常のウィンドウとして実装していると、ダイアログの入力が終っ た場合の通知を受けるのが複雑になります。 しかしながら、ダイアログで実 装している場合では、ダイアログ入力終了が、popup メソッドによる完了復帰 で同期がとられるので、簡単にイベントプロシージャから、ダイアログ入力の 制御が行えます。

    図は、表示されたウィンドウが結果を返す場合のウィンドウとダイアログの 違いを示しています。



    [ウィンドウとユーザダイアログを使った場合の違い]

    簡単なダイアログの処理手順を順を追って説明しましょう。まず、ダイアログ の作成です。WSCdialog クラスのインスタンスを一つ作成します。ダイアログ 上に各々のオブジェクトを配置します。サンプルでは、下記のオブジェクトを 配位しています。


  • 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
    
    

    まずイベントプロシージャを張り付けたダイアログのクラスポインタを取得し ます。なぜかというと、ダイアログクラス固有のgetStatus メソッドにアクセ スして、押されたボタンの種類を調べるためです。

    A において押されたボタンをチェックします。OK ボタン以外は、ダイアログを そのまま不可視化します。

    B で newvifi_003 に入力されているかチェックします。入力されていない場 合は、C でメッセージダイアログを表示して、終了します。D で newradi_006 が選択されているかチェックします。選択されていない場合は、 E でメッセージダイアログを表示して、終了します。

    次に F で入力が正しい場合には、ダイアログを不可視化します。このとき、 このダイアログを不可視化することにより、このダイアログを呼び出している popup メソッドが復帰します。したがって、不可視化しない場合、ダイアログ が終了しません。

    次はダイアログを呼び出しているイベントプロシージャの例です。



    [ユーザダイアログを呼び出す画面の例]

    [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.80 for WideStudio ver 3.80, Jan 2005


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