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


HSPTV!掲示板


未解決 解決 停止 削除要請

2012
1002
BLUENOIR-Zwei-chkbox2.asについての質問です15解決


BLUENOIR-Zwei-

リンク

2012/10/2(Tue) 14:23:47|NO.49689

ここの掲示板の過去スレにあった下のモジュールを使ってチェックボックスにチェックが入ったら電卓を起動するツールを作っています。

ですが、このモジュールだとチェックボックスの□の部分をクリックした時しか起動してくれません。

文字のところをクリックしても起動するようにするにはどうすればよいでしょうか?


chkbox2.as


#uselib "gdi32" #cfunc GetStockObjectChk2 "GetStockObject" int #func GetObjectAChk2 "GetObjectA" int,int,var #cfunc CreateFontIndirectAChk2 "CreateFontIndirectA" var #cfunc CreateSolidBrushChk2 "CreateSolidBrush" int #func SetBkColorChk2 "SetBkColor" int,int #func SetTextColorChk2 "SetTextColor" int, int #define chkbox2(%1,%2) mref bmscr_CHK2,67:GetObjectAChk2 bmscr_CHK2.38,60,LF_CHK2:cxCHK2.CHK2cnt=ginfo(22):cyCHK2.CHK2cnt=ginfo(23):oxCHK2.CHK2cnt=bmscr_CHK2.29:oyCHK2.CHK2cnt=bmscr_CHK2.30:winobj "STATIC","",,0x50000000:hStatic_CHK2.CHK2cnt=objinfo(stat,2):pos cxCHK2.CHK2cnt+17,cyCHK2.CHK2cnt+(oyCHK2.CHK2cnt+abs(LF_CHK2.0))/2-abs(LF_CHK2.0):winobj "STATIC",%1,,0x50000000,oxCHK2.CHK2cnt-17,abs(LF_CHK2.0):sstat=stat:hStatic2_CHK2.CHK2cnt=objinfo(stat,2):pos cxCHK2.CHK2cnt,cyCHK2.CHK2cnt+(bmscr_CHK2.30+13)/2-13:objsize 13,13:chkbox "",%2:cstat=stat:hChk_CHK2.CHK2cnt=objinfo(stat,2):objsize oxCHK2.CHK2cnt,oyCHK2.CHK2cnt:sendmsg hStatic2_CHK2.CHK2cnt,0x30,CreateFontIndirectAChk2(LF_CHK2):CHK2cnt++:pos cxCHK2,cyCHK2+oyCHK2+5 #define ctype RGB_CHK2(%1,%2,%3) (%1|%2<<8|%3<<16) #define color2(%1,%2,%3) mod_col2_r=%1:mod_col2_g=%2:mod_col2_b=%3 oncmd gosub *WM_CTLCOLORSTATIC,0x138 oncmd gosub *WM_LBUTTONDOWN,0x201 oncmd gosub *WM_LBUTTONUP,0x202 oncmd gosub *WM_MOUSEMOVE,0x200 goto *JUMP_CHK2 *WM_CTLCOLORSTATIC /*WM_CTLCOLORSTATICメッセージを他にも使う場合はここに処理を追加してください (もし使うならこれをメインソースに含んだ方が早いかも)*/ repeat CHK2cnt if lparam=hStatic_CHK2.cnt{ ;SetBkColorChk2 wparam,0x01// ↓これを消してコメントアウトを二箇所外せば文字以外が透過される return CreateSolidBrushChk2(RGB_CHK2(mod_col2_r,mod_col2_g,mod_col2_b)) ;return GetStockObjectChk2(5); } if lparam=hStatic2_CHK2.cnt{ SetBkColorChk2 wparam,RGB_CHK2(mod_col2_r,mod_col2_g,mod_col2_b)//こっちを透過しようとすると黒くなる(重ねてる為?) SetTextColorChk2 wparam,RGB_CHK2(ginfo(16),ginfo(17),ginfo(18)) return GetStockObjectChk2(5) } loop return *WM_LBUTTONDOWN /*WM_LBUTTONDOWNメッセージを他にも使う場合はここに処理を追加してください (これはよく使うと思われるので、もし使うならメインソースに(略) )*/ mxCHK2=lParam&0xFFFF myCHK2=(lParam>>16)&0xFFFF repeat CHK2cnt coxCHK2=cxCHK2.cnt+oxCHK2.cnt coyCHK2=cyCHK2.cnt+oyCHK2.cnt if (mxCHK2>=cxCHK2.cnt)&&(mxCHK2<=coxCHK2)&&(myCHK2>=cyCHK2.cnt)&&(myCHK2<=coyCHK2){ sendmsg hChk_CHK2.cnt,0xF3,1,0 } loop return *WM_LBUTTONUP /*WM_LBUTTONUPメッセージを(以下同文)*/ mxCHK2=lParam&0xFFFF myCHK2=(lParam>>16)&0xFFFF repeat CHK2cnt sendmsg hChk_CHK2.cnt,0xF3,0,0 coxCHK2=cxCHK2.cnt+oxCHK2.cnt coyCHK2=cyCHK2.cnt+oyCHK2.cnt if (mxCHK2>=cxCHK2.cnt)&&(mxCHK2<=coxCHK2)&&(myCHK2>=cyCHK2.cnt)&&(myCHK2<=coyCHK2){ sendmsg hChk_CHK2.cnt,0xF2,0,0 if stat&0x01{ sendmsg hChk_CHK2.cnt,0xF1,0x00,0 }else{ sendmsg hChk_CHK2.cnt,0xF1,0x01,0 } } loop return *WM_MOUSEMOVE /*WM_MOUSEMOVE(以下同文)*/ mxCHK2=lParam&0xFFFF myCHK2=(lParam>>16)&0xFFFF repeat CHK2cnt coxCHK2=cxCHK2.cnt+oxCHK2.cnt coyCHK2=cyCHK2.cnt+oyCHK2.cnt if (mxCHK2>=cxCHK2.cnt)&&(mxCHK2<=coxCHK2)&&(myCHK2>=cyCHK2.cnt)&&(myCHK2<=coyCHK2){ sendmsg hChk_CHK2.cnt,0xF3,1,0 }else{ sendmsg hChk_CHK2.cnt,0xF3,0,0 } loop return *JUMP_CHK2 サンプル #include "chkbox2.as" pos 50,50 color 255,0,0//文字色 color2 0,0,255//背景色 font "",13//フォントも指定できる objsize 100,15 chkbox2 "テスト",a hChk=cstat//cstatにオブジェクトハンドル hStatic=sstat//sstatにスタティックテキストのオブジェクトハンドル(文字部分) button "enable",*e stop *e objenable hChk,0 objenable hStatic,0

