|
|
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
//------------------------------------------------------------------------------

| |
|