〜 オブジェクト 〜
複数グループに対応させたラジオボタンを配置1

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

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

ラジオボタンが選択されたら手動でチェックしなければなりませんので、 ループで監視せずに選択された時にチェックするには、チェックボックスではなく、ボタンを元に作成し、 ジャンプ先ラベルで選択ボタンのみをONにする「BM_SETCHECK(=0x00F1)」を送る必要があります。

HSP2「objsend オブジェクトID, 0x00F1, OFF(=0) or ON(=1), 不使用変数(=0), 1」 HSP3「sendmsg オブジェクトハンドル, 0x00F1, OFF(=0) or ON(=1), 不使用(=0)

HSP3は大丈夫ですが、HSP2のボタンはジャンプ先から元の処理にリターンできないので、 メインループで別処理をリアルタイムで行う、と言う場合には使えません。 チェックボックスを元に作成し、変数の状態を監視するか、 「BM_GETSTATE(=0x00F2)」メッセージを送信してチェックの有無を取得してください。

HSP2「objsend オブジェクトID, 0x00F2, 0x00, 不使用変数(=0), 1」 HSP3「sendmsg オブジェクトハンドル, 0x00F2, 0x00, 不使用(=0)

下記サンプルは、ボタンを元に作成するモジュール命令になりますので、 既に書いた通り、HSP2はメインループでリアルタイムに別処理を行うことはできません。 また、HSP3版であってもモジュール内にラベルを配置し、無理矢理実現させてる部分がございますので APIを別途用いてグループ化を施したコチラのラジオボタンを作成することをオススメします。

radiobutton キャプション, グループ
キャプションラジオボタン横に表示するテキストを指定する。
グループラジオボタンのグループを整数値で指定する。

getradio 格納変数, グループ
格納変数取得したチェック状態(0:非チェック 1:チェック済 2:灰色)を格納する変数を指定する。
グループラジオボタンのグループを指定する。尚、結果はオブジェクトIDが入る(未選択なら−1)

setradio ID, 状態
ID設定するラジオボタンのオブジェクトIDを指定する。
状態チェック状態(0:非チェック 1:チェック済)を指定する。
チェック状態をONにしてもOFFにしても同一グループの他のラジオボタンはチェックが外される。

 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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
#module
#deffunc radiobutton str, int
	mref caption, 32 : mref group, 1
	if man ! -1 : dim man, 64 : memset man, 255, 64 * 4 // 管理変数を初期化
	button caption, *_
	man.stat = group
	objsend stat, 0x00F4, 0x04, nonuse, 1 // ラジオボタンを配置
	return

#deffunc getradio val, int
	mref v, 16 : mref group, 1
	v = -1
	repeat 64
		if man.cnt = group & (man.cnt ! -1) {
			objsend cnt, 0x00F2, 0x00, nonuse, 1 // 状態取得
			if stat & 0x03 : v = cnt : break
		}
	loop
	return

#deffunc setradio int, int
	mref id, 0 : mref value, 1
	repeat 64
		if man.cnt = -1 : continue
		if cnt = id {
			objsend cnt, 0x00F1, value, nonuse, 1 // 状態変更
		} else {
			if man.cnt = man.id : objsend cnt, 0x00F1, 0, nonuse, 1 // 状態変更
		}
	loop
	return
*_
	setradio stat, 1
	stop
#global

	sdim msg, 12, 5
	msg = "男", "女", "20歳未満", "20〜64歳", "65歳以上"
	objsize 200, 25
	pos 10,  10 : mes "性別"
	pos 10,  30 : radiobutton msg.0, 0
	pos 10,  60 : radiobutton msg.1, 0
	pos 10, 100 : mes "年齢"
	pos 10, 120 : radiobutton msg.2, 1
	pos 10, 150 : radiobutton msg.3, 1
	pos 10, 180 : radiobutton msg.4, 1
	pos 10, 250 : button "確認する", *check
	stop

*check
	getradio radio1, 0
	if radio1 = -1 : dialog "性別が選択されていません" : stop
	getradio radio2, 1
	if radio2 = -1 : dialog "年齢が選択されていません" : stop
	dialog "選択したのは" + msg.radio2 + "の" + msg.radio1 + "です"
	stop

radiobutton キャプション, グループ
キャプションラジオボタン横に表示するテキストを指定する。
グループラジオボタンのグループを整数値で指定する。

getradio 格納変数, グループ
格納変数取得したチェック状態(0:非チェック 1:チェック済 2:灰色)を格納する変数を指定する。
グループラジオボタンのグループを指定する。尚、結果はオブジェクトIDが入る(未選択なら−1)

setradio ID, 状態
ID設定するラジオボタンのオブジェクトIDを指定する。
状態チェック状態(0:非チェック 1:チェック済)を指定する。
チェック状態をONにしてもOFFにしても同一グループの他のラジオボタンはチェックが外される。

 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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
#module
#deffunc radiobutton str caption, int group
	button gosub caption, *_
	man.stat = group
	sendmsg objinfo(stat, 2), 0x00F4, 0x04, 0 // ラジオボタンを配置
	return

#deffunc getradio var v, int group
	v = -1
	foreach man
		if man.cnt = group {
			sendmsg objinfo(cnt, 2), 0x00F2, 0x00, 0 // 状態取得
			if stat & 0x03 : v = cnt : break
		}
	loop
	return

#deffunc setradio int id, int value
	foreach man
		if cnt = id {
			sendmsg objinfo(cnt, 2), 0x00F1, value, 0 // 状態変更(ON)
		} else {
			if man.cnt = man.id : sendmsg objinfo(cnt, 2), 0x00F1, 0, 0 // 状態変更(OFF)
		}
	loop
	return
*_
	setradio stat, 1
	return
#global

	sdim msg, 12, 5
	msg = "男", "女", "20歳未満", "20〜64歳", "65歳以上"
	objsize 100, 25
	pos 10,  10 : mes "性別"
	pos 10,  30 : radiobutton msg.0, 0
	pos 10,  60 : radiobutton msg.1, 0
	pos 10, 100 : mes "年齢"
	pos 10, 120 : radiobutton msg.2, 1
	pos 10, 150 : radiobutton msg.3, 1
	pos 10, 180 : radiobutton msg.4, 1
	pos 10, 250 : button gosub "確認する", *check
	stop

*check
	getradio radio1, 0
	if radio1 = -1 : dialog "性別が選択されていません" : return
	getradio radio2, 1
	if radio2 = -1 : dialog "年齢が選択されていません" : return
	dialog "選択したのは" + msg.radio2 + "の" + msg.radio1 + "です"
	return