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


HSPTV!掲示板


未解決 解決 停止 削除要請

2006
0710
理沙メニューバーでの・・・6解決


理沙

リンク

2006/7/10(Mon) 04:08:44|NO.1303

HSPのサンプルにあるメニューバーを付けたのですが、
問題ができてしまいました。

メニューで「リスト」を押すとリストページを表示します。
mousex,mouseyとstickを使い、コンテンツを選択できるページです。
(repeat-loopの中で判定しています)

そこから「メイン」を押して元の画面に戻すという操作を
できるようにしたいと思っています。

ですが、「リスト」からメニューの「メイン」を押すと、
(repeat-loop)から抜け出せてない状態のままになってしまいます。
メニューが押されたらbreakしたいんですが、ループ外のbreakとなってしまいます。

現在は、「リスト」を押すとメニューをGRAYにして、メニューバーを使用不可にしています。
もしいい方法がありましたら、教えて頂けると嬉しいです。
よろしくお願いします(^^/



この記事に返信する


I386

リンク

2006/7/10(Mon) 14:47:57|NO.1308

改造したスクリプトがないので何ともいえませんが、
サンプルをみると、
repeat - loop間からoncmdなどで抜けてしまったあとに"break"していませんか?
もう一度よくプログラムの流れを確認してみてください。
自分なりに思いついた流れとしては

gosubで飛ぶ そのサブルーチン内でフラグ用の変数などに数値を代入(loopflg=1 など) "return"でもどる 条件分岐で先ほどのフラグを確認 フラグがその数値だったら(例えばif loopflg=1)、"break"実行
…少々わかりにくいのですが、大体こんな感じでいいのではと思います。

一応スクリプト載せます。

button gosub "BREAK",*brk repeat if loopflg=1 : break wait 1 loop mes "抜け出しました。" stop *brk loopflg=1 return



理沙

リンク

2006/7/10(Mon) 19:17:31|NO.1311

I386さん、お返事ありがとうございます。
スクリプトまで書いて頂いて・・・
そして、ホントに申し訳ありません、あたしの説明不足でした。

書いて頂いたスクリプトと、状況は似ているのですが、
メニューバーでページ変更を行った場合、もとのループには戻ってこないのです。
詳しく説明するのが難しいので、簡単にまとめました。

//(user32.dllよりメニューバーを) // LOOP1は、とあるサブルーチンです *LOOP1 repeat stick key if key :break await 1 loop return *LOOP2 repeat stick key if key :break await 1 loop return *MenuCommand switch (wparam) case 1 : gosub *LOOP1 swbreak case 2 : gosub *LOOP2 swbreak swend return

メインは、*LABEL 〜 goto *LABEL で
その中から gosub*LOOP1 としています。

内容は、テキストファイルを読み込み、記号や文字によって
内容を表示したり、画像を表示したりする、サウンドノベルです。

つまり、テキストファイルを読み込むというループ、
ユーザーの入力待ちというループ、
メニュー(セーブ)というループ、
メニュー(ロード)というループ、
・・・
などが存在し、それぞれをgosub命令で行き来するようにしています。

入力待ちという状態のループ(LOOP1)で、
メニューバーの「ロード」を押された時に、
LOOP1から「ロード」ループへ移らなくてはなりません。
そしてその「ロード」ループから「セーブ」ループを押された時には・・・

という感じです。説明下手ですいません。
実際は、全部で3000行くらいあります。
最大でsublev=8になります。深いですが、これ以上浅くはならなそうです(涙)

この問題に関しては、お手上げ状態です・・\(><)/
何か参考にできるものや、知恵がありましたら、是非教えて下さい。お願いします。



kz3

リンク

2006/7/10(Mon) 21:52:22|NO.1313

> メニューで「リスト」を押すとリストページを表示します。
> mousex,mouseyとstickを使い、コンテンツを選択できるページです。

「リスト」の実装が不透明なので、回答者は予想せざるをえません。

メニューバーには「リスト」と「メイン」とがあり、
「リスト」を選択するとループで何か作業をする。
「メイン」を選択すると「リスト」による作業を中断させると予想して、

ループの外からループを制御させるにはフラグとか使います。

button gosub "お絵かき開始", *startDraw button gosub "お絵かき終了", *endDraw stop *startDraw if( isDraw ): return isDraw = 1 repeat await if( isDraw = 0 ): break pset mousex, mousey loop return *endDraw isDraw = 0 return



理沙

リンク

2006/7/15(Sat) 02:31:25|NO.1349

遅れて申し訳ありません。
kz3さん、ありがとうございます。

メニューバーについては実用サンプルが少ないので、
いい方法が見つかるまで色々やってみたいと思います。

そこで、メニューバーを選択した時の動作なんですが、
『プログラムは一行一行実行していく』としても、
onclick
onexit
などとメニューバーが同時に条件を満たしてしまう場合などは、
プログラムはどうやって動くのでしょうか?

例えば、メニューバーの「終了」をクリックした場合、制御は
onexitとメニューバー選択時動作のどちらに移るのでしょうか?

おそらく、付属サンプルのPostMessage hwnd, WM_CLOSE, 0, 0
がポイントなんだと思うんですが・・・

教えてもらえないでしょうか・・?
お願いします。



hiro

リンク

2006/7/15(Sat) 22:59:53|NO.1359

「onclick」は、クライアントエリア上で検知しますので
メニュー(例えば、ボタン等も)を押しても反応しないかと思います。

メニューを押した時は、WM_COMMAND(0x0111)メッセージが発生します。
その時の「oncmd」の処理で、
PostMessage hwnd, WM_CLOSE, 0, 0
がある時(今回の場合「終了」?)
WM_CLOSE(0x0010)メッセージが発生し終了します。
しかし、「onexit」が有効である時は、
終了せずに「onexit」のラベルに処理が移ります。
「onexit」で終了処理(例えば、「end」)を
しなかった場合ウィンドウは終了されません。

以下に、メッセージのテストを書いてみました。

#uselib "user32.dll" #func Post "PostMessageA" int,int,int,int screen 0 , 300 , 40 title "左クリックと終了メッセージテスト" objsize 260 , 20 : pos 20 , 10 button "PostMessage hwnd, WM_CLOSE,0,0",*test oncmd gosub *WM_LBUTTONDOWN , 0x0201 onclick gosub *on_click oncmd gosub *WM_CLOSE , 0x0010 onexit goto *on_exit stop *test dialog "WM_CLOSEをポスト" Post hwnd,0x0010,0,0 stop *WM_LBUTTONDOWN dialog "WM_LBUTTONDOWN" return *on_click dialog "onclick" return *WM_CLOSE dialog "WM_CLOSE" return *on_exit dialog "onexit" end



理沙

リンク

2006/7/16(Sun) 15:57:56|NO.1366

hiro様、ありがとうございます。
スクリプトを拝見させていただき、それを元に色々実験してみてやっと理解できました。
決して実行行が分岐したりすることはないのですねっ。

みなさま、どうもありがとうございました。

(他の箇所でも行き詰まってしまったので、新スレ立てますね)



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