DISPLAY命令(画面制御機能・データの表示)
- 
DISPLAY命令はいくつかありますが、これは画面制御機能の方のDISPLAY命令の方の説明です。 
 COBOL85言語説明書の一部を抜きだします。 
 DISPLAY {一意名}・・・ WITH {NO ACTUAL EXECUTING | BYPASS MODE} [{BEFORE | AFTER} ROLLING [ LINE | LINES ]{整数-1 | データ名-1} {THROUGH | THRU}{整数-2 | データ名-2} {UP | DOWN}{整数-3 | データ名-3}[LINE | LINES]] ここでは、DISPLAY命令の2つの指定NO ACTUAL EXECUTINGとBYPASS MODEについて説明します。他のものはCOBOL85言語説明書を見てください。 
 
- NO ACTUAL EXECUTING
- A−VXのCOBOL85言語説明書の該当の箇所を読むと下のように書いてあります。 
 - NO ACTUAL EXECUTING句を指定すると実際の画面上への表示は行われず、NO ACTUAL EXECUTING句のないDISPLAY命令またはACCEPT命令が実行されるまで待たされ,その時点で実際の画面上への出力が行われる。 
 例えば、下のように記述したプログラムがあるとします。
 
 - 〜〜〜 DISPLAY aaa ・・・(1) DISPLAY bbb ・・・(2) DISPLAY ccc ・・・(3) DISPLAY ddd ・・・(4) 〜〜〜 - サーバにA-VX本体、PCにPC/WSエミュレータという構成のとき、このプログラムを実行するとサーバとPC間で情報の送受信が行われます。 
 まず、(1)のDISPLAY命令を実行するとサーバからPCにaaaの情報が送られ、PC側でaaaの内容が表示されます。
 次に(2)のDISPLAY命令を実行するとサーバからPCにbbbの情報が送られ、PC側でbbbの内容が表示されます。
 同じように(3)の命令を実行するとcccが、(4)の命令を実行するとdddの情報がPCに送られます。
 - たぶんこれ以外にも、サーバからPCに「これから情報を送るよ」とか、逆にPCからサーバに「情報を受け取ったよ」とか「表示したよ」というような情報が送られているかもしれません。詳しい仕組みはよくわかりませんが・・。要するにサーバとPC間でたくさんの情報が行き来することになります。 
   
 下のようにプログラムを変更したとします。「WITH NO ACTUAL EXECUTING」を追加しています。
 - 〜〜〜 DISPLAY aaa WITH NO ACTUAL EXECUTING ・・・(1) DISPLAY bbb WITH NO ACTUAL EXECUTING ・・・(2) DISPLAY ccc WITH NO ACTUAL EXECUTING ・・・(3) DISPLAY ddd ・・・(4) 〜〜〜 - ※WITHやACTUALは省略可なので、DISPLAY aaa NO EXECUTINGでも良い。 
 - (1)のDISPLAY命令は、NO ACTUAL EXECUTING付きなので、aaaの内容はサーバ内に貯められます。(2)と(3)の命令も同じなので、やっぱりbbbとcccの内容はサーバ内に貯められます。 
 (4)のDISPLAY命令は、NO ACTUAL EXECUTINGが無いので、ここでサーバからPCにaaaとbbbとcccとdddがまとめて送られて、PC側でこれらがまとめて表示されます。
 何に役に立つかというと、サーバとPC間の情報のやり取りが減るので、通信回線が細いときやサーバのCPU使用率が高いとかいうときに役に立つようです。
   
 - 最近は回線速度も速いですし、サーバの性能も良くなっているので、あまり使われない指定かなと思います。 
 - まとめてドンと画面に出す方式になるので、プログラムの作りによっては違和感のある出方になったりすることがあるらしいです。 
 その他にも注意すべき事項がたくさんあるので、A−VXのCOBOL85言語説明書を良く読んでおいたほうが良いです。
 
- BYPASS MODE
- まずA−VXの仕組みから。 
 - A−VXはWindowsと同じように、たくさんのジョブを同時に実行できます。たくさんのジョブを実行できるということは、Windowsと同じように複数の画面が表示されるということになります。残念なことに、A−VXはWindowsのように複数の画面を横に並べたり、すこしずらして重ねたりすることはできません。(A−VXの画面も横に並べられるよという人もいるかもしれませんが、そのような裏技的な方法は考えません。)全部の画面が画面いっぱいで重なった状態になります。Windowsでなら、全部のウインドウが全画面表示になっている状態といえばわかるでしょうか。 
   
 - Windowsでは、後ろの方のウインドウを前に出すときは、一部見えている部分をクリックするとか、タスクバーのアイコンをクリックしたりします。A−VXでは「画面接続コマンド」というもので画面を前に出します。 
 - 本題に入ります。 
 - A−VXは複数の画面が完全に重なっているので、後ろの画面に表示した内容が見えません。(ある画面が別の画面に隠れている状態、隠れてしまっている画面のことを裏画面(あるいは画面切り離し状態の画面)とも言う)もしプログラムでエラーを検出して「エラーが発生しました。」みたいなメッセージを表示したとしても、その後にそのままプログラムが先に進んで終わってしまったら、プログラム終了と同時にエラーを表示した画面も無くなってしまうので誰も気が付かないかもしれません。 
 - そこで通常は画面が後ろになっているときにDISPLAY命令で何か表示をしようとしたときには、画面が一番前(画面接続状態)になるまでプログラムが止まってしまいます。(裏画面で何か表示しようとしているよ、ということで画面右下に「*」印が表示されます。) 
 画面が一番前に来てメッセージが表示されると「誰かが見てくれた」ということになり、ようやく先に進みます。
   
 - 誰かに見てもらうためにDISPLAYを行うので、普通はそれでよいのですが、困ることもあります。 
 「今からphase2を実行します。10分ぐらいかかります」のようなメッセージを表示してすぐに10分ぐらい処理を行うようなプログラムがあったとします。
 このメッセージは「今から10分ぐらいかかるよ」程度の情報で別に表示されなくてもかまわないようなものなので、誰かが確認するまでいちいち止まってくれては困るというものだとします。
 ところが画面が後ろ側に隠れているとこのメッセージを表示しようとするところで止まってしまうので、画面を一番前にしない限り10分経っても20分経っても、永遠にずっとプログラムは止まったままになってしまいます。
 - そのようなときにBYPASS MODEを使用します。DISPLAYにこの指定を行うと画面が後ろ側に隠れている時は、プログラムを止めずに表示自体をスキップします。 
 


