| 
					 
							
													 
							
						 
						
 
 | 
 | 
 
2018/5/9(Wed) 00:24:46|NO.84295 
タブコントロールを設置していて 
それぞれのページにあるラジオボタンの状態取得をしたいです。 
タブ1、タブ2、タブ3があって、タブ1に5個のラジオボタングループが 
2つあり タブ2にラジオボタン一つだけ タブ3にラジオボタン3個があります
 
そこで http://lhsp.s206.xrea.com/hsp_object1.htmlに乗っていた
  
	repeat 5, 0
		sendmsg objinfo(cnt, 2), $F0
		if stat : mes cnt
	loop
 
を使って取得しようとしたんですがこの文の二行目で 
「パラメータの値が異常です」というエラーが出てしまいます 
全く原因がわからないので自分がキレイにコードをかけないということもあって 
必要箇所だけ抜き出して別のとこでテストしてみたら普通にできました。 
そして色々テストしてみたのですが全く持ってわからず、 
自分は「タブコントロールの設置が原因なのではないか」という風に思っています
 
実際はわかりませんが、このエラーを治す方法(タブとラジオボタンの併用)を教えてください
  
 |   
  
 
 | 
 | 
 
2018/5/9(Wed) 15:05:14|NO.84296 
おそらくobjinfoが原因です。 
 
 
タブコントロールの実装方法が不明ですが、もしかしてbgscrを利用していないでしょうか。 
この場合、オブジェクトIDは画面ごとに0・1・・・と数えますので、存在しないオブジェクトの情報を参照してエラーとなります。 
対処としてはラジオボタン作成時にオブジェクトハンドルを取得し、配列変数などで管理するのが簡単です。 
もしくは、毎回gselで操作先を切り替えるという手もあります。 
 
 
外していたらすいません。 
 
 |   
  
| 
 | 
 
2018/5/9(Wed) 16:29:25|NO.84297 
そうです!bgscrを利用しています! 
つまり、タブ1のラジオボタン取得に
  
	repeat 5, 0
		sendmsg objinfo(cnt, 2), $F0
		if stat : mes cnt
	loop
	repeat 5, 5
		sendmsg objinfo(cnt, 2), $F0
		if stat : mes cnt
	loop
 
タブ2に
  
	repeat 1, 0
		sendmsg objinfo(cnt, 2), $F0
		if stat : mes cnt
	loop
 
タブ3に
  
	repeat 3, 0
		sendmsg objinfo(cnt, 2), $F0
		if stat : mes cnt
	loop
 
を利用すればよいということでしょうか?
  
 |   
  
| 
 | 
 
2018/5/10(Thu) 00:06:35|NO.84307 
吹雪さんの説明でほぼあってるのですが、まずはタブコントロールを正しく理解する必要があります。 
http://lhsp.s206.xrea.com/hsp_object6.html#1
76行目からをこのように書き換えてみてください。 
それぞれのタブでginfo_selを表示しているだけです。
  
	InsertTab "AAA"
;		bgscr命令上にオブジェクトを置く感覚で処理を書きます。
		pos 50, 50 : mes "A"
		mes "ginfo_sel=" + ginfo_sel
		button gosub "btn", *notify
		mes "btn_id = " + stat
	InsertTab "BBB"
		pos 50, 50 : mes "B"
		mes "ginfo_sel=" + ginfo_sel
		button gosub "btn", *notify
		mes "btn_id = " + stat
	InsertTab "CCC"
		pos 50, 50 : mes "C"
		mes "ginfo_sel=" + ginfo_sel
		button gosub "btn", *notify
		mes "btn_id = " + stat
;	bgscr命令ウィンドウのID値「4」が使われます。
	InsertTab "DDD"
		pos 50, 50 : mes "D"
		mes "ginfo_sel=" + ginfo_sel
		button gosub "btn", *notify
		mes "btn_id = " + stat
 
操作先ウィンドウIDとボタンのオブジェクトIDに注目してください。 
つまりタブはタブ1個1個がウィンドウだということです。見た目が違うので違和感があると思いますが…。
 
