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


HSPTV!掲示板


未解決 解決 停止 削除要請

2011
1109
あうあうタブとリストボックスの組み合わせ4解決


あうあう

リンク

2011/11/9(Wed) 18:47:12|NO.42890

Kpan氏のサイト「Let's HSP!」にあったタブモジュールと複数項目選択可能なリストボックスを組み合わせて、
タブの中のリストボックスをクリックすると、その項目が表示されるようにしたいのですが、うまくいきませんでした。
oncmd gosub *command, $111やlparam、wparamなどが原因かと思って、
ウィンドウズメッセージも調べてみましたが、わかりませんでした。
どなたか解る方おねがいいたします。



#module #uselib "user32" #func GetClientRect "GetClientRect" int, int #func SetWindowLong "SetWindowLongA" int, int, int #func SetParent "SetParent" int, int #uselib "gdi32" #cfunc GetStockObject "GetStockObject" int ; CreateTab p1, p2, p3, p4 ; タブコントロールを設置します。statにタブコントロールのハンドルが ; 返ります。 ; p1〜p2=タブコントロールのX/Y方向のサイズ ; p3(1)=タブの項目として貼り付けるbgscr命令の初回ウィンドウID値 ; p4=タブコントロールの追加ウィンドウスタイル #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 ; InsertTab "タブつまみ部分の文字列" ; タブコントロールに項目を追加します。 #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 // ================================================== #include "gdi32.as" #define ctype HIWORD(%1) (%1 >> 16 & $FFFF) oncmd gosub *command, $111 // タブ表示 gsel 0 pos 200,0 CreateTab 200, 300, 1 hTabControl = stat InsertTab " 1 " gosub *listbox_1 InsertTab " 2 " gosub *listbox_2 gsel 1, 1 gsel oncmd gosub *notify, $4E stop *notify dupptr nmhdr, lparam, 12 if nmhdr.0 = hTabControl & nmhdr.2 = -551 { ChangeTab gsel } return // 複数選択listbox *listbox_1 winobj "listbox", "", $200, $50200001 | $8, 100, 100 hListbox = objinfo(stat, 2) GetStockObject 17 sendmsg hListbox, $30, stat sendmsg hListbox, $180, , "aaa" sendmsg hListbox, $180, , "bbb" sendmsg hListbox, $180, , "ccc" return *listbox_2 winobj "listbox", "", $200, $50200001 | $8, 100, 100 hListbox = objinfo(stat, 2) GetStockObject 17 sendmsg hListbox, $30, stat sendmsg hListbox, $180, , "ddd" sendmsg hListbox, $180, , "eee" sendmsg hListbox, $180, , "fff" return // クリック *command if lparam = hListbox { if HIWORD(wparam) = 1 { sendmsg hListbox, $190 mes "項目数: "+stat+"コ" sendmsg hListbox, $18B repeat stat sendmsg hListbox, $187, cnt if stat { mes " 項目: " + cnt } loop return } return }



この記事に返信する


Cookies

リンク

2011/11/9(Wed) 20:34:23|NO.42895

回答者のために、Let's HSP!の該当URLを載せてほしかった…と思うのは私だけでしょうかね。

タブコントロール: http://lhsp.s206.xrea.com/hsp_object6.html#1
複数選択可能リストボックス: http://lhsp.s206.xrea.com/hsp_object4.html#2
蛇足ですが、Let's HSP!トップにあるGoogle検索、使えませんね。


さて、まず注意から言わせてもらうと
oncmd gosub *command, $111とgosub指定しているにもかかわらず、
*commandラベル内で、returnを通らないルート(一つ目のifで偽)を作るのはやめたほうがいいですよ。
returnされないと、ウィンドウが固まることがあります。

oncmd gosub *c, $111 listbox a,,"a\nb" stop *c //stop //コメントアウトを外すと、たぶん固まります。 return




さて、本題ですね。

このタブモジュールは、本ウィンドウとは別にウィンドウを作成して、
それを表示させたり非表示にしたりして実現させています。(cf.ChangeTab命令)
oncmdはその時点での操作先ウィンドウに対してのみ効果を発揮するので、
スクリプトの初めに行ってもID0のウィンドウしか効果が出ません。

CreateTab命令の第三引数(タブの項目として貼り付けるbgscr命令の初回ウィンドウID値)は
「1」とされていますので
1つめのタブはID1のウィンドウ、2つめのタブはID2のウィンドウが実際です。

listboxたちはこのID1,ID2のウィンドウにWM_COMMANDを送りますので、
oncmdをその二つのウィンドウにもしてやらなければなりません。
それぞれのInsertTabを実行した後に

oncmd gosub *command, $111
としてやるのがいいかと思います。



それからリストボックスが二つ作られていますが、
どちらのウィンドウハンドルも"hListbox"という同じ変数に入ってます。
二番目のリストボックス作成時に
一番目のウィンドウハンドルを入れてる変数を上書きしちゃってるので、
あとから一番目のリストボックスを操作することができません。
それぞれ別の変数に入れるようにしてください。

すると*commandラベルの分岐等も変わってくるでしょう。



あうあう

リンク

2011/11/9(Wed) 22:45:37|NO.42897

>Cookiesさん
すいません。URLものせたほうがよかったですね。

最後のreturnが切れてました。
注意してくれて、ありがとうございます。

ウィンドウとoncmdの関係が理解できました。
2つ目のリストボックスはハンドルをhListbox2にして、もう一つクリックしたときの
条件を付け足すことで出来ました。
ていねいに教えてくれて、ありがとうございました。とても解りやすかったです。



KA

リンク

2011/11/10(Thu) 00:03:56|NO.42898

解決しているので、どうでも良いですが

「うまくいきませんでした。」

では無くて、「どういう風に」うまく出来なかった
と書く様にしましょう。 回答者は、どこが仕様な
のか問題点なのか悩んでしまいます。



あうあう

リンク

2011/11/10(Thu) 21:59:50|NO.42917

>KAさん
すいません。
「タブとリストボックスは表示されますが、リストボックスの項目をクリックしても何も起きませんでした。」
のように書いたほうがよかったですね。これから気をつけます。
ありがとうございました。



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