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


HSPTV!掲示板


未解決 解決 停止 削除要請

2015
0403
科学太郎モジュール型変数内での割り込み処理は可能か?5解決


科学太郎

リンク

2015/4/3(Fri) 16:00:49|NO.68356

モジュール型変数内での割り込み処理が利用できるのか知りたいです。
システム変数の「ginfo_intID」の使い方が正しいのか?間違ってるのか?

つまり、モジュール型変数内でボタンなどのラベルにジャンプしたとき、
newmodで生成されたインスタンスをどのように切り分けるべきか?

現在、メンバ変数に「m_id」というウインドウIDを用意してますが、
ラベル内ではメンバ変数にアクセスできないため「m_id」での分岐処理ができません。

そこで「ginfo_intID」で「launch(ginfo_intID-WID_LAUNCH1)」という記述を行い
ラベル内でもモジュール型変数内のメンバ命令(modfunc)、メンバ関数(modcfunc)を
呼び出そうとしてます。

しかし、ボタンなどの割り込みが発生しても「ginfo_intID」が常に「0」です。
私の期待した値はウインドウIDより「1」〜「5」が取得できると思ったのです。
そうすればラベル内でも「LaunchButton launch(ginfo_intID-WID_LAUNCH1)」で
モジュール型変数のメンバ変数にアクセスできると思ったのですが…。

症状1:
ファイルをドラッグ&ドロップしても「*OnDropFiles」にジャンプせず
ダイアログが表示されない。

症状2:
ボタンを押しても「ginfo_intID」が常に「0」となってる。

症状3:
ランチャー・グループ(3)をアクティブ・ウインドウにしてるのにボタンを押すと
ランチャー・グループ(5)がアクティブ・ウインドウになってしまう。

質問:
何が原因なのでしょうか?



この記事に返信する


科学太郎

リンク

2015/4/3(Fri) 16:01:07|NO.68357

サンプル・ソースです。

