Wide Studio Programmer's Guide

Wide Studio Home
Up to


ユーザダイアログ



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

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 2.0

    For Use with Wide Studio Release 2.0, Spring 2002


    Wide Stuido Home | Up to

    Copyright(C) S. Hirabayashi, 1999-2002 Last modified: January 1, 2002