対策としては、各タブのウィンドウIDを取得。
  
	InsertTab "BBB"
		gid = ginfo_sel
		button gosub "ボタン",*hogehoge
		sendmsg objinfo(stat, 2), $F4, $3
		…
 
各タブ上のオブジェクトを指定する場合は、操作先を各タブのウィンドウIDで指定してからobjinfo。
  
	gsel gid,0
	repeat 5
		sendmsg objinfo(cnt, 2), $F0
		if stat : dialog ""+cnt
	loop
 
>> NO.84297
そのスクリプトはタブ1,2,3で違いがあるでしょうか? 
リピート回数は違いますが1つを除いて残り3つは全てCNTが0から始まります。この点だけを見ても区別がつかない事がわかります。
  
 
  |    |   
  
| 
 | 
 
2018/5/11(Fri) 21:54:43|NO.84316 
やっと少し理解できたかもしれない... 
 
つまりタブコントロールのタブはそれぞれ別のウインドウで、 
そのウインドウIDをgselで指定すれば吹雪さんが言っていたように 
repeat文をそれぞれのラジオボタンに指定できるということですか? 
 
 |   
  
| 
 | 
 
2018/5/11(Fri) 22:48:26|NO.84318 
> つまりタブコントロールのタブはそれぞれ別のウインドウで、 
> そのウインドウIDをgselで指定すれば吹雪さんが言っていたように 
お、もう一息っぽいですね。 
ちなみに 
 
> この場合、オブジェクトIDは画面ごとに0・1・・・と数えますので 
ここの「画面」はウィンドウやタブの1つ1つを指します。 
 
> repeat文をそれぞれのラジオボタンに指定できるということですか? 
repeat〜loop命令はループを作って処理を繰り返し行わせるだけのものですよ。なにかに指定して使うものではありません。 
うーん。repeat〜loop命令をなにか誤解している気がする…一度repeat〜loop命令を使わずに書いてみたほうがいいと思いますよ。 
あるいはrepeat〜loop命令のマニュアル読み直しや、repeat〜loop命令のサンプルを検索してみることをお勧めします。 
 
 |   
  
| 
 | 
 
2018/5/12(Sat) 00:25:05|NO.84321 
でもいまいち確証的なことがわかりません.... 
 
ginfo_selの意味とボタン設置の意味など 
調べてみたのですがわかりませんでした.... 
 
あとrepeat文に指定できるという言い方は語弊がありました 
ラジオボタンを取得するときにgselでIDを指定できるということですか 
 
 |   
  
| 
 | 
 
2018/5/12(Sat) 01:59:48|NO.84322 
ちょっと考えすぎになってきた感がありますね。 
 
プログラムを1つの学校みたいに考えてください。 
 
○年△組というクラスの教室をウィンドウID 
生徒1人1人が各オブジェクト 
出席番号がオブジェクトID 
 
みたいな例えで考えると多少わかりやすい……ですか? 
 
全てのクラスに出席番号1番の生徒がいますが、 
同じ出席番号だといっても、その生徒達はまったくの別人ですよね。 
 
 
 
学校の例えで言うなら 
ginfo_selというのは今いる教室 
gselは今いる教室から別の教室への移動に使うものです。 
 
1年1組(生徒数30人)の教室で出席番号33番(1年2組3番)の生徒を呼んでも 
誰も反応しません。 
これが「パラメータの値が異常です」というエラーの原因です。 
 
1年2組3番を呼びたければ 
gselで1年2組に移動してから3番を探してください。 
 
 
これはあくまでも例えなので若干違う所もありますが、 
だいたいそんな感じでイメージしてください。 
 
 |   
  
| 
 | 
 
2018/5/12(Sat) 17:41:53|NO.84335 
なるほど!とても分かりやすいです! 
 
あと「button gosub "ボタン",*hogehoge」は 
どういう役割なのでしょうか? 
 
 |   
  
| 
 | 
 
