WideStudio/MWT Logo
WideStudio/MWT
Programming Guide
WideStudio/MWT Index
目次


ユーザダイアログ



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

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


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

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

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

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


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

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

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

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

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

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



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

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


  • WSCvifield* newvifi_003

  • WSCradioGroup* newradi_006


  • [簡単なユーザダイアログの例]

    次に、ダイアログの OK,NO,CANCEL ボタンが押された場合の処理を記述します。 ダイアログに ACITVATE トリガで、イベントプロシージャを張り付けます。こ のイベントプロシージャは、正しくダイアログに入力されたかどうかチェック し、されていなければ、メッセージダイアログでエラーを表示します。

    #include <WScom.h>
    #include <WSCfunctionList.h>
    #include <WSCbase.h>
    //----------------------------------------------------------
    //Function for the event procedure
    //----------------------------------------------------------
    #include <WSCdialog.h>
    #include <WSCvifield.h>
    #include <WSCradioGroup.h>
    #include <WSCmessageDialog.h>
    extern WSCvifield* newvifi_003;
    extern WSCradioGroup* newradi_006;
    
    void dialogep(WSCbase* object){
      WSCdialog* dialog = (WSCdialog*)object->cast("WSCdialog");
      if (dialog == NULL){ //A
        return;
      }
      if (dialog->getStatus() != WS_DIALOG_OK){ //B
        object->setVisible(False);
        return;
      }
    
      WSCstring str;
      str = newvifi_003->getProperty(WSNlabelString);
      if (!strcmp((char*)str,"")){                         //C
        WSCmessageDialog* msg = WSGIappMessageDialog();
        msg->setProperty(WSNdefaultPosition,True);
        msg->setProperty(WSNwidth,500);
        msg->setProperty(WSNlabelString,"Please input some string to the input field.");
        msg->popup();                       //D
        return;
      }
      long val = newradi_006->getProperty(WSNvalue);
      if (val == 0){                       //E
        WSCmessageDialog* msg = WSGIappMessageDialog();
        msg->setProperty(WSNdefaultPosition,True);
        msg->setProperty(WSNwidth,500);
        msg->setProperty(WSNlabelString,"Please select a item of the radio group.");
        msg->popup();                       //F
        return;
      }
      object->setVisible(False);            //E
    }
    static WSCfunctionRegister  op("dialogep",(void*)dialogep);
    

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

    A で、ダイアログクラスでなかった場合、イベントプロシージャを終了します。 B では、押されたボタンをチェックします。OK ボタン以外は、ダイアログを そのまま不可視化します。

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

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

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



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

    [dialog!] と表示されたボタンを押すと、ダイアログが表示され、入力した結 果が、3つのラベルに表示されます。1つ目のラベルには、ダイアログの OK、 NO、CANCEL ボタンがおされた結果、2つ目のラベルには、newvifi_003 の入 力された結果、3つ目のラベルには、newradi_006 の選択された結果を表示し ます。

    #include <WScom.h>
    #include <WSCfunctionList.h>
    #include <WSCbase.h>
    //----------------------------------------------------------
    //Function for the event procedure
    //----------------------------------------------------------
    #include <WSCdialog.h>
    #include <WSCvifield.h>
    #include <WSCradioGroup.h>
    #include <WSCvlabel.h>
    extern WSCdialog* newdial_001;
    extern WSCvifield* newvifi_003;
    extern WSCradioGroup* newradi_006;
    extern WSCvlabel* newvlab_007;
    extern WSCvlabel* newvlab_010;
    extern WSCvlabel* newvlab_011;
    
    void btnep(WSCbase* object){
      long val = newdial_001->popup();
      if (val == WS_DIALOG_OK){
         newvlab_007->setProperty(WSNlabelString,"DIALOG OK!");
      }else
      if (val == WS_DIALOG_NO){
         newvlab_007->setProperty(WSNlabelString,"DIALOG NO!");
      }else
      if (val == WS_DIALOG_CANCEL){
         newvlab_007->setProperty(WSNlabelString,"DIALOG CANCEL!");
      }
      WSCstring tmp;
      tmp = newvifi_003->getProperty(WSNlabelString);
      WSCstring tmp2;
      tmp2 << "INPUT: " << tmp;
      newvlab_010->setProperty(WSNlabelString,tmp2);
    
      val = newradi_006->getProperty(WSNvalue);
      tmp2 = "SELECT: ";
      tmp2 << val;
      newvlab_011->setProperty(WSNlabelString,tmp2);
    }
    static WSCfunctionRegister  op("btnep",(void*)btnep);
    


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


    WideStudio/MWT documents index | 目次

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