HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2018
0509
AIAタブの場所が違うラジオボタンの取得12未解決


AIA

リンク

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で操作先を切り替えるという手もあります。


外していたらすいません。



AIA

リンク

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
を利用すればよいということでしょうか?



GENKI

リンク

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から始まります。この点だけを見ても区別がつかない事がわかります。



AIA

リンク

2018/5/11(Fri) 21:54:43|NO.84316

やっと少し理解できたかもしれない...

つまりタブコントロールのタブはそれぞれ別のウインドウで、
そのウインドウIDをgselで指定すれば吹雪さんが言っていたように
repeat文をそれぞれのラジオボタンに指定できるということですか?



GENKI

リンク

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命令のサンプルを検索してみることをお勧めします。



AIA

リンク

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番を探してください。


これはあくまでも例えなので若干違う所もありますが、
だいたいそんな感じでイメージしてください。



AIA

リンク

2018/5/12(Sat) 17:41:53|NO.84335

なるほど!とても分かりやすいです!

あと「button gosub "ボタン",*hogehoge」は
どういう役割なのでしょうか?



GENKI

リンク

2018/5/12(Sat) 19:33:58|NO.84339

すみません代表的なオブジェクトのつもりでついbuttonを使ってしまいました。
ラジオボタンの質問なんだからchkbox 使ったほうが良かったですね。



AIA

リンク

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



AIA

リンク

2018/5/15(Tue) 09:03:29|NO.84402

なるほど!gid_bなど、先に定義させてから使うんですね!

ありがとうございます!



ONION software Copyright 1997-2021(c) All rights reserved.