EXIT トリガによる終了イベントプロシージャでダイアログを表示するにはウィンドウを閉じてアプリケーションを終了する場合、データの保存を行ったり、 終了するか否かをダイアログを表示したい場合があります。 そのような場合、WSCwindow / WSCmainWindow クラスの EXIT トリガで イベントプロシージャを使うと便利です。 WSCwindow/WSCmainWindow クラスは、 ウィンドウが不可視状態になった場合に、EXIT トリガをあげ、 アプリケーションが終了する前に、イベントプロシージャを実行する機能を 持っています。まず、WSCwindow もしくは WSCmainWindow クラスの プロパティ WSNexit を True にします。 このプロパティは、アプリケーション中のウィンドウで特にメインで用いられる ものに設定すると良いでしょう。 そしてそのウィンドウに対して、EXIT トリガでイベントプロシージャを 張り付けます。 次のような機能を持つイベントプロシージャを作ってみます。
#include "WScom.h"
#include "WSCfunctionList.h"
#include "WSCbase.h"
//----------------------------------------------------------
//Function for the event procedure
//----------------------------------------------------------
#include "WSCmessageDialog.h"
#include "WSDtimer.h"
//オブジェクトを表示しなおすタイマープロシージャ
void delayproc(unsigned char,void* ptr){
WSCbase* object = (WSCbase*)ptr;
object->setVisible(True);
}
//EXIT イベントプロシージャ本体
//終了時にダイアログを表示する。
void exit_ep(WSCbase* object){
if (object->getVisible() != False){
return;
}
WSCmessageDialog* msg = WSGIappMessageDialog(); //A
msg->setProperty(WSNwidth,500);
msg->setProperty(WSNno,True);
msg->setProperty(WSNdefaultPosition,True);
msg->setProperty(WSNlabelString,
"Exit and save data?\n If you do not want to save and exit,push NO...");
//ダイアログの表示
long ret = msg->popup(); //B
if (ret == WS_DIALOG_OK){ //OKボタンがおされた場合 C
//saving some data ...
exit(0);
}else
if (ret == WS_DIALOG_NO){ //NOボタンがおされた場合 D
exit(0);
}else
if (ret == WS_DIALOG_CANCEL){ //CANCELボタンが押された場合 E
WSGIappTimer()->addTriggerProc(delayproc,WS250MS,object);
}
}
static WSCfunctionRegister op("exit_ep",(void*)exit_ep);
A で、メッセージダイアログインスタンスを取得し、B でメッセージダイアログを
表示します。
C、D、E でダイアログの結果を判定し、OKボタンがおされたならば
C、NO ボタンがおされたならば D、
CANCEL ボタンがおされたならば E となります。
E の終了せずに再び、表示しなおす場合、
タイマーを使って、少しタイミングを送らせる必要があります。
これは、ウィンドウシステムに対し、既に画面終了イベントが
発生しているため、
そのイベントの処理が確実に処理されてから、
表示を行わなければならないからです。
![]() [終了確認ダイアログ] Document Release 2.0 For Use with Wide Studio Release 2.0, Spring 2002
|