2018/5/12(Sat) 19:33:58|NO.84339 
すみません代表的なオブジェクトのつもりでついbuttonを使ってしまいました。 
ラジオボタンの質問なんだからchkbox 使ったほうが良かったですね。 
 
 |   
  
| 
 | 
 
2018/5/13(Sun) 11:30:30|NO.84355 
button自体に意味はないということでしょうか? 
 
gid = ginfo_sel
gsel gid,2
	repeat 5,0
		chkbox "a",tekitou
		sendmsg objinfo(stat, 2), $F0
		if stat : dialog ""+cnt
	loop
	repeat 5,5
		chkbox "a",tekitou
		sendmsg objinfo(cnt, 2), $F0
		if stat : dialog ""+cnt
	loop
 
としてみたのですがエラーは起きませんでしたが 
その代わり何も起きませんでした ダイアログなど一切変化がありません
 
IDが間違えているのかと思いましたがGENKIさんがくださった 
コードでテストしてみると「ginfo_sel=2」と表示されていました
 
あとこのchkboxを(buttonでも)設置しておかないといつも通り 
エラーが出ます。このオブジェクトにどのような意味があるのか?とはそういうことです
 
もしかしたらコードが悪いかもしれないので少し改変したものをすべて載せます
  
#module
#include "user32.as"
#func GetWindowLong "GetWindowLongA" int,int
#func GetClientRect "GetClientRect" int, int
#func SetWindowLong "SetWindowLongA" int, int, int
#func SetParent "SetParent" int, int
#uselib "gdi32"
#cfunc GetStockObject "GetStockObject" int
#deffunc CreateTab int p1, int p2, int p3, int p4
	winobj "systabcontrol32", "", , $52000000 | p4, p1, p2
	hTab = objinfo(stat, 2)
	sendmsg hTab, $30, GetStockObject(17)
	TabID = p3
	if TabID = 0 : TabID = 1
	dim rect, 4
	return hTab
#deffunc InsertTab str p2
	pszText = p2 : tcitem = 1, 0, 0, varptr(pszText)
	sendmsg hTab, $1307, TabItem, varptr(tcitem)
	GetClientRect hTab, varptr(rect)
	sendmsg hTab, $1328, , varptr(rect)
bgscr TabID + TabItem, rect.2 - rect.0, rect.3 - rect.1, 2, rect.0, rect.1
	SetWindowLong hwnd, -16, $40000000
	SetParent hwnd, hTab
	TabItem++
	return
#deffunc ChangeTab
	gsel wID + TabID, -1
	sendmsg hTab, $130B
	wID = stat
	gsel wID + TabID, 1
	return
#global
	screen , 410, 245
	syscolor 15 : boxf
	CreateTab 410, 245, 1
	hTabControl = stat
		gid = ginfo_sel
	InsertTab "a"
	InsertTab "b"
objsize 80,23
pos 120,75
	x1 = 1
	chkbox "x1", x1
	SetWindowLong objinfo(stat, 2), -16, $50000009 | $20000
	chkbox "x2", x2
	sendmsg objinfo(stat, 2), $F4, $9
	chkbox "x3", x3
	sendmsg objinfo(stat, 2), $F4, $9
	chkbox "x4", x4
	sendmsg objinfo(stat, 2), $F4, $9
	chkbox "x5", x5
	sendmsg objinfo(stat, 2), $F4, $9
;	2番目のグループ
;	これにより、上とは別動作になるのであーる
	pos 220,75
	y1 = 1
	chkbox "y1", y1
	SetWindowLong objinfo(stat, 2), -16, $50000009 | $20000
	chkbox "y2", y2
	sendmsg objinfo(stat, 2), $F4, $9
	chkbox "y3", y3
	sendmsg objinfo(stat, 2), $F4, $9
	chkbox "y4", y4
	sendmsg objinfo(stat, 2), $F4, $9
	chkbox "y5", y5
	sendmsg objinfo(stat, 2), $F4, $9
