| WideStudio Programming Guide | WideStudio Index Table of contents

> ## 사용자 대화 상자

> ### 간단한 사용자 대화 상자의 작성

> 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 트리거(trigger)로 이벤트 프로시저를 붙여놓습니다. 이 이벤트 프로시저는 대화 상자에 정확히 입력되였는가를 체크하고 입력이 안되였더라면 메시지 대화 상자로 오류를 표시합니다.

>     #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 메서드에 접근(Access)해서 눌리운 단추의 종류를 조사하기위해서 입니다.
> A 에서 대화 상자 클래스아닌 경우 이벤트 프로시저를 종료합니다. B 에서는 눌리운 단추를 체크합니다. OK 단추외는 대화 상자를 그대로 불가시화합니다.
> C 는 newvifi_003 에 입력되여있는가를 체크합니다. 입력안되여있는 경우는 D 에서 메시지 대화 상자를 표시해서 종료합니다. E 에서 newradi_006 이 선택되여있는가 체크합니다. 선택안되여있는 경우는 F 로 메시지 대화 상자를 표시해서 종료합니다.
> 다음에 E 에서 입력이 정확한 경우에는 대화 상자를 불가시화합니다. 이 때 이 대화 상자를 불가시화함으로서 이 대화 상자를 불러놓은 popup 메서드가 복귀합니다. 따라서 불가시화 안한 경우, 대화 상자가 종료안합니다.
> 다음에는 대화 상자를 부러놓은 이벤트 프로시저의 예입니다.

> [사용자 대화 상자를 불러놓은 화면의 예]
> [dialog!] 라고 표시된 단추를 누르면 대화 상자가 표시되여 입력한 결과가 3개의 라벨에 표시됩니다. 첫째 라벨에는 대화 상자의 OK,NO,CANCEL 단추가 누러진 결과. 둘째 라벨에는 newvifi_003 에 입력된 결과. 셋째 라벨에는 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.70 for WideStudio ver 3.70, May 2004

WideStudio documents index | Table of contents

Copyright(C) WideStudio Development Team, 1999-2004 | Last modified: May 25, 2004