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


HSPTV!掲示板


未解決 解決 停止 削除要請

2010
0724
アイルーウィンドウの管理・遷移について(画像ボタンを使用)6解決


アイルー

リンク

2010/7/24(Sat) 20:06:30|NO.33887

お世話になっております。
先日こちらでご助力いただいたおかげで、何とか動けるものを作れました。

しかしながら、通常のボタンを使用していた時には、普通に動いてくれていたものが、
画像ボタンを使用することにより、画面への遷移ができなくなってしまいました。

やりたいこととしては、

○*top(screen0で表示)//トップ画面  ├○*greeting(screen0で表示)//挨拶画面  ├○*help(screen0で表示)//ヘルプ画面  ├○*exit(screen0で終了)//終了処理  ├○*titlelist(screen0で表示)//タイトル一覧画面  | └●*title_click(screen3で表示)//画像表示  ├●*slide(screen3で表示)//スライドショー表示画面  └●*thumbnail(screen3で表示)//サムネイル表示画面    └●*thumbnail_click(screen4で表示)//画像表示
というような感じになります。
(現在○は画面を表示でき(遷移が可能)、●は遷移できません)


今でも個々の機能ごとには動作しますので、
個々のソースが原因というわけではなさそうです。
(ソースは内容が重複していたり、お見苦しいところも多々あるとは思いますが、
何とか動いておりました。)

以上の理由により、どこが原因でボタン押下時の遷移が行えないのかがわかりません。
ソースがあまり長いものはいけないとのことなので、
画面IDが関わる部分以外は省略致しました。(わかりづらかったら申し訳ありません。)


ソースは

// 初期ウィンドウをディスプレイサイズで作成 screen 0, ginfo_dispx, ginfo_dispy // 表示サイズを設定 width 800, 600 /*************************** * トップページ * ***************************/ *top onexit gosub *exit // プログラムの終了処理 cls // 画像読み込み用バッファ作成を作成 buffer 2 : picload "image1.bmp" // 背景画像 buffer 3 : picload "image2.bmp" // タイトル画像 buffer 4 : picload "image3.bmp" // その他画像 buffer 5 : picload "image4.bmp" // その他画像 buffer 6 : picload "image5.bmp" // ボタン画像 screen 0, 800, 600 // ウィンドウを作成 /* 画像読み込み処理 … 省略 */ /* メッセージ表示処理 … 省略 */ objsize 250, 50 // ボタンサイズ // 250×50サイズのボタンを、縦に3個、横2列に並べています repeat 6 if cnt >= 0 & cnt < 3 { pos btnX, 360 + cnt*50 button "", *btnclick btnimg cnt, 6, 0, cnt*50, 250, 50 } if cnt >= 3 & cnt <= 5 { pos btnX + 270, 360+cnt*50-150 button "", *btnclick btnimg cnt, 6, 0, cnt*50, 250, 50 } loop stop *greeting /* 省略 */ *help /* 省略 */ /*************************** * タイトル一覧 * ***************************/ /* タイトル一覧画面を表示 */ *titlelist onexit gosub *exit // プログラムの終了処理 cls // 画面を初期化 screen 0, 800, 600 /* 画像表示・ポジション処理 … 省略 */ // タイトルリストを表示するポジション pos x, 50 : gosub *caption // *captionに処理を移す /* リストボックス表示処理 … 省略 */ // 画像表示用ボタン objsize 160, 50 button "", *title_click btnimg 1, 6, 0, 350, 160, 50 stop /* 「画像を表示」ボタン押下時の処理 */ *title_click /* 画像読み出し用の桁合わせ処理 … 省略 */ screen 3, 800, 650 // ウィンドウID3を作成 /* キャプション取得処理 … 省略 */ // 画像読込 cvload "image\\" + nResultNum + ".bmp", 2 /* 画像縮小処理 … 省略 */ cvgetimg 2, 0 // 画像を表示 pos 15, 620 mes strListboxText // 閉じるボタン pos btnPosBackX + 170, 580 objsize 110, btnSizeH id = stat button "", *exit btnimg cnt, 6, 0, 400, 110, 50 stop /*************************** * スライドショー * ***************************/ /* スライドショーを表示 */ *slide // プログラムの終了処理 onexit gosub *exit // ウィンドウID3を作成 screen 3, 800, 650 // ディレクトリ一覧を作成 dirlist imgFileDir, "image\\*.bmp", 0 // 変数をメモリノートパッド命令のバッファに設定 notesel imgFileDir repeat notemax //行数分繰り返す /* 画像縮小・表示処理 … 省略 */ buffer 1, 800, 650 //フェードイン用画面 cvgetimg 0, 0 // ウィンドウ3に画像を表示 color 255 //フェードイン処理 gsel 3 /* フェードイン処理 … 省略 */ wait 200 // 表示間隔を設定 //フェードアウト用画面 buffer 1, 800, 650 gcopy 3, 0, 0, 800, 650 //フェードアウト処理 gsel 3 /* フェードアウト処理 … 省略 */ loop stop // 処理の停止 /*************************** * サムネイル表示 * ***************************/ /* サムネイル一覧画面を表示 */ *thumbnail onexit gosub *exit // プログラムの終了処理 onclick goto *thumbnail_click /* サムネイル表示処理 … 省略 */ // サムネイルウィンドウを初期化 if( bImgSizeY < 600 ) { screen 3, bImgSizeX, 600, 0 } else { screen 3, bImgSizeX, bImgSizeY, 0 } /* サムネイル表示処理 … 省略 */ // 画像読み込み用バッファ作成 buffer 2, , , 0 i/* サムネイル表示処理 … 省略 */ stop /* 押下時の処理 */ *thumbnail_click // サムネイルウィンドウをクリックした場合 if( ginfo_act == 3 ) { /* サムネイル画像縮小・表示処理 … 省略 */ // 画像表示 if ratioX < ratioY { screen 4, windowSizeX, ratioX * imgSizeY, 0 } else { screen 4, ratioY * imgSizeX, windowSizeY, 0 } /* サムネイル画像縮小処理 … 省略 */ gsel 3 // 描画先をサムネイルウィンドウに戻す } } } stop /*************************** * 共通処理 * ***************************/ /* プログラムの終了処理 */ *exit /* 省略 */ /* テキストからキャプションを読み込む */ *caption /* テキストデータ取得処理 … 省略 */ return // 処理を戻す /* ボタン押下時の処理 */ *btnclick if stat = 0 : goto *greeting if stat = 1 : goto *help if stat = 2 : goto *exit if stat = 3 : goto *titlelist if stat = 4 : goto *slide if stat = 5 : goto *thumbnail

