|
|
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など、先に定義させてから使うんですね!
ありがとうございます!
|
|