RPG

244. POPUPウインドウを表示すると親ウィンドウが消えてしまう ?!

DSPF でも POPUPウィンドウは WINDOWキー・ワードを使って定義することができる。

     WINDOW(開始行 開始桁 行数 桁数)
     OVERLAY
     CLRL(*NO)

と定義すればよいだけなので至って簡単に定義することができる。
ところが多くのユーザーの DSPFソースを見ていても WINDOWキー・ワードを使って
WINDOW レコードを定義している例をほとんど見たことがない。
これは何故だろうか ?
実際にやってみるとわかることであるが、上記のように WINDOWレコードを定義して
子ウィンドウを POPUP表示してみると親画面が消えてしまう !!

これは基本的な機能として大問題でありPOPUPとしての意味をなさなくなってしまう。
もとろんこの障害についてはIBMマニュアルのどこにも書かれていない。
あたかも正常に動作するようなことしか書かれていないのである。
そこでユーザーとしては PUTOVR や KEEP, FRCDTA 等々追加してみるが一向に解決できない。
下手に PUTOVR、OVRDTA, OVRATR などを追加すると後日、痛い目に会うことは間違いない。

そこで PUTOVR + OVRDTA などを無理やり使って
所定の位置に重ね表示する強引なやり方をする人も出てくるが、
それではWINDOWの開始位置を動的に変化させることはできない。
WINDOW レコードのよいところはプログラムに応じて
表示の開始位置を動的に変化させることができることにある。
一般には要求された項目から表示を開始することが
GUI の暗黙のルールとして定められている。
中には背景も強引に書いて背景つきの画面を作り上げて
「これをうちではPOPUPと呼んでいます」というソフトウェア・ハウスには驚いたことがある。

実は次のようなダミー・レコードを追加して CRTDSPF でコンパイルすると
親画面も消えることなくオーバーレイして希望通りに重ね合わせて表示されるはずだ。
これで POPUPウインドウの問題は解決されて
正しく親画面もオーバーレイされて表示されるはずである。
レコード #DUMMY は WINDOWプログラムで出力する必要は全くない。
この方法は一部の知っている開発者のみに伝えられていた方法であり、
公式にはオープンにされていない。
そこで一般にも使えるように公開することにした。
これで悩んでいた同胞の時間はかなり解決するはずである。
DSPF の最後に次の記述を追加して CRTDSPF して欲しい。
今まで親画面が消えてしまって悩んでいたのがたちまち解決するであろう。

     A          R #DUMMY                    ASSUME     
     A                                      FRCDTA     
     A                                      PUTOVR     
     A            DMY            2   O  1  2DSPATR(ND)