となります。

動かなくなったきっかけとしては、ソースの29行目
// 250×50サイズのボタンを、縦に3個、横2列に並べています

以降の画像ボタンを使用してからになります。 (以前は通常のボタンを使用しておりました) ボタン押下時は、statの結果により、gotoで遷移させるようにしました。 遷移できない原因は、ウィンドウIDの指定等によるものなのでしょうか。 説明が足りず、わかりづらかったら申し訳ありません。 どうぞよろしくお願い致します。



この記事に返信する


テック

リンク

2010/7/24(Sat) 21:45:12|NO.33902

>しかしながら、通常のボタンを使用していた時には、普通に動いてくれていたものが、
>画像ボタンを使用することにより、画面への遷移ができなくなってしまいました。

質問内容が遷移ができないということですので、

#include "llmod3/llmod3.hsp"
#include "llmod3/misc.hsp"
#include "hspcv.as"
↑をインクルードしてないことで、
エラーが発生するということではないようですね。

原因が↓の処理以降を追加したことみたいなので、

// 250×50サイズのボタンを、縦に3個、横2列に並べています repeat 6 if cnt >= 0 & cnt < 3 { pos btnX, 360 + cnt*50 button "", *btnclick btnimg cnt, 6, 0, cnt*50, 250, 50 } if cnt >= 3 & cnt <= 5 { pos btnX + 270, 360+cnt*50-150 button "", *btnclick btnimg cnt, 6, 0, cnt*50, 250, 50 } loop

if文の条件を括弧で括っていないことで、
意図しない条件で処理しているかもしれません。

if (cnt >= 0) & (cnt < 3) { pos btnX, 360 + cnt*50 button "", *btnclick btnimg cnt, 6, 0, cnt*50, 250, 50 } if (cnt >= 3) & (cnt <= 5) { pos btnX + 270, 360+cnt*50-150 button "", *btnclick btnimg cnt, 6, 0, cnt*50, 250, 50 }