//------------------------------------------------------------------------------ // 科学太郎のサンプル for HSP(Ver.3.3.2) //============================================================================== // テーマ:モジュール型変数内での割り込み処理 //------------------------------------------------------------------------------ #include "Shell32.as" //-------------------------------------- // 記号定数 //-------------------------------------- #const NULL $00000000 #const WM_DROPFILES $00000233 //-------------------------------------- // 列挙定数(ウインドウID) //-------------------------------------- #enum global WID_MANAGER=0 #enum global WID_LAUNCH1 #enum global WID_LAUNCH2 #enum global WID_LAUNCH3 #enum global WID_LAUNCH4 #enum global WID_LAUNCH5 //---------------------------------------------------------- // ランチャーのクラス(モジュール型変数) //========================================================== // m_title :タイトル文字列(ランチャー・グループ名) // m_wid :ウインドウID(screen命令,gsel命令など) // m_wnd :ウインドウ・ハンドル(API関数など) // m_mx :ボタンの列数(10個) // m_my :ボタンの行数( 3個) // m_sx :ボタンの横サイズ(30px) // m_sy :ボタンの縦サイズ(30px) //---------------------------------------------------------- #module modLaunchClass\ m_title,\ m_wid,\ m_wnd,\ m_mx,\ m_my,\ m_sx,\ m_sy //-------------------------------------- // ランチャーの初期化 //-------------------------------------- #modinit int _id_,int _mx_,int _my_,int _sx_,int _sy_,str _title_ x=(_sx_*_mx_) y=(_sy_*_my_) screen _id_,x,y,SCREEN_NORMAL|SCREEN_FIXEDSIZE|SCREEN_TOOL:gsel _id_,2 DragAcceptFiles hWnd,1 title _title_ m_title=_title_ m_wid=_id_ m_wnd=hWnd m_mx=_mx_ m_my=_my_ m_sx=_sx_ m_sy=_sy_ ;ボタンの設置 objsize m_sx,m_sy repeat m_my:y=cnt repeat m_mx:x=cnt pos(m_sx*x),(m_sy*y) button gosub strf("%02d",y*m_mx+x+1),*PushLaunch loop loop ;割り込み設定 oncmd gosub *OnDropFiles,WM_DROPFILES return //-------------------------------------- // ドロップ・ファイルの処理 //-------------------------------------- *OnDropFiles sdim s s+=strf("ginfo_intID=%d\n",ginfo_intID) s+=strf("stat=%d\n",stat) dialog s,0,"確認" dim s DragFinish wParam return //-------------------------------------- // ランチャー・ボタンの処理 //-------------------------------------- *PushLaunch sdim s s+=strf("ginfo_intID=%d\n",ginfo_intID) s+=strf("stat=%d\n",stat) dialog s,0,"確認" dim s return //-------------------------------------- // ランチャー・ボタンの処理 //-------------------------------------- #modfunc LaunchButton sdim s s+=strf("m_title=[%s]\n",m_title) s+=strf("m_wid =%d\n",m_wid) s+=strf("m_wnd =[0x%08X]\n",m_wnd) s+=strf("m_mx =%d\n",m_mx) s+=strf("m_my =%d\n",m_my) s+=strf("m_sx =%d\n",m_sx) s+=strf("m_sy =%d\n",m_sy) dialog s,0,strf("No.%dボタンの確認",_no_) dim s return //-------------------------------------- // ウインドウ・サイズの取得 //-------------------------------------- #modfunc LaunchGetSize var _sx_,var _sy_,int _sw_ gsel m_wid if(_sw_){ _sx_=ginfo_sizeX _sy_=ginfo_sizeY } else{ _sx_=ginfo_winX _sy_=ginfo_winY } return //-------------------------------------- // ウインドウ位置の取得 //-------------------------------------- #modfunc LaunchGetMove var _cx_,var _cy_,int _sw_ gsel m_wid if(_sw_==0){ _cx_=ginfo_cx _cy_=ginfo_cy } else:if(_sw_==1){ _cx_=ginfo_wx1 _cy_=ginfo_wy1 } else:if(_sw_==2){ _cx_=ginfo_wx2 _cy_=ginfo_wy2 } return //-------------------------------------- // ウインドウ位置の設定 //-------------------------------------- #modfunc LaunchSetMove int _x_,int _y_ gsel m_wid width -1,-1,_x_,_y_ return //-------------------------------------- // メンバ変数のデバッグ表示 //-------------------------------------- #modfunc LaunchDebug sdim s s+=strf("m_title=[%s]\n",m_title) s+=strf("m_wid =%d\n",m_wid) s+=strf("m_wnd =[0x%08X]\n",m_wnd) s+=strf("m_mx =%d\n",m_mx) s+=strf("m_my =%d\n",m_my) s+=strf("m_sx =%d\n",m_sx) s+=strf("m_sy =%d\n",m_sy) dialog s,0,"確認" dim s return //-------------------------------------- #global //---------------------------------------------------------- // End of modLaunchClass.as //---------------------------------------------------------- //-------------------------------------- // メイン部 //-------------------------------------- *Main sx=(640) sy=(480) cx=(ginfo_dispX-sx)/2 cy=(ginfo_dispY-sy)/2 screen WID_MANAGER,sx,sy,SCREEN_NORMAL|SCREEN_FIXEDSIZE,cx,cy gradf 0,0,sx,sy,1,$FFFFCC,$FFBB00 title "No.020(モジュール型変数内での割り込み処理)" font MSGOTHIC,14 mes "症状1:" mes "ファイルをドラッグ&ドロップしても「*OnDropFiles」にジャンプせず" mes "ダイアログが表示されない。" mes "" mes "症状2:" mes "ボタンを押しても「ginfo_intID」が常に「0」となってる。" mes "" mes "症状3:" mes "ランチャー・グループ(3)をアクティブ・ウインドウにしてるのにボタンを押すと" mes "ランチャー・グループ(5)がアクティブ・ウインドウになってしまう。" mes "" mes "質問:" mes "何が原因なのでしょうか?" ;インスタンスの生成 newmod launch,modLaunchClass,WID_LAUNCH1,10,3,30,30,"ランチャー・グループ(1)" newmod launch,modLaunchClass,WID_LAUNCH2,10,3,30,30,"ランチャー・グループ(2)" newmod launch,modLaunchClass,WID_LAUNCH3,10,3,30,30,"ランチャー・グループ(3)" newmod launch,modLaunchClass,WID_LAUNCH4,10,3,30,30,"ランチャー・グループ(4)" newmod launch,modLaunchClass,WID_LAUNCH5,10,3,30,30,"ランチャー・グループ(5)" ;ランチャー位置 LaunchGetSize launch(0),sx,sy,1 foreach launch LaunchSetMove launch(cnt),0,sy*cnt loop ;デバッグ表示 foreach launch LaunchDebug launch(cnt) loop stop //------------------------------------------------------------------------------ // End of newSample020.hsp //------------------------------------------------------------------------------



掘木

