日本語 OpenVMS
日本語 OpenVMS
日本語画面管理ライブラリ 利用者の手引き
第 6 章 日本語 SMG を使用したプログラム開発
この章では,新しいプログラムを開発するための日本語 SMGの望ましい使用方法について説明します。この章の説明では特に,日本語 SMG ルーチンが AST リエントラントでないことに注意してください。
アプリケーションから日本語 SMG ルーチンを呼び出す方法としては,次の2種類の方法があります。
- 直接呼び出し
日本語 SMGを直接呼び出すアプリケーションは,ペーストボードと仮想ディスプレイを使用している。
- 間接呼び出し
この種のアプリケーションは日本語 SMGを直接使用しないが,他のルーチン中で,日本語 SMGを使用する。
今後,これまでより多くの呼び出し可能ルーチンが日本語 SMGを使用して出力を作成できるようになります。そのようになると,アプリケーションがこのカテゴリに分類されるかどうかを判断するのは困難になります。
どちらの場合も,呼び出しルーチンは何らかの時点でサブシステムを呼び出すことにより,サブシステムが画面にデータを書き込むことができるようにします。
その後,端末ユーザは,サブシステム固有のディスプレイを消去する必要があるでしょう。しかしサブシステムが,データを表示するために仮想ディスプレイを作成し使用した場合には,ディスプレイ識別子は呼び出しプログラムからは利用できません。したがって,呼び出しプログラムはディスプレイを消去できません。さらに,呼び出しプログラムが日本語 SMGを使っていない場合,画面のペーストボード識別子も呼び出しプログラムから利用できません。
この問題を解決するには,日本語 SMGを直接的または間接的に使用するすべての呼び出し可能ルーチンが, pasteboard-id
引数に対して(省略可能な)入力引数と,仮想 display-id
引数に対して(省略可能な)出力引数を使用するようにしなければなりません。ペーストボード識別子とディスプレイ識別子を渡すことにより,呼び出しプログラムから消去できないサブシステム固有のデータが,画面に蓄積されるのを防止できます。これらのガイドラインをまとめると,次のようになります。
- pasteboard-id
引数が呼び出しプログラムから提供される場合には,
- 呼び出されるプログラムは,独自のペーストボードを作成してはならない。
- 呼び出されるプログラムは,呼び出しプログラムから提供されるペーストボードにすべての出力を送信しなければならない。つまり,呼び出されるプログラムは, pasteboard-id
引数によって指定されるペーストボードにのみディスプレイをペーストできる。
- 呼び出されるプログラムは,SMG$DELETE_VIRTUAL_DISPLAY ルーチンを呼び出すことにより,作成した仮想ディスプレイを削除できるが,ペーストボードを削除してはならない。
仮想ディスプレイを後で再利用できると考えて,SMG$UNPASTE_VIRTUAL_DISPLAY ルーチンを呼び出されるプログラムから単純に呼び出してはならない。呼び出されるプログラムと呼び出しプログラムはペーストボードを共用するため,呼び出しプログラムは SMG$POP_VIRTUAL_DISPLAY ルーチンを使用して,呼び出されたプログラムが作成したすべてのディプレイを削除できる。
- 呼び出されるプログラムは,そのプログラムが呼び出すルーチンに pasteboard-id
引数を渡さなければならない。このようにして,すべての出力は指定されたペーストボードに送られる。
- pasteboard-id
引数が呼び出しプログラムから提供されない場合には,
- 呼び出されるプログラムは,独自にペーストボードを作成しなければならない。呼び出されるプログラムは,他の方法によって特定の装置に出力を送る場合を除き,ペーストボードに対する物理装置を割り当てることができる。
呼び出されるプログラムは,SMG$CREATE_PASTEBOARD ルーチン呼び出しの状態を確認することにより,固有のペーストボード識別子を作成したのか,既存のペーストボードのペーストボード識別子を受信したのかを判断しなければならない。ペーストボードがすでに存在する場合には,呼び出されるプログラムはそのペーストボートを削除してはならない。
- 呼び出されるルーチンがペーストボードを作成し,次にペーストボートを使用する可能性のあるサブルーチンを呼び出す場合には,pasteboard-id 引数をサブルーチンに渡さなければならない。
- 呼び出されるプログラムは,SMG$UNPASTE_VIRTUAL_DISPLAY ルーチンを使用して物理画面から消去し,再起動される可能性がある場合には,将来の起動のために再利用できるようにディスプレイを保存できる。しかし,SMG$UNPASTE_VIRTUAL_DISPLAY ルーチンを使用するのは,呼び出されるプログラムが独自のペーストボードを作成する場合に制限しなければならない。この場合,呼び出しプログラムは呼び出されるプログラムが作成した仮想ディスプレイを削除できないからである。
- 仮想 display-id
引数を呼び出しプログラムが与える場合には,呼び出しプログラムは呼び出されるプログラムが作成した仮想ディスプレイを削除しなければならない。呼び出されるプログラムは最初にペーストした仮想ディスプレイの識別子を呼び出しプログラムに戻さなければならない。呼び出しプログラムは SMG$POP_VIRTUAL_DISPLAY ルーチンを呼び出すことにより,この仮想ディスプレイとその後ペーストするすべての仮想ディスプレイを削除できる。
- 仮想 display-id
引数を呼び出しプログラムが与えない場合には,呼び出されるプログラムはペーストボードにペーストしたすべての仮想ディスプレイを削除しなければならない。
次のガイドラインに従えば,モジュール方式でアプリケーションを開発できます。
- 呼び出しプログラムは,どの情報をペーストボードにペーストするかを制御する。ペーストボード識別子は階層構造の上から下に流れ,各ルーチンは呼び出しプログラムが与えた pasteboard-id
引数を使用し,それをサブルーチンに渡す。
- 呼び出しプログラムが仮想 display-id
引数を与え,呼び出されるプログラムがその引数に識別子を格納する場合には,呼び出しプログラムは,呼び出されるプログラムが作成したディスプレイを削除しなければならないと解釈する。
呼び出されるプログラムは,最初にペーストした仮想ディスプレイの display-id 引数を戻すことにより,呼び出しプログラムがSMG$POP_VIRTUAL_DISPLAYルーチンを呼び出すことで,このディスプレイと,その後ペーストしたすべてのディスプレイを削除できるようにする。
- 仮想ディスプレイは,それを必要とするルーチン内で作成される(およびペーストされる)。呼び出しプログラムが display-id
引数を与えない場合には,そのディスプレイを作成したルーチン内でディスプレイはアンペーストされるか,または削除される。
日本語 SMGを使用せずに画面に書き込みを実行するサブルーチン(またはサブシステム)を呼び出す場合には,別の状況が発生します。日本語 SMGを使用しない場合には(つまり,画面上で日本語 SMG によって制御されない領域にテキストが配置される場合),画面を更新しようとするときに問題が発生します。
この理由から,日本語 SMGには,画面管理を使用しないプログラムに画面(またはその一部)を一時的に渡すルーチンと,制御がSMG$ ルーチン以外のルーチンから戻された後,前の状態に画面を復元するためのルーチンがあります。これらのルーチンは SMG$SAVE_PHYSICAL_SCREENルーチンとSMG$RESTORE_PHYSICAL_SCREENルーチンです。
SMG$ 以外の入出力を,画面に対して実行するルーチンを呼び出す場合には,その前に SMG$SAVE_PHYSICAL_SCREEN ルーチンを呼び出し,画面のどの部分を SMG$ 以外のルーチンに渡すかを指定します。SMG$SAVE_PHYSICAL_SCREEN ルーチンは指定された領域を消去し,ターミナルの物理スクロール領域をこの領域に設定し,物理カーソルを領域の行1,カラム1に設定します。SMG$ 以外のコードが順次入出力だけしか実行しない場合には(つまり,カーソル・アドレスを直接指定しない場合には),出力は画面の指定された領域に制限されます。
制御が SMG$ 以外のルーチンから戻された後,SMG$RESTORE_PHYSICAL_SCREEN ルーチンを呼び出してください。このルーチンは,SMG$SAVE_PHYSICAL_SCREEN ルーチンを呼び出す前の状態に画面イメージを復元します。
|