以下スクリプトです。


#include "chkbox2.as" pos 50,50 color 255,0,0//文字色 color2 0,0,255//背景色 font "",13//フォントも指定できる objsize 100,15 chkbox2 "テスト",a oncmd *wm_command,$111 ;変更 hChk=cstat//cstatにオブジェクトハンドル hStatic=sstat//sstatにスタティックテキストのオブジェクトハンドル(文字部分) stop *wm_command;変更 if a = 1 : exec "calc" stop;変更

よろしくお願いします。



この記事に返信する


HSP歴10ヶ月位

リンク

2012/10/2(Tue) 19:47:21|NO.49692

チェックボックス自体をボタンにするとか。



osakana

リンク

2012/10/2(Tue) 21:43:18|NO.49699

*WM_LBUTTONUP 内の

sendmsg hChk_CHK2.cnt,0xF2,0,0 if stat&0x01{ sendmsg hChk_CHK2.cnt,0xF1,0x00,0 }else{ sendmsg hChk_CHK2.cnt,0xF1,0x01,0 }
の部分を

sendmsg hChk_CHK2.cnt,0xF5,0,0
に書き換えてみてください。
ダメだったら前者のを残したままその上に後者を追加も試してみてください。



BLUENOIR-Zwei-

リンク

2012/10/3(Wed) 12:25:37|NO.49701

osakanaさんのおかげで無事できました!



BLUENOIR-Zwei-

リンク

2012/10/3(Wed) 12:46:03|NO.49702

解決済みの所すみません。

osakanaさんのおかげでできたにはできたのですが、15回くらいチェックを入れたり外したりすると急にプログラムが閉じてしまいます。

なにか解決策はないのでしょうか?

よろしくお願いします。



osakana

リンク

2012/10/3(Wed) 16:58:40|NO.49705


oncmd *wm_command,$111


oncmd gosub *wm_command,$111
にし、*wm_command の最後にある

stop


return


さらに a 変数で結果を受け取っているのを

sendmsg objinfo_hwnd(hChk),0xF0,0,0 if stat = 1 : exec "calc"
で受け取るように変更してみてください。

a = stat
として、chkbox2 で指定した受け取り変数と同じ変数に
代入しとくのも分かりやすくて良いかもしれません。



