【HSP】ラジオボタンを簡単に設置できるようにする【モジュール】

【HSP】ラジオボタンを簡単に設置できるようにする【モジュール】

初心者でも簡単に、と言ったほうっがいいのかな?
実際にスクリプトを書くときに、短く書けるようにしてみました。
Win32 API使えばすぐにできることなんですが、普段やってない人にはわからないし、記述量多くてHSPっぽくないんで、HSPっぽい文法で書けるようにしてみました。

//// ラジオボタンを設置するモジュール
#include "user32.as"
#module "radio_button"
// モジュール初期化
// rb_init
#deffunc rb_init
dim rb_value // 配列増える。各ラジオボタンにあらかじめチエックをつけるか
dim rb_id,1 // 配列増える。ラジオボタンのオブジェクトID
dim rb_many // ラジオボタンの個数
dim rb_many_ex // ラジオボタンの個数 (すべてのグループ)
dim rb_chk // ラジオボタン選択状況
dim rb_flag // 設置可能な状況かどうか
dim rb_group_many // グループの個数
dim rb_group_info,2, // 配列増える。グループごとのラジオボタンの情報 (1つめのrb_id,個数)
return
// ラジオボタンのグループの始まりを指定
// rb_start
#deffunc rb_start
if rb_flag=0 {
rb_many=0
rb_flag=1
}
return
// ラジオボタンのグループの終わりを指定
// rb_end
// stat にグループID (※) が返る
#deffunc rb_end
if rb_flag=1 {
repeat rb_many
if cnt=0 {
SetWindowLong objinfo(rb_id(rb_many_ex-rb_many+cnt),2),-16,$50000009|$20000
}
sendmsg objinfo(rb_id(rb_many_ex-rb_many+cnt),2),$F4,$9
loop
rb_group_info(0,rb_group_many)=rb_many_ex-rb_many
rb_group_info(1,rb_group_many)=rb_many
rb_group_many++
rb_flag=0
}
return rb_group_many-1
// ラジオボタンの設置
// rb_set "strings",p1
// "strings" : 表示するメッセージ
// p1=0~1 : あらかじめチェックするかどうか (1=チェック) (※)
// stat にHSP内でのオブジェクトIDが返る
#deffunc rb_set str _p1,int _p2
if rb_flag=1 {
rb_value(rb_many_ex)=_p2
chkbox _p1,rb_value(rb_many_ex)
rb_id(rb_many_ex)=stat
rb_many++
rb_many_ex++
}
return rb_id(rb_many_ex-1)
// ラジオボタンの選択項目取得
// val = rb_get(p1,p2)
// p1=0~ : グループID (※)
// p2=0~1 : 取得するタイプ (0=グループ (※) 内でのラジオボタンID (※) / 1=HSP内でのオブジェクトID)
#defcfunc rb_get int _p1,int _p2
rb_chk=-1
if (0<=_p1) & (_p1<rb_group_many) {
repeat rb_group_info(1,_p1)
sendmsg objinfo(rb_id(rb_group_info(0,_p1)+cnt),2),$F0
if stat=1 {
if _p2=0 : rb_chk=cnt : else : rb_chk=rb_id(rb_group_info(0,_p1)+cnt)
}
loop
}
return rb_chk
#global
rb_init
// ※グループ
//  ラジオボタンとは、複数の選択肢からひとつだけを
//  選択する場合に用いられるボタンです。
//  複数の選択肢の1つのまとまりのことを、ここでは
//  グループと呼んでいます。
// ※グループID
//  グループを作成するごとにそれぞれにグループIDという
//  のが与えられます。作成されたIDは rb_end 後、statに返ります。
//  設置された順に 0,1,2,3... となります。
// ※ラジオボタンID
//  グループ内で、ラジオボタンを作成するごとにそれぞれに
//  ラジオボタンIDというのが与えられます。
//  選択されていない項目のIDを取得することはできません。(仕様)
//  設置された順に 0,1,2,3... となります。
// ※あらかじめチェック
//  あらかじめチェックするのは1グループに1つの項目にしてください。
//  選択項目が 0 になっていると rb_get で -1 が返ってしまいます。
//  選択項目が 2 つ以上あると rb_get で、一番数値が小さいものが
//  返ってしまいます。

//// サンプル
objsize 100,24
rb_start
pos 0,0
rb_set "1",1
pos 100,0
rb_set "2",0
pos 200,0
rb_set "3",0
rb_end
group1=stat
pos 300,0
button gosub "チェック",*chk1
rb_start
pos 0,30
rb_set "A",1
pos 100,30
rb_set "B",0
pos 200,30
rb_set "C",0
rb_end
group2=stat
pos 300,30
button gosub "チェック",*chk2
stop
*chk1
dialog ""+rb_get(group1,0)+"の項目 (オブジェクトID:"+rb_get(group1,1)+") を選択中",,"選択中の項目"
return
*chk2
dialog ""+rb_get(group2,0)+"の項目 (オブジェクトID:"+rb_get(group2,1)+") をを選択中",,"選択中の項目"
return

※各命令/関数の使い方はスクリプト参照
複数のグループを作成することも可能です。
デフォルトでチェックつけたり選択項目取得も可能。(っていうかこれないと意味ないし)
pos でラジオボタンの位置指定も可能。
objsize でラジオボタンのサイズ変更も可能。
ラジオボタンはチェックボックスの拡張版みたいなものなので、ほかにもいろいろ操作できるかもしれないけど、
予想してないから、上記以外のことしてバグっても知りません。
チェックボックスと違って変数の指定は不可能。(っていうか変数でやろうとしてもラジオボタンだとうまくいかなかった…orz)
2つの命令で挟んだりpos等の命令で設置前に大きさ/位置を指定できるのがHSPらしくて良い (?) と思います。
チェックの状況を設置時に指定してるのはHTMLでの設置方法のパロディ (?) 。
選択項目の取得方法が二種類あるのは、数値で管理するんだったら各グループ内での数値にしたほうがやりやすいし、オブジェクトの内容の取得と化をする場合にはオブジェクトIDがわかってるほうがやりやすいだろうと思ったからです。
他にも要望があったら改造するかも。
では。今日はこの辺で。
↓クリックしてね~


「【HSP】ラジオボタンを簡単に設置できるようにする【モジュール】」への2件のフィードバック

  1. おお! これは便利ですね^^!
    ラジオボタン作るのにいちいちうだうだ書かなければならず、
    面倒だったので非常に助かります。
    機会があれば使わせてもらうかも知れません。

  2. どうもありがとうございます!!
    お役にたててうれしいです!
    ゲームの設定用のファイルとかで使えますよね。(東方で言う環境カスタムプログラム)

コメントは受け付けていません。