Last Update : 2007/08/xx
ユーザーがプログラムを終了させた時のラベルジャンプ先を指定しておく命令です。
onexit *label
終了処理は、タイトルバーの右側にある×ボタンを押す、タイトルバーの左側にあるアイコンをダブルクリックする、システムメニューの[閉じる]項目を選択する、キーボードの[Alt]+[F4]キーを押す、といったところで発動されます。これは、すべてのウィンドウIDで発動されます。
onexit命令を使った場合、実際にプログラムを終了させるには、必ずend命令を呼ばなければなりません。([Ctrl]+[Alt]+[Del]キーで、プロセスから強制終了させるしか方法がなくなるので注意!)
このonexit命令をどのような場面で利用するのかというと、基本的には下のようなところでしょう。
ジャンプしたラベル先では、HSPのシステム変数のiparam、wparamに以下の数値が返ってきます。
| 変数 | 説明 |
| iparam | 終了した要因が返ります。 0 = ユーザーの意思による通常の終了 1 = システムによる終了 (Windowsのシャットダウン時) |
| lparam | <未使用> |
| wparam | 終了の割り込み処理を行ったウィンドウID |
なお、onexit命令の第1パラメータ相当の部分に0を指定することで、割り込み処理を一時的に停止することもできます。逆に1を指定すると再開です。
onexit 0
終了を確認するダイアログを表示するサンプルスクリプト。
; 単なるダイアログ 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
ウィンドウID 1以降(HSP2の場合はウィンドウID 2以降)を用意している場合のサンプルスクリプトです。ウィンドウID 0(メインウィンドウ)以外のウィンドウで終了ボタン(×ボタン)を押すとプログラム全体が終了してしまいます。
ここでonexit命令を利用します。ジャンプ先でwparam値をチェックすると終了処理を行ったウィンドウIDが返るので、ウィンドウID 0の場合はend命令で普通に終了、ウィンドウ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命令でプログラムを終了させることができますが、この時に裏ではデータの開放やら破棄やら必要な終了処理を内部で行ってます。そういう処理をプログラマーが用意しなくていいのが、HSPの特徴の1つです。
上のサンプルでは、メインウィンドウのウィンドウID
0がまだ存在している以上、同じ実行ファイルのウィンドウID
1や2だけを終了させることはできません。gsel命令でウィンドウID
1や2を「非表示」にして、ユーザーにウィンドウを見えなくさせるがポイント。
HSP3から対応したonexit命令のサブルーチンジャンプ処理のサンプルです。プログラムの終了を[いいえ]にすると、そのまカウントアップするループ中にリターンしてカウントアップが継続します。
; サブルーチンジャンプ onexit gosub *jump repeat wait 10 title ""+count count++ loop *jump dialog "終了しますか", 2, "確認" ; [いいえ]を選択することで、ループ内にリターンする if stat = 7 : return end