〜 オブジェクト 〜
複数グループに対応させたラジオボタンを配置2 (要USER32.DLL)

コチラにグループ毎に分類配置するラジオボタンのサンプルを紹介しましたが、
グループ毎に排他処理を行うため、ボタンオブジェクトを基にして作成せざるを得ませんでした。
HSP2では、ボタンでリターンさせられないので、
ループ処理で何らかの監視を行いたい場合には、この方法での実現はできませんし、
リターンできるHSP3でも、モジュール内にラベルを作成する等、
見た目にダサく、作り的にも無理矢理な感が否めない仕様となってしまいます。
何より、1つのボタンを選択したら、同一グループの別ボタンは非選択にするという
ラジオボタンの挙動をモジュール内とはいえプログラムで書く必要があり、
API関数を標準命令だけで使えるようになった今、その冗長性が目に付いてしまいます。
HSP3ではwinobj命令でグループ情報を付加したラジオボタンを作成できますし、
HSP2であってもAPI関数のCreateWindow(CreateWindowEx)を呼び出して作成することができます。
HSP2.55では標準付属のloadlib.dllが必要になるものの、
バージョン2を使い続ける方でも最新の2.61を使っていれば標準命令だけでAPI関数を使えますので
問題はないことでしょう。ただ、1つ気をつけなければならないのが、HSPの標準オブジェクトではない為、
HSP2だと、clrobj命令やcls命令、screen命令等で消去することができません。
llmod.as_clrobj命令や_cls命令のようにAPI関数のSendMessageを使って削除しましょう。
下記のHSP2側サンプルでは、拡張オブジェクト作成時に拡張オブジェクトハンドルがセットされますので、
その値を用いて、_clrobj命令と同様の方法で削除する拡張オブジェクト削除命令を使用してください。
	

radiobtn キャプション, グループ開始
キャプションラジオボタン横に表示するテキストを指定する。
作成するとstatに識別番号がセットされるので、削除する場合はその値を変数に退避させること。
グループ開始ラジオボタンのグループ先頭である場合は1を、同一グループならば0または省略する。

clrxobj ハンドル
ハンドル削除する拡張オブジェクトハンドルを指定する。

 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
	ll_libload user, "user32.dll"
	ll_getproc CreateWindowEx, "CreateWindowExA", user
	ll_getproc SendMessage, "SendMessageA", user

#module
#deffunc radiobtn str, int
	mref caption, 32 : mref grstart, 1
	mref stt, 64
	mref bmscr, 67
	dim prm ,12
	name = "Button"
	ll_getptr name : ll_ret p.0
	ll_getptr caption : ll_ret p.1
	prm = 0, p, p.1, 0x50000009 + (grstart ! 0 * 0x20000), csrx, csry, bmscr.29, bmscr.30, bmscr.13, 0, bmscr.14
	ll_callfunc prm, 12, CreateWindowEx@
	pos csrx, csry + bmscr.30
	ll_ret prm : stt = prm
	return

#deffunc clrxobj int
	mref h, 0
	prm = h, 0x0010, 0, 0
	ll_callfunc prm, 4, SendMessage@
	return
#global

	color 224, 223, 227 : boxf : color
	objsize 100, 20
	pos 10, 10 : mes "グループ1"
	radiobtn "test1", 1
	radiobtn "test2"
	radiobtn "test3"
	pos 150, 10 : mes "グループ2"
	radiobtn "test4", 1
	radiobtn "test5"
	clrxobj stat // 直前の拡張オブジェクトを消してみるテスト
	radiobtn "test6"
	stop

radiobtn キャプション, グループ開始
キャプションラジオボタン横に表示するテキストを指定する。
グループ開始ラジオボタンのグループ先頭である場合は1を、同一グループならば0または省略する。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
#module
#deffunc radiobtn str caption, int grstart
	winobj "Button", caption, , 0x50000009 + (grstart ! 0) * 0x20000
	return
#global

	syscolor 15 : boxf : color
	objsize 100, 20
	pos 10, 10 : mes "グループ1"
	radiobtn "test1", 1
	radiobtn "test2"
	radiobtn "test3"
	pos 150, 10 : mes "グループ2"
	radiobtn "test4", 1
	radiobtn "test5"
	clrobj stat // 直前の拡張オブジェクトを標準命令で消してみるテスト
	radiobtn "test6"