objsize 60,20
pos 330,198
button "Apply",*bApply
;-------------------------------------------------------------------------Pack Tab
	InsertTab "c"
	p1 = 1
	chkbox "p1", p1
	SetWindowLong objinfo(stat, 2), -16, $50000009 | $20000
objsize 60,20
pos 330,198
button "Apply",*cApply
;----------------------------------------------------------------------------Other Tab
	InsertTab "d"
	o1 = 1
	chkbox "o1", o1
	SetWindowLong objinfo(stat, 2), -16, $50000009 | $20000
		chkbox "o2", o2
	sendmsg objinfo(stat, 2), $F4, $9
		chkbox "o3", o3
	sendmsg objinfo(stat, 2), $F4, $9
objsize 60,20
pos 330,198
button "Apply",*dApply
;--------------------------------------------------------------------------Credit Tab
	InsertTab "e"
	
	InsertTab "f"
	gsel 1, 1
	gsel
	oncmd gosub *notify, $4E
	stop
*notify
	dupptr nmhdr, lparam, 12
	if nmhdr.0 = hTabControl & nmhdr.2 = -551 {
		ChangeTab
		gsel
	}
	return
;-----------------------------------------NoRecoil Apply
*bApply
gsel gid,2
	repeat 5,0
		chkbox "a",iu
		sendmsg objinfo(stat, 2), $F0
		if stat : dialog ""+cnt
	loop
	repeat 5,5
		chkbox "a",iu
		sendmsg objinfo(cnt, 2), $F0
		if stat : dialog ""+cnt
	loop
;-----------------------------------Pack Apply
*cApply
gsel gid,3
	repeat 1
		sendmsg objinfo(cnt, 2), $F0
		if stat : dialog ""+cnt
	loop
stop
*dApply
gsel gid,4
	repeat 3
		sendmsg objinfo(cnt, 2), $F0
		if stat : dialog ""+cnt
	loop
stop
 
実行してみれば自分と全く同じ環境になると思います...
  
 
  |    |   
  
| 
 | 
 
2018/5/13(Sun) 21:22:07|NO.84377 
gselの使い方が間違ってますね。 
それとginfo_selを使うタイミングも違います。
 
ボタンで飛んだあと 
*bApply 
*cApply 
*dApply 
の全ての最初のgselの使い方が間違ってます。
 
*bApply 
に至っては、ループ内でチェックボックスを作るという 
コピペしたんだろうなぁ……というものもあり。 
更に最後のstopが抜けています。
 
*cApply 
では1回だけならループしなくてもいいでしょう。
 
とりあえずコメントで追加・修正・削除と書いたところを見てください。
  
#module
#include "user32.as"
#func GetWindowLong "GetWindowLongA" int,int
#func GetClientRect "GetClientRect" int, int
#func SetWindowLong "SetWindowLongA" int, int, int
#func SetParent "SetParent" int, int
#uselib "gdi32"
#cfunc GetStockObject "GetStockObject" int
#deffunc CreateTab int p1, int p2, int p3, int p4
	winobj "systabcontrol32", "", , $52000000 | p4, p1, p2
	hTab = objinfo(stat, 2)
	sendmsg hTab, $30, GetStockObject(17)
	TabID = p3
	if TabID = 0 : TabID = 1
	dim rect, 4
	return hTab
#deffunc InsertTab str p2
	pszText = p2 : tcitem = 1, 0, 0, varptr(pszText)
	sendmsg hTab, $1307, TabItem, varptr(tcitem)
	GetClientRect hTab, varptr(rect)
	sendmsg hTab, $1328, , varptr(rect)
bgscr TabID + TabItem, rect.2 - rect.0, rect.3 - rect.1, 2, rect.0, rect.1
	SetWindowLong hwnd, -16, $40000000
	SetParent hwnd, hTab
	TabItem++
	return
#deffunc ChangeTab
	gsel wID + TabID, -1
	sendmsg hTab, $130B
	wID = stat
	gsel wID + TabID, 1
	return