リンク

2015/4/3(Fri) 18:25:16|NO.68363

屋外から失礼します。

症状1
#defineはglobal指定がない場合、moduleによる名前空間の影響をC++と異なり受けます。
よって、oncmdの記述を直すか#defineの記述を改めましょう。

症状2
ボタンはoncmdによる割り込みではないので、ボタンによる飛び先で
ginfo_intIDの値は不定です。
WM_COMMANDからoncmdで拾えばかいぜんできますが、オブジェIDの取得が手間になります。
ウィンドウメッセージの処理順等も考慮してうまい方法を考えましょう。

症状3
よくわからないが、ダイアログの親ウィンドウが、
アクティブウィンドウ(ginfo_act)でなく、
ginfo_sel(gselで切り替わるやつ)なのが関係してるんではなかろうか。
見当違いならもうしわけない。



科学太郎

リンク

2015/4/3(Fri) 20:05:34|NO.68366

ありがとうございます。

> 症状1
> #defineはglobal指定がない場合、moduleによる名前空間の影響をC++と異なり受けます。
> よって、oncmdの記述を直すか#defineの記述を改めましょう。
そうでしたね。
すっかり忘れていました。
global 指定したらドラッグ&ドロップ可能になりました。

> 症状2
> ボタンはoncmdによる割り込みではないので、ボタンによる飛び先で
> ginfo_intIDの値は不定です。
なるほど。

> WM_COMMANDからoncmdで拾えばかいぜんできますが、オブジェIDの取得が手間になります。
> ウィンドウメッセージの処理順等も考慮してうまい方法を考えましょう。
いろいろ試行錯誤してみます。

> 症状3
> よくわからないが、ダイアログの親ウィンドウが、
> アクティブウィンドウ(ginfo_act)でなく、
> ginfo_sel(gselで切り替わるやつ)なのが関係してるんではなかろうか。
> 見当違いならもうしわけない。
こちらも???でしたので。



科学太郎

リンク

2015/4/3(Fri) 22:59:21|NO.68371

> 症状3:
> ランチャー・グループ(3)をアクティブ・ウインドウにしてるのにボタンを押すと
> ランチャー・グループ(5)がアクティブ・ウインドウになってしまう。
この原因が判明しました。

メイン部で「ランチャー位置」が終わった後は「ginfo_sel=5」になってます。
その後、ランチャー・グループ(3)をマウスでクリックして、ウインドウをアクティブにしても
「ginfo_sel=5」のままで dialog 命令を使うと親ウインドウがランチャー・グループ(5)なので
ダイアログが表示された後にランチャー・グループ(5)のウインドウが常にアクティブになる。

つまり、マウス・クリックでは「ginfo_act=3」にはなるが「ginfo_sel=3」にはならない。
同様にボタンを押しても「ginfo_act=3」にはなるが「ginfo_sel=3」にはならない。
よって、常に dialog 命令の後に「ginfo_sel=5」であるウインドウがアクティブとなる。

> 症状3
> よくわからないが、ダイアログの親ウィンドウが、
> アクティブウィンドウ(ginfo_act)でなく、
> ginfo_sel(gselで切り替わるやつ)なのが関係してるんではなかろうか。
> 見当違いならもうしわけない。
この考えで合っていたようです。
システム変数 hWnd は ginfo_sel のウインドウ・ハンドルが入ってるので当たり前であった。
メイン部で「デバッグ表示」の後に「gsel WID_LAUNCH2」を入れると dialog 命令の後は
常にランチャー・グループ(2)のウインドウがアクティブになるのを確認しました。

よって「*PushLaunch」ラベルの最初に「gsel ginfo_act」を1行挿入することで改善できました。

//-------------------------------------- // ランチャー・ボタンの処理 //-------------------------------------- *PushLaunch gsel ginfo_act sdim s s+=strf("ginfo_intID=%d\n",ginfo_intID) s+=strf("stat=%d\n",stat) dialog s,0,"確認" dim s return

> 症状2:
> ボタンを押しても「ginfo_intID」が常に「0」となってる。
こちらも症状3が改善されたので次のような記述で対応できました。

