標準TTLだけ(!)でCPUをつくろう!(組立てキットです!)
(ホントは74HC、CMOSなんだけど…)
[第576回]

●XPの画面表示のゴミ対策

前回、WindowsXP(およびWindows2000、おそらくWindows7も)のコマンドプロンプトでは、スクロールバーを操作することによって、上にスクロールして消えてしまった画面を下に戻して表示させることができるのですが、その機能があだとなって、Z80BASICを起動すると、画面に以前の表示(つまりゴミ)が消えないで残ったままになってしまいます、と書きました。

それについては、まずゴミを消してしまってから、新しい表示を行うという対策を、以前に考えていたらしいのですが、そのことをすっかり忘れてしまっていました。
あらためて、その対策(putc()で画面にスペースコード(0x20)を79個出力する)について検証してみますと、2つの問題点があることがわかりました。

1つはその対策を含むプログラムをWindows98で実行すると、画面表示が非常に遅くなってしまう、という点です。
しかしこの点については、プログラムをWindows98用とWindowsXP用の2本立てにすることで、問題を回避することができます。

もうひとつは、この対策について検証をしていく過程でたまたま気が付いたことで、ゴミ消去が不完全で、行の右端の最後の1文字が消えずに残ってしまう、という点です。

実は、その両方を一気に解決してしまう、うまい方法に気がついたのです。
その方法について説明をいたしますまえに、beforeとafterの、まずbeforeの方をじっくり見ておいていただくことにいたします。

(1)まずは、前回にもお見せした画面です。

これは、afterの1つの方法で、WindowsXP用の対策をとったあとのプログラムでの表示です。

(2)こちらは、WindowsXP用の対策をとっていないプログラムでの表示です。

Z80BASICを起動する前の表示がそっくり残ってしまっています。
実はこの部分については、system(”cls”);を実行するようにすることで、最初にお見せした(1)の画面のようにゴミを消すことができました。
最初の画面(1)のプログラム(zb2u.exe)では、そのようにしています。

Windows98しか意識していなかった(2)の画面のプログラム(zb2t.exe)では初期画面のクリアはsystem(”cls”);を使わないで別の方法で行っていたために、WindowsXPではゴミが消えずに残ってしまいました。
ただ、system(”cls”);については、それをWindows98で実行しても支障なく動作することが確認できましたので、ここのゴミ表示対策としては、そのようにすれば、つまりWindows98用とWindowsXP用に分けて考えなくても、system(”cls”);を使うようにすれば、解決できることになります。

しかし、今回は、そのようにしなくても、つまりWindowsXPを意識していないzb2t.exeでも、ゴミを表示させることなく実行できる、ある方法に気がつきましたので、その説明のためのbeforeとして、まず、上の画面を見ておいていただきたいのです。

●まずはスクロール(バー)について調べて見ましょう

スクロールバーによって制御されている、画面バッファをプログラムで直接アクセスできれば、なんとかなりそうなのですが、なにせMicrosoft様のことですから、そういうことはお許しいただけないようです。
あるいは、そのための情報も捜せばどこかにあるのかもしれませんが、いずれにせよ余り一般的な対策にはならないようです。
余り特定の機種(OS)に依存する対策は、あとで泣くことになりますから、深入りは禁物です。

そこで、通常のC++プログラムでさわれる範囲で、WindowsXPのコマンドプロンプトの、画面スクロールの仕組みについて、さぐりを入れてみることにいたしました。
Borland C++で簡単なプログラムを作って、実行してみました(下のリストです)。

#include <stdio.h>
#include <conio.h>
void main()
{
int i,x,y;
for(i=0;i<10000;i++)
	{
	x=wherex();y=wherey();
	printf("i=%d,x=%d,y=%d\n",i,x,y);
	}
}

上のプログラムを実行した結果です。

wherex()の戻り値は、カーソルの現在位置のx座標(画面の横方向で、行の左端を1とする桁位置)で、wherey()の戻り値は、カーソルの現在位置のy座標(画面の縦方向で、一番上の行を1とする行位置)です。
何かがわかるかもしれないと思って、あてずっぽうで、とりあえず試してみたのですけれど、大当たりでした。

10000行、表示させてみたのですが、行表示はy=300で止まってしまっています。
右のスクロールバーは一番下に落ちています。
む?
ということは?

スクロールバーを一番上まで戻してみました。

おお。
画面を戻すことができるのは、わずかにこれだけ。
たったの300行です。
そこから上は永久に消えてしまっています。

いやあ。
いくらなんでも、たった300行ということはないでしょうよ。

すると、おそらく、どこかにこの行数を変える機能があるはず。

まあ。なんとうかつといいますか、ここまで来るまで、何にも調べてなかったですものねえ。
なにしろ、思い込みがはげしいものですから、つい先入観だけで突っ走ってしまいます。

●コマンドプロンプトのプロパティ

コマンドプロンプトのプロパティを開いてみました。

コマンドプロンプトの上側の青い部分をマウスで右クリックするとメニューが表示されます。
その中のプロパティをマウスでクリックします(左クリックでも右クリックでも開きます)。

レイアウトタブをマウスで左クリックして選択します。

すると。
おお。
画面バッファのサイズが表示されました。
私のWindowsXPでは、ここの高さ(H)がデフォルトでは300(行)になっています。
やっぱり思ったとおりで、この値は変えることができるようです。

●画面バッファのサイズを25(行)にしてみました

通常のWindows98のDOSプロンプト画面の表示行数と同じ25にしてみました。

そのあと、OKボタンを押します。

「ショートカットへのプロパティの適用」という表示が開きます。

今回はまず、さぐりを入れただけですから、現在のウィンドウだけに適用する、を選択して、OKボタンを押します。
すると。

●スクロールバーが消えました!


これなら、多分Windows98と同じはずです。

同じになりました!

スクロールバーが表示されている状態では、画面にゴミが残ったままになってしまう、WindowsXP未対策のzb2t.exeを実行させているのですが、ご覧のように、ゴミは全くみあたりません。
最初のスクロールバー付きでの実行画面と見比べてみてください。
どちらも同じzb2t.exeです(上のブルーのバーにzb2tの表示があります)。

Z80BASICでは、WindowsXPのスクロールバーは邪魔なだけで全く利用価値がありませんから、事前に上記の操作をしていただいて、スクロールバーを無効にしていただければ、問題解決です。
その場合には、Z80BASIC・リモートプログラムへのショートカットを作成しておいていただいて、さきほどの「ショートカットへのプロパティの適用」のところで、「このウィンドウを起動したショートカットを変更する」を選択していただければ、設定は最初の一回だけで済みます。

これにて一件落着。
めでたし、めでたしです。

そうなのですけれど。
しかし…。
2010.8.7upload

前へ
次へ
ホームページトップへ戻る