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


HSPTV!掲示板


未解決 解決 停止 削除要請

2014
0513
ヒラギノscreen と gsel について9解決


ヒラギノ

リンク

2014/5/13(Tue) 23:07:35|NO.61981

タイトルを見ただけでは、1つの質問に見えますが、2つとも関連性のない2つ質問させてください。

2つとも問題を再現できるスクリプトを作れなかったので、
下記からファイルをダウンロードしてください。(開発中の Editor です。)

https://www.dropbox.com/s/ra2pz558w8lcexq/Editor%20v2.zip

質問その1

Editor.hsp を実行して、File の下にある+マークのアイコンをクリックしてください。
新規ウィンドウ(タブ)が表示されますが、左矢印マークで前回の場面に戻ってください。

*Back から、*View に飛びますが、view.as の15行目

screen VieWindow, (ginfo_sizex-288), (a/wi+3)*135+90, 2

でスクリプトが止まってしまします。何故でしょうか? 質問その2 Editor.hsp を実行して、File の下にある+マークのアイコンをクリックしてください。 新規ウィンドウ(タブ)が表示されますが、左上の左矢印マークで前回の場面に戻ってください。 上記の手順を2~3回繰り返し新規ウィンドウ(タブ)を複数枚作ります。 そのあと、最後のウィンドウの右上の上矢印マークでサムネイルを表示します。 tab.as の3行目のループで、1枚目のウィンドウから順にサムネイルを作成するはずですが、 何故か最後に開いていたウィンドウが先頭に表示されてしまします。 実際には、1枚目のウィンドウから順にサムネイルを作成したいです。



この記事に返信する


ヒラギノ

リンク

2014/5/13(Tue) 23:09:22|NO.61982

質問その2から表示が崩れてしまいました><

質問その2

Editor.hsp を実行して、File の下にある+マークのアイコンをクリックしてください。
新規ウィンドウ(タブ)が表示されますが、左上の左矢印マークで前回の場面に戻ってください。

上記の手順を2~3回繰り返し新規ウィンドウ(タブ)を複数枚作ります。

そのあと、最後のウィンドウの右上の上矢印マークでサムネイルを表示します。
tab.as の3行目のループで、1枚目のウィンドウから順にサムネイルを作成するはずですが、
何故か最後に開いていたウィンドウが先頭に表示されてしまします。

実際には、1枚目のウィンドウから順にサムネイルを作成したいです。



あり

リンク

2014/5/14(Wed) 08:04:17|NO.61985

『hscallbk.as』や『footy2.as』他がないと動かせないので
動作に必要なファイルを【全て】同梱してください。



ヒラギノ

リンク

2014/5/14(Wed) 15:50:49|NO.61988




Mameshiba

リンク

2014/5/15(Thu) 17:31:21|NO.62002

質問その1の回答

何故そうなるのかは分からなかったのですが…

if scr = 0 : screen VieWindow, (ginfo_sizex-288), (a/wi+3)*135+90, 2 : scr = 1 : else : gsel VieWindow
に変えればちゃんと動作するはずです。(Windows7 HomePremium 64bit hsp3.4beta)



掘木

リンク

2014/5/15(Thu) 18:36:54|NO.62005

コメントが皆無で泣きそうでした。

そしてFileの+を押した際に真っ白の矩形が画面上に現れるだけのケースに大苦戦。なんじゃこりゃぁ。

質問1に関して
スクリプトがそこで停止しているのではなく、
大量に来るWM_MOUSEMOVEの割り込みがscreen時に発生しているように思えます。
(oncmdを無効にするととりあえず改善がみられた為そう判断。実際はどうなんでしょうね?)

大量に来るWM_MOUSEMOVEはmousemove.asの末端にあるmouse命令が引き起こしています。
これによりmousemoveイベントの処理中にWM_MOUSEMOVEが発生し、
永遠とWM_MOUSEMOVEの処理に追われます。