#global
	screen , 410, 245
	syscolor 15 : boxf
	CreateTab 410, 245, 1
	hTabControl = stat
		gid = ginfo_sel			// 不要
	InsertTab "a"
	InsertTab "b"
objsize 80,23
pos 120,75
	x1 = 1
	gid_b = ginfo_sel;			// 追加
	chkbox "x1", x1
	SetWindowLong objinfo(stat, 2), -16, $50000009 | $20000
	chkbox "x2", x2
	sendmsg objinfo(stat, 2), $F4, $9
	chkbox "x3", x3
	sendmsg objinfo(stat, 2), $F4, $9
	chkbox "x4", x4
	sendmsg objinfo(stat, 2), $F4, $9
	chkbox "x5", x5
	sendmsg objinfo(stat, 2), $F4, $9
;	2番目のグループ
;	これにより、上とは別動作になるのであーる
	pos 220,75
	y1 = 1
	chkbox "y1", y1
	SetWindowLong objinfo(stat, 2), -16, $50000009 | $20000
	chkbox "y2", y2
	sendmsg objinfo(stat, 2), $F4, $9
	chkbox "y3", y3
	sendmsg objinfo(stat, 2), $F4, $9
	chkbox "y4", y4
	sendmsg objinfo(stat, 2), $F4, $9
	chkbox "y5", y5
	sendmsg objinfo(stat, 2), $F4, $9
objsize 60,20
pos 330,198
button goto "Apply",*bApply		// 念のためgotoを追加
;-------------------------------------------------------------------------Pack Tab
	InsertTab "c"
	p1 = 1
	gid_c = ginfo_sel;			// 追加
	chkbox "p1", p1
	SetWindowLong objinfo(stat, 2), -16, $50000009 | $20000
objsize 60,20
pos 330,198
button goto "Apply",*cApply		// 念のためgotoを追加
;----------------------------------------------------------------------------Other Tab
	InsertTab "d"
	o1 = 1
	gid_d = ginfo_sel;			// 追加
	chkbox "o1", o1
	SetWindowLong objinfo(stat, 2), -16, $50000009 | $20000
		chkbox "o2", o2
	sendmsg objinfo(stat, 2), $F4, $9
		chkbox "o3", o3
	sendmsg objinfo(stat, 2), $F4, $9
objsize 60,20
pos 330,198
button goto "Apply",*dApply		// 念のためgotoを追加
;--------------------------------------------------------------------------Credit Tab
	InsertTab "e"
	
	InsertTab "f"
	gsel 1, 1
	gsel
	oncmd gosub *notify, $4E
	stop
*notify
	dupptr nmhdr, lparam, 12
	if nmhdr.0 = hTabControl & nmhdr.2 = -551 {
		ChangeTab
		gsel
	}
	return
;-----------------------------------------NoRecoil Apply
*bApply
;gsel gid,2			// 修正
gsel gid_b
	repeat 5,0
		;chkbox "a",iu							// 削除
		;sendmsg objinfo(stat, 2), $F0			// 修正
		sendmsg objinfo(cnt, 2), $F0
		if stat : dialog ""+cnt
	loop
	repeat 5,5
		;chkbox "a",iu							// 削除
		sendmsg objinfo(cnt, 2), $F0
		if stat : dialog ""+cnt
	loop
stop											// 追加
;-----------------------------------Pack Apply
*cApply
;gsel gid,3			// 修正
gsel gid_c
	repeat 1
		sendmsg objinfo(cnt, 2), $F0
		if stat : dialog ""+cnt
	loop
stop
*dApply
;gsel gid,4			// 修正
gsel gid_d
	repeat 3
		sendmsg objinfo(cnt, 2), $F0
		if stat : dialog ""+cnt
	loop
stop
 
 
 
  |    |   
  
| 
 | 
 
2018/5/15(Tue) 09:03:29|NO.84402 
なるほど!gid_bなど、先に定義させてから使うんですね! 
 
ありがとうございます! 
 
 |   
  
					 |