HSP命令講座 <onexit命令>

Last Update : 2007/08/xx

PR HSPの書籍 『逆引き HSP3プログラミング事典 応用編』

onexit命令 (プログラム終了時の割り込み指定)

 ユーザーがプログラムを終了させた時のラベルジャンプ先を指定しておく命令です。

 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

↑TOP↑

onexit命令 サンプル (終了時の確認ダイアログ)

 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

↑TOP↑

ウィンドウID1以降の終了処理

 ウィンドウ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命令で不要なウィンドウを「非表示」にして、ユーザーにウィンドウを見えなくさせるのがポイントです。

↑TOP↑

サブルーチンジャンプ [HSP3]

 HSP3から対応したonexit命令のサブルーチンジャンプ処理のサンプルです。プログラムの終了を[いいえ]にすると、そのまカウントアップするループ中にリターンしてカウントアップが継続します。

;	サブルーチンジャンプ

	onexit gosub *jump

	repeat
		wait 10
		title ""+count
		count++
	loop

*jump
	dialog "終了しますか", 2, "確認"
;	[いいえ]を選択することで、ループ内にリターンする
	if stat = 7 : return

	end

↑TOP↑

〜HSP3 あれこれ〜
ウィンドウ | オブジェクト | ファイル | フォルダ | キーボード | マウス | メニュー | システム | 文字列 | COM | その他

Copyright © 2005-2011 ゲーム作成ソフトHSPの情報をいろいろと Let's HSP!. All rights reserved.