トピック
しんいち stgf1080

画面サイズ判定(LOCATEバグ?)

ふとFILES 3列で表示しようと思い、プログラムしてたら画面サイズの判定方法思い付いたのでそれと共に組み上げたのですが、惜しいところでバグって困ってます。 本命は画面サイズ判定なのですが、やってることは画面サイズの種類毎にコンソール幅、高さいっぱいにPRINTした際のシステム変数CSRX,CSRYの値から判定してて、そこは上手くいっているようです。 ただ、コンソール使ってるので判定終わったらコンソール元に戻そうとしたのですが、それが上手くいきません。どうやらLOCATEの動作があやしそうなのですが、BIGでLOCATEバグってるって話ありましたっけ? 現象はXSCREEN 5,4以上のサイズの時だけLOCATE指定からずれた位置にPRINTされるというものです。BIGのバグのような気がしてるんだけどいまいち自分のプログラムにも自信がなくて。
1そうだね
プレイ済み
返信[1]
親投稿
しんいち stgf1080
キー載せときます。 公開キー:4DN5R3XD ファイル:EXFILES また、他の画面サイズ判定方法とかありましたら、教えていただけると幸いです。
1そうだね
プレイ済み
返信[2]
親投稿
otta777 otta777a
29行目にCLSを挿入すれば問題は解決します。 コンソールの高さを取得するときにCHR$(10)を想定されるコンソールの 高さの数だけ表示してシステム変数CSRYと比較していますが XSCREEN 5の時は高さが50行になっているので10行ほど 画面がスクロールするため画面に文字が残りますがXSCREEN 4以下の 場合は高さが30行しかないので画面の文字が全てスクロールしてしまい 画面に文字は残りません。 このためにずれた位置に表示されたように見えたのでは無いでしょうか?
0そうだね
プレイ済み
返信[3]
親投稿
しんいち stgf1080
おぉ~、CLSで上手く動くようになりました(^o^) #CLS気付かなかったとは。。。恥ずかしい^^; ただ、まだちょっと謎があるのでもう少し調べようと思ってます。 説明しときますと、画面の幅/高さ種類の配列用意しといて、サイズ大きい方から「PRINTサイズいっぱい」を実行していって、想定していたサイズとCSRX,CSRYが一致していればその画面サイズだろうと判定しています。 で、大きいサイズから「PRINTサイズいっぱい」を順に実行しているので、毎回かならず全画面スクロールして、画面に文字残らないはずなんですよね。 とは言え、デバッグの糸口掴めたような気がします(CLSで動いてるからそれで良いっちゃ良いんですけど、気になるもので^^;)。
0そうだね
プレイ済み
返信[4]
親投稿
しんいち stgf1080
結局なんで文字ずれるのかはよく分かりません。CLSでカーソルの位置情報とかリセットされてなんか上手いこと行ってるんでしょう(適当^^;)。 一応関数化しておきました。今まで画面サイズ判定諦めてた方にはお役に立つかもしれません。 公開キー:43VEA3KD ファイル:FILESW プログラムはサンプル的にFILESを複数列で表示するものになってますが、それで使ってるDISPSIZEっていうのが画面サイズ判定関数になってます。
0そうだね
プレイ済み
返信[5]
親投稿
otta777 otta777a
文字がずれる理由はコンソール画面の高さに対して表示している CHR$(10)の数が画面に表示されている文字をスクロールアウト させるのに足らないからです。 XSCREEN 5の時はコンソール画面の高さが50行になっています。 最初のプログラムで24~27行の部分でグラフィック画面のドット数から 計算したコンソール画面の高さに合わせてCHR$(10)を表示していますが 480ドットの場合でも60個しか表示されないため画面に表示されている 文字が残ってしまいます。これが文字の表示位置がずれたように見えた 原因だと思います。 >毎回かならず全画面スクロールして、画面に文字残らないはず という仕様を想定していたようですがXSCREEN 5の場合は残ってしまって いたというわけですよ。
1そうだね
プレイ済み
返信[6]
親投稿
しんいち stgf1080
う~ん、高さ480ドットでWIDTH 8なら改行60個で足りてると思うんだけど。 もしかして高さ480ドットなのにプログラムでは改行50個しかPRINTしてなかった?でもそれならサイズ判定自体上手く行かないはずなんだよなぁ。 otta777さんの説明を私が理解できていないのかなぁ(>_<)
0そうだね
プレイ済み
返信[7]
親投稿
しんいち stgf1080
いやぁ~、ようやく分かりました。 #物分かり悪くてすみませんm(__)m 画面高さいっぱいにPRINTする際に、LOCATE ,0してからPRINTしてたから、画面スクロールせずに単に上書きしてたんですね。で、高さ480ドットの場合CSRYの最大は59なので、そこに改行60個PRINTしたとしても1行しかスクロールしてなかったから、ちょっとずれてたと。 やっとスッキリしました(^o^) otta777さん、物分かりの悪い私にお付き合い頂いてありがとうございました。
1そうだね
プレイ済み
返信[8]
親投稿
otta777 otta777a
LOCATE命令で画面の上からCHR$(10)を表示してるって書かなかったから 分かりにくかったですね。 原因が分かって頂けたようで何よりです。 動作がおかしい場合は途中にSTOPを挿入してどこまでが想定通りの 動作をしているか確認するのも一つの手です。 今回自分もそれで原因が分かりました。
1そうだね
プレイ済み
返信[9]
親投稿
しんいち stgf1080
ほんと助かりました。勝手にLOCATEバグってると思い続けるところでした^^; それで今回気付いたんですけど、先の関数ではコンソール高さの戻り値が、CSRYの最大値より1つ大きかったので、一応そこをCSRYの最大値戻すように直しておきました。 公開キー:RRC3EK8E #細かいですけど気になったもので。
1そうだね
プレイ済み