NO.62002のMameshiba氏の回答もありかと思いますが、
個人的には割り込みが起こっても問題のない構造にするのがいいかと。
具体的にはoncmdの処理をgosubにする(return可能なので処理の続行が可能)。
この場合mousemove.asの末端のmouse命令がWM_MOUSEMOVEを発生させるため、
ネストオーバーになりますんでこれを切り捨てることに。(削っても大丈夫そうだった
(なんかこれで真っ白矩形がだいぶましに・・・。

質問2に関してはこちらからは明確な理由は分かりませんでした。
gselによる表示更新が即時ではないのでは? と推測してみる。
強引ですがtab.asのbuffer 19の確保後にawaitを挟むことで改善が見られました。

ついでにお節介な指摘を。
エディタ部分に当たる子ウィンドウ部分をクリックしてもウィンドウが前面に出てきません。
 ウィンドウのWS_POPUP属性を消し、WS_CHILD属性を付与すると改善するかと思われます。
また、エディタ部分の子ウィンドウは生成時非表示にしておいて
 表示物を設置し終わってから表示した方がいいかと。少なくともSetParent前から表示されてると・・・

WinXP環境でのテストでした。



ヒラギノ

リンク

2014/5/15(Thu) 19:03:28|NO.62007

>Mameshiba さん

解決できました。ありがとうございます!



ヒラギノ

リンク

2014/5/15(Thu) 19:32:16|NO.62008

>掘木 さん
>コメントが皆無で泣きそうでした。
気づかって頂いてありがとうございます><

>質問1に関して
そうだったのですね。
mouse を書いておかないとカーソルの画像が変更されないと思っていたのですが、
消しても大丈夫そうです。
oncmd の処理も gosub にしておきます。

>質問2に関しては・・・
await を入れたら改善しました。*Click のところもそうですが、
await を入れると動作が安定することがあるのは何故なんでしょうね。
これも解決です。ありがとうございます!

>ついでにお節介な指摘を。
WS_CHILD を指定したら、
*Back の gsel ginfo_act, -1 でウィンドウが非表示になってしまいました。
どうすればいいでしょうか?



掘木

リンク

2014/5/15(Thu) 21:12:20|NO.62011

>>ついでにお節介な指摘を。
>WS_CHILD を指定したら、
>*Back の gsel ginfo_act, -1 でウィンドウが非表示になってしまいました。
>どうすればいいでしょうか?

めんどくさかったら20番以降のウィンドウ全部非表示にすれば解決できそう・・・(ごり押しすぎるか。

・・・子ウィンドウがアクティブになる状況だと親側がアクティブになるから
表面にあるウィンドウが何か分からないですね。
(WS_CHILDのウィンドウはHSP的にはbuttonやinputと似た挙動になるので)
ボタンでなくoncmdでWM_LBUTTONUP(DOWN)で感知してるならginfoでとれるんですけどねー・・・

GetFocusでたった今押された(←)ボタンのハンドルを取得できる
GetParentで(←)ボタンの親ハンドル(ほしいウィンドウのハンドル)を取得できる
ShowWindowでSW_HIDE(0)を指定して非表示にすれば・・・
一見いけそうだけどbuttonから*backに飛ぶことが前提になるからメニューから閉じた場合等でばぐりそう。

無難にいくなら、予めアクティブ(というか表示されている)ウィンドウを変数にプールしとく でしょうか。

結局状況次第です。今後の拡張方針によって便利不便が決まるかと。(画面分割とかになるなら表示ウィンドウを変数に入れるのは扱いづらいですし?)

ついでに
21番以降にサムネイル用の画像生成してるけど、
タブ表示時じゃなくてウィンドウ表示消すタイミングに生成すれば、
タブ表示準備に一旦全てのウィンドウ出さずに済むような?

自分で作ってると気づかないけど人のだと気づくとかよくあること



ヒラギノ

リンク

2014/5/15(Thu) 21:59:48|NO.62014

>掘木 さん
>変数にプール
で解決です。ありがとうございます!
ginfo_act が 0 になっているとは気がつきませんでした。

>ついでに・・・
以前のバージョンでは、上記のような方法をとっていましたが、
こちらの方が便利かな。と思ったので方法を変えてみました。
でも、いちいち更新するのは負担が大きくなりそうですね。

うーん。。。



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