〜 オブジェクト 〜
ラジオボタンを配置

複数の選択肢の中からいずれか1つだけをチェックできる排他的なオブジェクトに、
古いカーラジオの選曲ボタンを模したラジオボタンなるものがありますが、
比較的需要はあるだろうと思われるのにHSP標準命令1つでは配置することが出来ません。
しかし、HSP2だとobjsend命令、HSP3だとsendmsg命令でオブジェクトにメッセージを送れて、
スタイル変更「BM_SETSTYLE(=0x00F4)」と変更スタイル「BS_AUTORADIOBUTTON(=0x0009)」を、

HSP2「objsend オブジェクトID, 0x00F4, 0x09, 再描画フラグ, 1」 HSP3「sendmsg オブジェクトハンドル, 0x00F4, 0x09, 再描画フラグ」と指定すれば実現できます。

どれが選択されたかは、チェックボックスを元に作成すれば、指定変数を全チェックすれば確認できますね。 只、この自動チェック方式だと標準命令だけで複数グループを作成することができません。 複数グループとは「人」を考えた場合次の様なグループを作ることができます。 「男 or 女」「短髪 or 長髪 or 丸坊主」「メガネを掛けている or メガネを掛けていない」 同一グループ内は排他的で1つしかなり得ませんが、 別グループにチェックができても矛盾しません(というより、全グループチェックしなければ不正ですが)。 複数グループに対応させたラジオボタンを作成するにはコチラをご覧ください。 その方法であれば、手動チェック方式なのでグループ分けも自由にできますが、 ループで監視せずに選択された時にチェックするには、ボタンを元に作成しなければなりません。 ボタンを元に作成すると、HSP2の場合にジャンプ先処理からジャンプ前の処理に戻ることが難しいので、 別途、メインループでリアルタイムに処理をさせるような場合には有効な方法ではありません。 ラジオボタンが1グループしかないのであれば、自動チェック方式で問題ありませんので、 下記のモジュール命令を参考に配置してみてください。 HSP2.5だとloadlib.dllが必要になりますが、2.6以上であれば複数グループが存在する場合であっても ラジオボタンの挙動をプログラムで書くのではなく、API関数を呼び出して処理させることができます。 そのサンプルについてはコチラで紹介してますのでご覧ください。

autoradio キャプション, 保持変数
キャプションラジオボタン横に表示するテキストを指定する。
保持変数ラジオボタンのチェック状態(0:非チェック 1:チェック済)を保持する変数を指定する。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#module
#deffunc autoradio str, val
	mref caption, 32 : mref state, 17
	chkbox caption, state
	objsend stat, 0x00F4, 0x09, nonuse, 1 // ラジオボタンを配置
	return
#global

	sdim msg, 4, 10
	dim chk, 10
	msg = "赤", "緑", "青", "黄", "白", "黒", "紫", "金", "銀", "茶"
	objsize 60, 25
	pos 10, 10 : mes "好きな色は?"
	repeat 10
		pos 10, cnt * 30 + 30 : autoradio msg.cnt, chk.cnt
	loop
	pos 10, 350 : button "確認", *check
	stop

*check
	tmp = -1
	repeat 10
		if chk.cnt : tmp = cnt : break
	loop
	if tmp = -1 {
		dialog "選択されていません。", 1
	} else {
		dialog "好きな色は" + msg.tmp + "色です。"
	}
	stop

autoradio キャプション, 保持変数
キャプションラジオボタン横に表示するテキストを指定する。
保持変数ラジオボタンのチェック状態(0:非チェック 1:チェック済)を保持する変数を指定する。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#module
#deffunc autoradio str caption, var state
	chkbox caption, state
	sendmsg objinfo(stat, 2), 0x00F4, 0x09, 0 // ラジオボタンを配置
	return
#global

	sdim msg, 4, 10
	dim chk, length(msg)
	msg = "赤", "緑", "青", "黄", "白", "黒", "紫", "金", "銀", "茶"
	objsize 60, 25
	pos 10, 10 : mes "好きな色は?"
	foreach msg
		pos 10, cnt * 30 + 30 : autoradio msg.cnt, chk.cnt
	loop
	pos 10, 350 : button "確認", *check
	stop

*check
	tmp = -1
	foreach msg
		if chk.cnt : tmp = cnt : break
	loop
	if tmp = -1 {
		dialog "選択されていません。", 1
	} else {
		dialog "好きな色は" + msg.tmp + "色です。"
	}
	stop