Last Update : 2007/08/xx
ユーザーがプログラムを終了させた時のラベルジャンプ先を指定しておく命令です。
onexit *label
終了処理は、下のような場面で発動します。
onexit命令を用意した場合、実際にプログラムを終了させるには、end命令を必ず呼ばなければなりません。([Ctrl]+[Alt]+[Del]キーでプロセスから強制終了させる方法しかなくなるので注意)
このonexit命令をどのような目的で利用するのかというと、たとえば下のような。
onexit命令で指定したラベルジャンプラベル先では、HSPのシステム変数iparam、wparamに以下の数値が返ってきます。
| 変数 | 説明 |
| iparam | 終了した要因 0=ユーザーの意思による通常の終了 1=システムによる終了 (Windowsのシャットダウン時) |
| lparam | <未使用> |
| wparam | 終了の割り込み処理を行ったウィンドウID値 |
なお、onexit命令の第1パラメータ相当の部分に0を指定することで、割り込み処理を一時的に停止することもできます。逆に1を指定すると再開です。
onexit 0
onexit命令を使って、終了確認ダイアログを表示するサンプルスクリプトです。
; 単なるダイアログ onexit *exit stop *exit dialog "終わりまっせー!", , "情報" end
; 確認ダイアログ onexit *exit stop *exit dialog "終了してよろしいですか?", 2, "確認" ; もし、[いいえ](stat=7)を選択したら何もせず。それ以外は[はい](stat=6) if stat = 7 : stop end
プログラムの表示位置を保存しておくサンプルスクリプトです。次回起動時の表示位置として反映させます。実行ファイルを作成する際の[起動時にメインウィンドウを非表示にする]オプションと、screen命令の画面モード[非表示ウィンドウ]の組み合わせで、スマート(?)な起動が可能。(→ HSP Tips : 起動時のちらつき防止)
; ウィンドウ表示位置の保存と反映 (by Kpan)
exist "hogehoge.txt"
if strsize != -1 {
; 前回のx座標値、y座標値を読み込む
notesel buf
noteload "hogehoge.txt"
noteget posx, 0
noteget posy, 1
}
; 画面モードを[非表示ウィンドウ]にしておくのがポイント
; 表示位置はint関数で文字を数値化
screen , 200, 200, 2, int(posx), int(posy)
onexit *exit
; 〜オブジェクト置いたり、画像を表示したり、各種処理〜
; 必ずウィンドウ非表示の解除
; こうしないと裏でプログラムが起動したままになります。
gsel 0, 1
stop
*exit
; 現在のx座標値、y座標値を保存
notesel buf
noteadd ""+ginfo(4), 0, 1
noteadd ""+ginfo(5), 1, 1
notesave "hogehoge.txt"
end
ウィンドウID1以降(HSP2の場合はウィンドウID 2以降)を用意している場合のサンプルスクリプトです。ウィンドウID0(メインウィンドウ)以外のウィンドウで終了処理が発動すると、プログラム全体が終了してしまいます。
ここでonexit命令を用意します。ラベルジャンプ先でwparam値をチェックすると、終了処理を行ったウィンドウID値が返るので、ウィンドウID0の場合は普通に終了、ウィンドウID1以降の場合はgsel命令で単純にウィンドウを非表示させます。
; ウィンドウIDの違いによる終了処理 [HSP3]
screen 2
screen 1
screen 0
onexit *exit
stop
*exit
if wparam = 1 | wparam = 2 {
dialog "ウィンドウID "+wparam+"なのでそのウィンドウを非表示に"
gsel wparam, -1
stop
}
dialog "ウィンドウID 0なのでプログラム全体で終了しちゃう"
end
!ポイント
HSPはend命令でプログラムを終了させることができますが、この時に裏ではデータの開放やら破棄やら必要な終了処理を内部で行ってます。
上のサンプルでは、メインウィンドウのウィンドウID
0がまだ存在しているので、同じ実行ファイルのウィンドウID1や2だけを終了させることはできません。gsel命令で不要なウィンドウを「非表示」にして、ユーザーにウィンドウを見えなくさせるのがポイントです。
HSP3から対応したonexit命令のサブルーチンジャンプ処理のサンプルです。プログラムの終了を[いいえ]にすると、そのまカウントアップするループ中にリターンしてカウントアップが継続します。
; サブルーチンジャンプ onexit gosub *jump repeat wait 10 title ""+count count++ loop *jump dialog "終了しますか", 2, "確認" ; [いいえ]を選択することで、ループ内にリターンする if stat = 7 : return end