//-------------------------------------- // ランチャー・ボタンの処理 //-------------------------------------- *PushLaunch gsel ginfo_act LaunchButton launch@(ginfo_act-WID_LAUNCH1),stat ; LaunchButton launch@(ginfo_sel-WID_LAUNCH1),stat return //-------------------------------------- // ランチャー・ボタンの処理 //-------------------------------------- #modfunc LaunchButton int _no_ sdim s s+=strf("ginfo_act=%d\n",ginfo_act) s+=strf("ginfo_sel=%d\n",ginfo_sel) s+=strf("\n") s+=strf("m_title=[%s]\n",m_title) s+=strf("m_wid =%d\n",m_wid) s+=strf("m_wnd =[0x%08X]\n",m_wnd) s+=strf("m_mx =%d\n",m_mx) s+=strf("m_my =%d\n",m_my) s+=strf("m_sx =%d\n",m_sx) s+=strf("m_sy =%d\n",m_sy) dialog s,0,strf("No.%d%02dボタンの確認",ginfo_sel,_no_) dim s return
掘木さん。
ありがとうございます。
症状1、症状2、症状3が全て改善されました。



科学太郎

リンク

2015/4/3(Fri) 22:59:43|NO.68372

改善されたソースを載せておきます。

//------------------------------------------------------------------------------ // 科学太郎のサンプル for HSP(Ver.3.3.2) //============================================================================== // テーマ:モジュール型変数内での割り込み処理 //------------------------------------------------------------------------------ #include "Shell32.as" //-------------------------------------- // 記号定数 //-------------------------------------- #const global NULL $00000000 #const global WM_DROPFILES $00000233 //-------------------------------------- // 列挙定数(ウインドウID) //-------------------------------------- #enum global WID_MANAGER=0 #enum global WID_LAUNCH1 #enum global WID_LAUNCH2 #enum global WID_LAUNCH3 #enum global WID_LAUNCH4 #enum global WID_LAUNCH5 //---------------------------------------------------------- // ランチャーのクラス(モジュール型変数) //========================================================== // m_title :タイトル文字列(ランチャー・グループ名) // m_wid :ウインドウID(screen命令,gsel命令など) // m_wnd :ウインドウ・ハンドル(API関数など) // m_mx :ボタンの列数(10個) // m_my :ボタンの行数( 3個) // m_sx :ボタンの横サイズ(30px) // m_sy :ボタンの縦サイズ(30px) //---------------------------------------------------------- #module modLaunchClass\ m_title,\ m_wid,\ m_wnd,\ m_mx,\ m_my,\ m_sx,\ m_sy //-------------------------------------- // ランチャーの初期化 //-------------------------------------- #modinit int _id_,int _mx_,int _my_,int _sx_,int _sy_,str _title_ x=(_sx_*_mx_) y=(_sy_*_my_) screen _id_,x,y,SCREEN_NORMAL|SCREEN_FIXEDSIZE|SCREEN_TOOL:gsel _id_,2 DragAcceptFiles hWnd,1 title _title_ m_title=_title_ m_wid=_id_ m_wnd=hWnd m_mx=_mx_ m_my=_my_ m_sx=_sx_ m_sy=_sy_ ;ボタンの設置 objsize m_sx,m_sy repeat m_my:y=cnt repeat m_mx:x=cnt pos(m_sx*x),(m_sy*y) button gosub strf("%02d",y*m_mx+x+1),*PushLaunch loop loop ;割り込み設定 oncmd gosub *OnDropFiles,WM_DROPFILES return //-------------------------------------- // ドロップ・ファイルの処理 //-------------------------------------- *OnDropFiles sdim s s+=strf("ginfo_intID=%d\n",ginfo_intID) s+=strf("stat=%d\n",stat) dialog s,0,"確認" dim s DragFinish wParam return //-------------------------------------- // ランチャー・ボタンの処理 //-------------------------------------- *PushLaunch gsel ginfo_act LaunchButton launch@(ginfo_act-WID_LAUNCH1),stat ; LaunchButton launch@(ginfo_sel-WID_LAUNCH1),stat return //-------------------------------------- // ランチャー・ボタンの処理 //-------------------------------------- #modfunc LaunchButton int _no_ sdim s s+=strf("ginfo_act=%d\n",ginfo_act) s+=strf("ginfo_sel=%d\n",ginfo_sel) s+=strf("\n") s+=strf("m_title=[%s]\n",m_title) s+=strf("m_wid =%d\n",m_wid) s+=strf("m_wnd =[0x%08X]\n",m_wnd) s+=strf("m_mx =%d\n",m_mx) s+=strf("m_my =%d\n",m_my) s+=strf("m_sx =%d\n",m_sx) s+=strf("m_sy =%d\n",m_sy) dialog s,0,strf("No.%d%02dボタンの確認",ginfo_sel,_no_+1) dim s return //-------------------------------------- // ウインドウ・サイズの取得 //-------------------------------------- #modfunc LaunchGetSize var _sx_,var _sy_,int _sw_ gsel m_wid if(_sw_){ _sx_=ginfo_sizeX _sy_=ginfo_sizeY } else{ _sx_=ginfo_winX _sy_=ginfo_winY } return //-------------------------------------- // ウインドウ位置の取得 //-------------------------------------- #modfunc LaunchGetMove var _cx_,var _cy_,int _sw_ gsel m_wid if(_sw_==0){ _cx_=ginfo_cx _cy_=ginfo_cy } else:if(_sw_==1){ _cx_=ginfo_wx1 _cy_=ginfo_wy1 } else:if(_sw_==2){ _cx_=ginfo_wx2 _cy_=ginfo_wy2 } return //-------------------------------------- // ウインドウ位置の設定 //-------------------------------------- #modfunc LaunchSetMove int _x_,int _y_ gsel m_wid width -1,-1,_x_,_y_ return //-------------------------------------- // メンバ変数のデバッグ表示 //-------------------------------------- #modfunc LaunchDebug sdim s s+=strf("m_title=[%s]\n",m_title) s+=strf("m_wid =%d\n",m_wid) s+=strf("m_wnd =[0x%08X]\n",m_wnd) s+=strf("m_mx =%d\n",m_mx) s+=strf("m_my =%d\n",m_my) s+=strf("m_sx =%d\n",m_sx) s+=strf("m_sy =%d\n",m_sy) dialog s,0,"確認" dim s return //-------------------------------------- // メンバ変数のデバッグ文字列 //-------------------------------------- #modcfunc LaunchDebugMsg sdim s s+=strf("ID=%02d,",m_wid) s+=strf("0x%08X,",m_wnd) s+=strf("%2d,",m_mx) s+=strf("%2d,",m_my) s+=strf("%2d,",m_sx) s+=strf("%2d,",m_sy) s+=strf("[%s]",m_title) return s //-------------------------------------- #global //---------------------------------------------------------- // End of modLaunchClass.as //---------------------------------------------------------- //-------------------------------------- // メイン部 //-------------------------------------- *Main sx=(640) sy=(480) cx=(ginfo_dispX-sx)/2 cy=(ginfo_dispY-sy)/2 screen WID_MANAGER,sx,sy,SCREEN_NORMAL|SCREEN_FIXEDSIZE,cx,cy gradf 0,0,sx,sy,1,$FFFFCC,$FFBB00 title "No.020(モジュール型変数内での割り込み処理)" font MSGOTHIC,14 mes "症状1:" mes "ファイルをドラッグ&ドロップしても「*OnDropFiles」にジャンプせず" mes "ダイアログが表示されない。" mes "" mes "症状2:" mes "ボタンを押しても「ginfo_intID」が常に「0」となってる。" mes "" mes "症状3:" mes "ランチャー・グループ(3)をアクティブ・ウインドウにしてるのにボタンを押すと" mes "ランチャー・グループ(5)がアクティブ・ウインドウになってしまう。" mes "" mes "質問:" mes "何が原因なのでしょうか?" ;インスタンスの生成 newmod launch,modLaunchClass,WID_LAUNCH1,10,3,30,30,"ランチャー・グループ(1)" newmod launch,modLaunchClass,WID_LAUNCH2,10,3,30,30,"ランチャー・グループ(2)" newmod launch,modLaunchClass,WID_LAUNCH3,10,3,30,30,"ランチャー・グループ(3)" newmod launch,modLaunchClass,WID_LAUNCH4,10,3,30,30,"ランチャー・グループ(4)" newmod launch,modLaunchClass,WID_LAUNCH5,10,3,30,30,"ランチャー・グループ(5)" ;ランチャー位置 LaunchGetSize launch(0),sx,sy,1 foreach launch LaunchSetMove launch(cnt),0,sy*cnt loop ;デバッグ表示 foreach launch ; LaunchDebug launch(cnt) loop ;デバッグ文字列 sdim s foreach launch s(cnt)=LaunchDebugMsg(launch(cnt)) loop gsel WID_MANAGER mes "" foreach s mes s(cnt) loop dim s ;その他 mes "" mes "お礼:" mes "掘木さん。" mes "ありがとうございます。" mes "症状1、症状2、症状3が全て改善されました。" stop //------------------------------------------------------------------------------ // End of newSample020.hsp //------------------------------------------------------------------------------



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