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


HSPTV!掲示板


未解決 解決 停止 削除要請

2016
0104
End画面可変の上限設定モジュールでランタイムエラー?9解決


End

リンク

2016/1/4(Mon) 13:14:32|NO.73978


#module /*━━━━━━━━━━ 初期処理 ──────────*/ #uselib "user32.dll" #func GetWindowLong "GetWindowLongA" int,int #func SetWindowLong "SetWindowLongA" int,int,int #define WM_MINMAXINFO 0x24 /*━━━━━━━━━━ 割り当て ────────── MaxX = 最大画面サイズX MaxY = 最大画面サイズY MinX = 最小画面サイズX MinY = 最小画面サイズY ──────────*/ #deffunc ScrGndSiz_Set int MaxX , int MaxY , int MinX , int MinY GetWindowLong hwnd, -16 SetWindowLong hwnd, -16, stat|0x00040000 oncmd gosub *ScrGndSiz_CMD, WM_MINMAXINFO ;コマンド設定 return /*━━━━━━━━━━ メッセージ ──────────*/ *ScrGndSiz_CMD dim info, 10 :dupptr info, lparam, 40, 4 info.6=MinX , MinY , MaxX , MaxY return #global /*------------------------------------- 以下サンプル -------------------------------------*/ MinX = 300 MinY = 300 MaxX = ginfo_dispx MaxY = ginfo_dispy screen 0,MaxX,MaxY,0,-1,-1,640,480 ScrGndSiz_Set MaxX,MaxY,MinX,MinY stop

画面可変の上限設定をするモジュールを作ってみたのですが、
画面を可変させるとランタイムエラーになってしまいます。
HSPバージョンは3.5bata
OSはwindos10-64bitです。
どなたか対策法になりそうなアドバイスを頂けないでしょうか?



この記事に返信する


kanamaru

リンク

2016/1/4(Mon) 14:37:49|NO.73979

調べてみたところ、
http://hsp.tv/play/pforum.php?mode=pastwch&num=26678
のように、*ScrGndSiz_CMDでreturn 0にする必要があるのではないかと思います。
つまり、返すべき値が返って来ないため、ランタイムエラーが起きたかも知れません。



End

リンク

2016/1/4(Mon) 15:02:27|NO.73980

kanamaruさんありがとうございます。
return 0 を指定してみたのですが、結果はランタイムエラーのままでした。



End

リンク

2016/1/4(Mon) 15:06:01|NO.73981

私も色々とやってみた結果、

#module /*━━━━━━━━━━ 初期処理 ──────────*/ #uselib "user32.dll" #func GetWindowLong "GetWindowLongA" int,int #func SetWindowLong "SetWindowLongA" int,int,int #define WM_MINMAXINFO 0x24 /*━━━━━━━━━━ 割り当て ────────── MaxX = 最大画面サイズX MaxY = 最大画面サイズY MinX = 最小画面サイズX MinY = 最小画面サイズY ──────────*/ #deffunc ScrGndSiz_Set int MaxX , int MaxY , int MinX , int MinY GetWindowLong hwnd, -16 SetWindowLong hwnd, -16, stat|0x00040000 ;oncmd gosub *ScrGndSiz_CMD, WM_MINMAXINFO ;コマンド設定 return 1 /*━━━━━━━━━━ メッセージ ──────────*/ *ScrGndSiz_CMD dim info, 10 :dupptr info, lparam, 40, 4 info.6=MinX , MinY , MaxX , MaxY return #global /*------------------------------------- 以下サンプル -------------------------------------*/ MinX = 300 MinY = 300 MaxX = ginfo_dispx MaxY = ginfo_dispy screen 0,MaxX,MaxY,0,-1,-1,640,480 ScrGndSiz_Set MaxX,MaxY,MinX,MinY oncmd gosub *ScrGndSiz_CMD, 0x24 ;追加 stop ;追加 *ScrGndSiz_CMD dim info, 10 :dupptr info, lparam, 40, 4 info.6=MinX , MinY , MaxX , MaxY return
モジュール外で作動させると正常に動作しました。
しかし、今回ラベルの部分もモジュール内に埋め込みたいので、未解決のままといたします。



くちくん

リンク

2016/1/4(Mon) 15:19:26|NO.73982

ラベルを命令化させたらできました。

#module #uselib "user32.dll" #func GetWindowLong "GetWindowLongA" int,int #func SetWindowLong "SetWindowLongA" int,int,int #define WM_MINMAXINFO 0x24 #deffunc ScrGndSiz_Set int MaxX , int MaxY , int MinX , int MinY GetWindowLong hwnd, -16 SetWindowLong hwnd, -16, stat|0x00040000 MaxX2=MaxX : MaxY2=MaxY : MinX2=Minx : MinY2=MinY ;ScrGndSiz_CMD用に入れる(コピー?) return 1 #deffunc ScrGndSiz_CMD dim info, 10 :dupptr info, lparam, 40, 4 info.6=MinX2 , MinY2 , MaxX2 , MaxY2 return 0 #global MinX = 300 MinY = 300 MaxX = ginfo_dispx MaxY = ginfo_dispy screen 0,MaxX,MaxY,0,-1,-1,640,480 ScrGndSiz_Set MaxX,MaxY,MinX,MinY oncmd gosub *ScrGndSiz_CMD_RUN, 0x24 ;割り込み stop *ScrGndSiz_CMD_Run ScrGndSiz_CMD;割り込みがあったからScrGndSiz_CMDを実行する return
ScrGndSiz_CMDは命令化させて、コマンド割り込みがあったらScrGndSiz_CMDを実行させる
ような仕組みです。



くちくん

リンク

2016/1/4(Mon) 15:21:15|NO.73983

でもこれだとラベルを追加する必要があるから目的には合わないかもしれません。



kanamaru

リンク

2016/1/4(Mon) 15:26:12|NO.73984

モジュール外で動作させれば動くという事は、原因は1つ。
oncmdのジャンプ先のラベルが命令の定義外にあると解釈されてしまった。
試しに、*ScrGndSiz_CMDの前のreturnをstopに変えて、
#globalの前にreturnを追加してみてください。



kanamaru

リンク

2016/1/4(Mon) 15:30:12|NO.73985

補足すると、モジュール内でoncmdを使うのはおすすめできません。
モジュール外で同じウィンドウメッセージに対してoncmd使われちゃったら、
モジュールが動作しなくなるので。
対策としては、oncmd2というのをネットで探してきて、それを使う。
まああまりこのウィンドウメッセージは使われない気もしますが。



ue_dai

リンク

2016/1/4(Mon) 17:48:26|NO.73989

最初のスクリプトの *ScrGndSiz_CMD ラベルにおいて
> info.6=MinX , MinY , MaxX , MaxY
とありますが、この MinX などは ScrGndSiz_Set 命令の引数です。
この命令が実行されていないときに (oncmd により) このラベルが呼ばれると、
存在しない MinX を使おうとして、まずいことになります。

解決策は、引数の値をモジュールの内側に保存しておくのがよいでしょうか。
https://www.diffchecker.com/nyfolhld

> kanamaru さん
> oncmdのジャンプ先のラベルが命令の定義外にあると解釈されてしまった。
命令の定義の範囲は、次の #deffunc 系命令または #global までです。



End

リンク

2016/1/4(Mon) 18:05:10|NO.73990

>>存在しない MinX を使おうとして、まずいことになります。
スプリクトを見返しましたが、確かにそうですね。
変数の事すっかり見落としていました。
まさか「ScrGndSiz_Set」の引数を指定したなんて・・。
kanamaruさん、くちくんさん、ue_daiさんありがとうございました!



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