BLUENOIR-Zwei-

リンク

2012/10/3(Wed) 18:24:21|NO.49706

osakanaさん
ありがとうございます。
しかし、またしても問題が、、、


#include "chkbox2.as" #define WS_VSCROLL $00200000 #define WS_HSCROLL $00100000 #define ES_AUTOVSCROLL $00000040 #define ES_AUTOHSCROLL $00000080 pos 10,5 color 225,225,225 color2 0,0,0//背景色 font "MS ゴシック",12//フォントも指定できる objsize 200,20 chkbox2 "チェック",c0 oncmd gosub *wm_command,$111 ;変更 hChk=cstat//cstatにオブジェクトハンドル hStatic=sstat//sstatにスタティックテキストのオブジェクトハンドル(文字部分) stop *wm_command sendmsg objinfo_hwnd(hChk),0xF0,0,0 if c0 = 1 : goto *c0_ : else : goto *c0_k return *c0_ mes "0" stop *c0_k mes "1" stop

チェックを入れたら1と表示して、チェックが外れたら0を表示するスクリプトを書いてみたのですが、文字のところをクリックしても反応してくれません・・・

何度もすいませんがよろしくお願いします。



y.tack

リンク

2012/10/3(Wed) 18:29:20|NO.49708


if c0 = 1 : goto *c0_ : else : goto *c0_k
せっかくgosub化したのにgosubのサブルーチンの中でgotoを使ってるのが怪しい



y.tack

リンク

2012/10/3(Wed) 19:40:14|NO.49710

>さらに a 変数で結果を受け取っているのを

sendmsg objinfo_hwnd(hChk),0xF0,0,0 if stat = 1 : exec "calc"
>で受け取るように変更してみてください。
のstatはどこ行ったんですか?w



BLUENOIR-Zwei-

リンク

2012/10/3(Wed) 20:35:20|NO.49712

y.tackさん

どちらもやってみましたが、ダメでした・・・



y.tack

リンク

2012/10/3(Wed) 21:18:01|NO.49713

いや僕の環境ではバグ取れましたよ。osakanaさんの接し方を見て、丸投げはまずいんじゃないかと
BLUENOIR-Zwei-さんが自分で考えてバグを取るにはどう書けばいいかちょっとわからなかったりします



BLUENOIR-Zwei-

リンク

2012/10/4(Thu) 11:52:12|NO.49725

何度やっても出来ません・・・

なぜなんでしょうか?



(´ω`)

リンク

2012/10/4(Thu) 12:30:40|NO.49727

|ω゚ ) <直接関係したことじゃないけど気になったのですごくおせっかいながら。


if文で、コロンを使ったマルチステートメントを書くのはやめた方がよろしいですよ。
面倒でもカッコを使いましょう。


if c0 = 1 { goto *c0_ } else { goto *c0_k }

ていう風に。
特に、カッコとコロンの複合は意図しない動作になる場合もあるとか聞いた希ガスです。



BLUENOIR-Zwei-

リンク

2012/10/4(Thu) 13:19:34|NO.49729

(´ω`)さん
ありがとうございます。
次からは{}を使うように心がけます。

本題ですが、全く原因がわかりません・・・
どなたかご存知のかたいませんか?



y.tack

リンク

2012/10/4(Thu) 16:55:56|NO.49740

NO.49706
のスクリプトには間違いが5カ所ありましてね
全部直さないと動かないかんじです

問題は
>せっかくgosub化したのにgosubのサブルーチンの中でgotoを使ってるのが怪しい
>のstatはどこ行ったんですか?w
の二つなんですが^^;

どっちかじゃなく、どっちも直さないと動かないと思います

一つ目
条件式は
c0 = 1
じゃなく
stat = 1
にしてください
#等号は==じゃないと違和感ありますが

二つ目と三つ目
サブルーチンへはgotoじゃなくgosubで飛んでください

四つ目と五つ目
サブルーチンの終了をstopじゃなくreturnにしてください

興味のある分野を極めようとするのもモチベーション的にアリですが
並行してHSPの基礎を身につける必要を感じます

ココお勧めです
HSPBC
http://www.rinku.zaq.ne.jp/ultimate/
gosubに関しても
「HSPBC gosub」でググったら
このサイトのgosubの解説のページが出てくると思います



BLUENOIR-Zwei-

リンク

2012/10/4(Thu) 17:31:20|NO.49746

y.tackさん

最後まで本当にありがとうございます。

僕の技術不足でした。これからはもっと勉強してから質問するようにします。



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