あと過去スレのNO.20594でですが、
Windows Vista環境でllmod3のbtnimgが使えないというスレがありました。
原因としてmisc.hspにバグがあるようです。

私も、Windows Vista環境でバッチリとエラーがでました。
Windows Vista以外の端末で、引き続き調べようと思います。



アイルー

リンク

2010/7/25(Sun) 01:27:45|NO.33909

テック 様

こんばんは。
ご返答ありがとうございます。

includeに関しては、処理的に必要な以下のもの
#include "hspcv.as"
#include "scrlbar.hsp" #include "llmod3\\llmod3.hsp" #include "llmod3\\misc.hsp" #include "obj.as"
を指定しております。(エラーも発生しておりません)

btnimgについては、こちらの掲示板の過去ログも検索しましたので、
Vista環境でエラーが発生するということは存じてはおります。
当方の環境はXPなのですが、うまく遷移が行えず…

当方で試したものとしては、btnimgを使用する際、screen0、3、4の3種の簡易画面を作り、
mesで表示させただけの画面で遷移が行えるか試してみましたが、やはり遷移が行えませんでした。

btnimgを使用する際、
ttp://quasiquote.org/hspwiki/HSPHelp:btnimg
ttp://hsp.tv/play/pforum.php?mode=pastwch&num=5998 ttp://hsp.tv/play/pforum.php?mode=pastwch&num=20594 ttp://www.onionsoft.net/hsp/bbs/log/86.html(12041・12043・12052)
などを参考に致しました。
ウィンドウIDも4までになるので、問題ないとは思うのですが…

尚、一応ソースをscreenとmesくらいにして、簡潔なプログラムで実験してみました。
#include "hspcv.as"
#include "scrlbar.hsp" #include "llmod3.hsp" #include "misc.hsp" #include "obj.as" // 初期ウィンドウをディスプレイサイズで作成 screen 0, ginfo_dispx, ginfo_dispy // 表示サイズを設定 width 800, 600 // ポジション btnPosBackX = 500 btnPosBackY = 510 // ボタンサイズを指定 btnSizeW = 250 btnSizeH = 50 *top onexit gosub *exit // プログラムの終了処理 cls // 画像読み込み用バッファ作成を作成 buffer 6 : picload "image.bmp" // ボタン画像 screen 0, 800, 600 objsize 250, 50 repeat 6 if cnt >= 0 & cnt < 3 { pos btnX, 360 + cnt*50 button "", *btnclick btnimg cnt, 6, 0, cnt*50, 250, 50 } if cnt >= 3 & cnt <= 5 { pos btnX + 270, 360+cnt*50-150 button "", *btnclick btnimg cnt, 6, 0, cnt*50, 250, 50 } loop stop *greeting onexit gosub *exit cls mes "*greeting" // 前画面遷移 pos btnPosBackX, btnPosBackY objsize btnSizeW, btnSizeH button "", *top btnimg cnt, 6, 0, 300, 250, 50 stop *help onexit gosub *exit cls mes "*help" // 前画面遷移 pos btnPosBackX, btnPosBackY objsize btnSizeW, btnSizeH button "", *top btnimg cnt, 6, 0, 300, 250, 50 stop *titlelist onexit gosub *exit cls screen 3, 800, 600 mes "*titlelist" // 画像表示用ボタン objsize 160, 50 id = stat button "", *title_click btnimg cnt, 6, 0, 350, 160, 50 // 前画面遷移 pos btnPosBackX, btnPosBackY objsize btnSizeW, btnSizeH id = stat button "", *top btnimg cnt, 6, 0, 300, 250, 50 stop *title_click onexit gosub *exit // プログラムの終了処理 screen 4, 800, 650 // ウィンドウID3を作成 mes "*titlelist" // 閉じるボタン pos btnPosBackX + 170, 580 objsize 110, btnSizeH id = stat button "", *exit btnimg cnt, 6, 0, 400, 110, 50 mes ginfo_act : stop stop *slide onexit gosub *exit screen 3, 800, 650 mes "*slide" stop *thumbnail onexit gosub *exit onclick goto *thumbnail_click screen 3, 800, 600 mes "*thumbnail" // 画像表示用ボタン objsize 160, 50 id = stat button "", *thumbnail_click btnimg cnt, 6, 0, 350, 160, 50 stop *thumbnail_click screen 4, 800, 600 mes "*thumbnail_click" stop *exit // ウィンドウIDが0以外はウィンドウを非表示 if ginfo_act = 0 { end } else : if ginfo_act = 3 { gsel wparam, -1 } else : if ginfo_act = 4 { wait 20 : gsel wparam, -1 : gsel 3 : return } /* ボタン押下時の処理 */ *btnclick if stat = 0 : goto *greeting if stat = 1 : goto *help if stat = 2 : goto *exit if stat = 3 : goto *titlelist if stat = 4 : goto *slide if stat = 5 : goto *thumbnail

