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


HSPTV!掲示板


未解決 解決 停止 削除要請

2012
1115
(´ω`)エラーとbutton gosubについて4解決


(´ω`)

リンク

2012/11/15(Thu) 14:24:40|NO.50679

これは、特に今すぐ問題だとかいうのではないのですが、違和感を感じる動作というか、
いや実は現在コレで悩んでるのですがどうしようもないよなあというか……

つまりお前は何を言いたいんだと言われそうですが。(;ω;)

以下のソースを走らせていただくとわかるのですが、

screen 0, 320, 240 button gosub "ぼたん1", *btn01 screen 1, 320, 240 button gosub "ぼたん2", *btn02 gsel 0 b = a(222)+"22" stop *btn01 dialog "ぼたーん1!" return *btn02 dialog "ぼぼぼぼたん2!" return
実行するとすぐエラーが発生するのがお分かりいただけると思いますが、ここでおもむろに
2つのウィンドウにあるボタンを押すと、エラーダイアログが出ているにも関わらずに
ボタン押下時のコードが実行されダイアログが表示されます
しかし、button gosubでなくbutton gotoにすると、コードは実行されません。

感覚的には、エラー発生時にはbutton gosubでも停止してほしいなあと思うのですが、
でもこれってかなりコアな部分でこういう仕組みになってるんだろうなあと。
あと、エラー表示ダイアログもモーダルでないので、できればモーダルであって欲しいなあ
というか。

しかし、他にそういう話を聞かないので、こういう要望を思うのはオレくらいなのかなあと
いうことで、ひとりごとです。
以上、最後までお読みいただき恐縮です。(u´ω`)



この記事に返信する


ぬこ

リンク

2012/11/15(Thu) 18:01:26|NO.50685

単純にbutton gosubだと2,4行目に戻ってくるのでb = a(222)+"22"がもう一度処理させるだけだと思うのですが



ANTARES

リンク

2012/11/16(Fri) 06:57:47|NO.50696

 commonフォルダにuser.defというファイルを作り、
以下のように記述しておくというのはどうでしょう?

#ifdef _DEBUG sdim errmsg@err,64,42 errmsg@err.1= "システムエラーが発生しました" errmsg@err.2= "文法が間違っています" errmsg@err.3= "パラメータの値が異常です" errmsg@err.4= "計算式でエラーが発生しました" errmsg@err.5= "パラメータの省略はできません" errmsg@err.6= "パラメータの型が違います" errmsg@err.7= "配列の要素が無効です" errmsg@err.8= "有効なラベルが指定されていません" errmsg@err.9= "サブルーチンやループのネストが深すぎます" errmsg@err.10= "サブルーチン外のreturnは無効です" errmsg@err.11= "repeat外でのloopは無効です" errmsg@err.12= "ファイルが見つからないか無効な名前です" errmsg@err.13= "画像ファイルがありません" errmsg@err.14= "外部ファイル呼び出し中のエラーです" errmsg@err.15= "計算式でカッコの記述が違います" errmsg@err.16= "パラメータの数が多すぎます" errmsg@err.17= "文字列式で扱える文字数を越えました" errmsg@err.18= "代入できない変数名を指定しています" errmsg@err.19= "0で除算しました" errmsg@err.20= "バッファオーバーフローが発生しました" errmsg@err.21= "サポートされない機能を選択しました" errmsg@err.22= "計算式のカッコが深すぎます" errmsg@err.23= "変数名が指定されていません" errmsg@err.24= "整数以外が指定されています" errmsg@err.25= "配列の要素書式が間違っています" errmsg@err.26= "メモリの確保ができませんでした" errmsg@err.27= "タイプの初期化に失敗しました" errmsg@err.28= "関数に引数が設定されていません" errmsg@err.29= "スタック領域のオーバーフローです" errmsg@err.30= "無効な名前がパラメーターに指定されています" errmsg@err.31= "異なる型を持つ配列変数に代入しました" errmsg@err.32= "関数のパラメーター記述が不正です" errmsg@err.33= "オブジェクト数が多すぎます" errmsg@err.34= "配列・関数として使用できない型です" errmsg@err.35= "モジュール変数が指定されていません" errmsg@err.36= "モジュール変数の指定が無効です" errmsg@err.37= "変数型の変換に失敗しました" errmsg@err.38= "外部DLLの呼び出しに失敗しました" errmsg@err.39= "外部オブジェクトの呼び出しに失敗しました" errmsg@err.40= "関数の戻り値が設定されていません。" errmsg@err.41= "関数を命令として記述しています。" #uselib "user32.dll" #func EnableWindow@err "EnableWindow" sptr,sptr onerror *l_err@err goto *l_err_end@err *l_err@err repeat 10 mref bm,96+cnt if varptr(bm) { EnableWindow@err bm.13,0 } loop dialog "#Error "+wparam+" in line "+lparam+" ("+errfile@err+")\n-->"+errmsg@err.wparam end *l_err_end@err #endif ;_DEBUG
 ソースファイルにも先頭に以下の1行が必要になります。

errfile@err=__FILE__



(´ω`)

リンク

2012/11/16(Fri) 10:09:51|NO.50699

>ぬこ 様

正確には、「エラー発生によりソース実行が中断されている状況にも関わらず、サブルーチン
コール機能のボタンを押すと、サブルーチンのコードが実行されるのに違和感を感じた」と
いうことです。
オレの言い方が悪かったですね、ごめんなさい。(;ω;)


>ANTARES 様

ふむ、このuser.defをインクルードして使うわけですね……

……あ、なるほど!
エラー処理を自前で作り、エラー発生時には使用中の全ウィンドウに対しEnableWindow関数で
ウィンドウ自体を無効状態にし、その上でエラーダイアログを出せば擬似モーダルにできると!


ひとりごとにお返事いただき、お二人ともありがとうございました!
アンド、極めて勉強になりました!感謝です!(*´ω`*)



ANTARES

リンク

2012/11/17(Sat) 06:39:25|NO.50707

>ふむ、このuser.defをインクルードして使うわけですね……
インクルードする必要はありません。
hspdef.asと同様、自動的に組み込まれます。



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