| Programming Guide | WideStudio/MWT Index Table of contents |
EXIT 트리거(trigger)에의한 종료 이벤트 프로시저에서 대화 상자를 표시하기에는
윈도우를 닫고 응용프로그램을 종료하는 경우 데이터의 저장을 실행하고나 종료할가 말가를 대화 상자로 표시할 경우가 있습니다. 그럴 경우 WSCwindow / WSCmainWindow 클래스의 EXIT 트리거(trigger)로 이벤트 프로시저 를 이용하면 변리합니다. WSCwindow/WSCmainWindow 클래스는 윈도우가 불가시 상태에된 경우에 EXIT 트리거(trigger)를 불러 응용프로그램가 종료하기 전에 이벤트 프로시저를 실행할 기능을 가지고있습니다.
먼저 WSCwindow 혹은 WSCmainWindow 클래스의 속성 "exit"을 True 로 합니다. 이 속성은 응용프로그램중의 윈도우에서 특히 메인로 이용되는것에 설정하면 좋을것입니다. 그래서 그 윈도우에 대해서 EXIT 트리거로 이벤트 프로시저를 붙여놓습니다.
다음과 같은 기능을 가지는 이벤트 프로시저를 만들어봅시다.
종료할가 말가의 대화 상자를 표시. [OK]가 선택된 경우는 처리를 실행해서 종료. [NO]가 선택된 경우는 처리를 안하고 종료. [CANCEL]가 선택된 경우는 처리를 안하고 종료도 안함. (*----------------------------------------------------------*) (*Function for the event procedure *) (*----------------------------------------------------------*) open Swig open Mwt open Mwtlib let timer = ref C_void let target = ref C_void (* オ객체를 다시 표시하는 타이머 프로시저 *) let delayproc obj = if (get_int (!target) <> 0) then ignore(!target -> setVisible ( _True)); () let _ = Callback.register "delayproc" delayproc (* EXIT 이벤트 프로시저본체 *) (* 종료시에는 대화 상자를 표시한다. *) let exit_ep obj = (* do something...*) if get_int (obj -> getVisible()) = get_int _False then let msg = _WSGIappMessageDialog '() in begin (* A *) msg -> setProperty ( "width", 500); msg -> setProperty ( "no", _True); msg -> setProperty ( "defaultPosition", _True); msg -> setProperty ( "labelString", "Exit and save data?\n If you do not want to save and exit,push NO..."); end; (* 대화 상자의 표시 *) let ret = msg -> "popup"() in begin (* B *) (* 첫 번째 실행시, 타이머를 작성 *) if (timer = ref C_void) then let parent = obj -> getParentWindow () in begin timer := new_WSCvtimer ( C_list [parent; C_string "timer"]); let _ = Callback.register "timer" !timer in !timer -> init (); !timer -> setProperty ( "interval", 250 ); !timer -> setProperty ( "cont", _False ); !timer -> addProcedure ( "delay-prop", "delayproc",_WSEV_ACTIVATE ); end; if ( get_int ret = get_int _WS_DIALOG_OK ) then (* OK 단추가 눌린 경우 C *) (* saving some data ... *) exit 0; if ( get_int ret = get_int _WS_DIALOG_NO) then (* NO 단추가 눌린 경우 D *) exit 0; if ( get_int ret = get_int _WS_DIALOG_CANCEL) then begin (* CANCEL 단추가 눌린 경우 E *) target := obj; ignore(!timer -> setProperty ( "running", _True)); (* 타이머를 기동 *) end; end; () let _ = Callback.register "exit_ep" exit_epA 에서 메시지 대화 상자 인스턴스를 취득해서 B 에서 메시지 대화 상자를 표시합니다.
C,D,E 에서 대화 상자의 결과를 판정해서 OK 단추가 눌렸으면 C, NO 단추가 눌렸으면 D, CANCEL 단추가 눌렸으면 E 로 됩니다.
E 의 종료안하고 다시 표시할 경우, 타이머를 쓰고, 좀 타이밍을 늦출필요가 있습니다. 이것은 윈도우 시스템에 대해 미리 화면종료 이벤트가 발생하고있으므로 그 이벤트의 처리가 확실히 처리되였다가 표시를 실행햐여야하기때문입니다.
[ 종료 확인 대화 상자]
| Copyright(C) WideStudio/MWT Development Team, 1999-2005 | Last modified: Jul 31, 2005 |