その結果、ウィンドウは表示されるようになりました。
しかし、上記ソース内に、実際のメソッドを入れると、やはり画面の遷移ができなくなってしまいます。

とりあえず補足させていただきました。

まずは、
if文の条件を括弧で括っていないことで、
意図しない条件で処理しているかもしれません。 if (cnt >= 0) & (cnt < 3) { pos btnX, 360 + cnt*50 button "", *btnclick btnimg cnt, 6, 0, cnt*50, 250, 50 } if (cnt >= 3) & (cnt <= 5) { pos btnX + 270, 360+cnt*50-150 button "", *btnclick btnimg cnt, 6, 0, cnt*50, 250, 50 }

のようにして、動かしてみたいと思います。
ありがとうございます。



アイルー

リンク

2010/7/26(Mon) 03:02:24|NO.33963

補足させていただきます。

まず、NO.33902でご指示いただいたように、if文の条件を括弧でくくって動作させましたが、
変わりませんでした。

また、NO.33909にてscreenとmes機能のみの簡易ソースで動作させたところ、
動作したとご報告させていただきましたが、
「*slide」「*thumbnail」「*thumbnail_click」の完成済みメソッドを入れたところ、
問題なく動作致しました。

現在表示できないのは、「*titlelist」と「*title_click」ということになります。
やはりbtnimgの関係なのでしょうか?



アイルー

リンク

2010/7/29(Thu) 22:38:30|NO.34077

お世話になっております。

自分なりに解析してみました。

どうやら、No.33887の15行目からのbufferでの画像呼び込みで、重すぎてその先が動かなくなるようです。
試しに、全て画像を使わない簡易プログラムを書き、その中に完成している
「タイトル一覧」「スライドショー」「サムネイル表示」機能を挿入したところ、
無事に動くことを確認しました。

そこで問題なのが、どうしてもTOP画面に画像を使用しなければなりません。

HSPの参考サイトに、

> ちなみに、バッファ画面は用意すれば用意するだけメモリを消費します。
> 複数の画像ファイルを1つのバッファ画面でやりくりするのと、
> 1つの画像ファイルに対して1つのバッファ画面を用意していくのとでは、
> メモリ消費量が違います。ここらへんはあまり敏感になることはないですが、
> ムダにバッファ画面を乱立させないようにするといいでしょう。

とありましたので、画像を全てひとつのファイルにまとめ、(画像サイズ:1050×1300)
bufferで読み込んだところ、やはりtop画面のボタンから遷移できなくなりました。

bufferの初期化(実際は1×1などで再設定するとのことですが)も考えましたが、
最初にbufferを読み込む時点で、その先の処理に進めなくなりますので、
どうしたらいいか、皆目見当もつきません。

どうかご助力の程、よろしくお願い致します。



nns

リンク

2010/7/31(Sat) 08:47:16|NO.34112

普通のPCで1050x1300程度の画像をロードしたぐらいじゃフリーズしないと思うけどなあ
アイルーさんのPCのスペックってどのくらいですか?
本当にバッファ読み込み時点でフリーズしているかどうか、読み込んだあとにlogmes命令つかって調べてみては?



アイルー

リンク

2010/8/8(Sun) 16:13:03|NO.34307

nns 様

返信遅くなり申し訳ありません。

自分のPCのスペックですが、
Pentium 4 2.80GHz
2GB RAM

となります。

logmesでログを吐き出しながら処理を行なったところ、
フリーズしているわけではありませんでした。
(画面は真っ白だったので、フリーズしていると思い込んでおりました)

原因はウィンドウIDの競合?ではないかと思います。
(ウィンドウIDがかぶってしまい、うまく表示されなくなっているようでした)

screen IDとbuffer IDをかぶらないようにしたところ、問題なく表示されました。
初歩的な原因でお騒がせいたしました。

ご助言ありがとうございました。



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