前へ | 次へ | 目次 | 索引 |
この章では,日本語 SMG が提供する出力操作について説明します。これらの出力操作について,構成操作 ( 漢字ターミナルの画面にイメージを作成する操作 ) と仮想ディスプレイを通じて実行される出力操作に分けて説明します。
2.1 構成操作
構成操作は,ペーストボードで仮想ディスプレイを操作したり,ターミナル画面にイメージを作成するために使用されるルーチンです。このような操作としては,仮想ディスプレイのペースト,仮想ディスプレイのアンペースト,仮想ディスプレイの再ペースト,仮想ディスプレイの移動,仮想ディスプレイのポップ,仮想ディスプレイが隠されているかどうかの確認,ペースト順序の一覧の作成などがあります。
2.1.1 ペースト操作
仮想ディスプレイは,ペーストボードにペーストされている間だけ,物理装置に表示されます。ディスプレイをペーストボードにペーストするには,SMG$PASTE_VIRTUAL_DISPLAY
ルーチンを呼び出し,仮想ディスプレイの原点として使用するペーストボード座標を指定します ( 原点は左上の角です )。ペーストボード自体には境界はありませんが,もちろん,物理画面には境界があります。したがって,ディスプレイ全体またはその一部がターミナル画面に表示されないような形式でも,ディスプレイをペーストボードにペーストできます。
仮想ディスプレイをペーストボードにペーストする操作は,仮想ディスプレイの 1 行目および 1 カラム目と一致するペーストボードの行とカラムを指定することにより,仮想ディスプレイの内容を画面上の適切な位置に変換する論理操作です。たとえば,6 行の仮想ディスプレイ "A" をペーストボードの 1 〜 6 行目にペーストし,6 行の仮想ディスプレイ "B" をペーストボードの 7 〜 12 行目にペーストすると,仮想ディスプレイ "B" は画面上で仮想ディスプレイ "A" のすぐ下に表示されます。 図 2-1 を参照してください。
2.1.2 アンペースト操作
SMG$UNPASTE_VIRTUAL_DISPLAY ルーチンを使用すれば,仮想ディスプレイを物理画面から消去できます。
第 2.1.1 項 で示した例で仮想ディスプレイ "B" をアンペーストすると,結果は
図 2-2 に示すとおりになります。
仮想ディスプレイをアンペーストしても,仮想ディスプレイが破壊されたり,その内容が破壊されるわけではありません。アンペーストは,単にディスプレイをペーストボードから削除するだけです。
ディスプレイは,そのサイズやペーストする位置,あるいはペーストする順序に応じて,部分的あるいは完全に重なり合うことがあります。一番上のディスプレイをアンペーストすると,その下に隠されていたディスプレイが表示されるようになります。
2.1.3 再ペースト操作
SMG$REPASTE_VIRTUAL_DISPLAY ルーチン
を使用すれば,ペーストボードで仮想ディスプレイを別の位置に移動できます。このルーチンを使用すれば,アンペースト操作と再ペースト操作の間に画面が空白になるのを防止できます。 図 2-3 は 2 番目のディスプレイをさらに右に再ペーストした結果を示しています。ディスプレイ 2 は再ペーストされたため,ペースト順序が変化し,一番上に表示されています。この結果,再ペースト操作を実行する前は一番上に表示されていたディスプレイ 3 は,その一部が隠されるようになります。
2.1.4 移動操作
SMG$MOVE_VIRTUAL_DISPLAY ルーチンを使用すれば,ペースト順序を変更せずに,ペーストボードで仮想ディスプレイを移動できます。 図 2-4 は 2 番目のディスプレイを右に移動した結果を示しています。アンペースト操作と移動操作の相違点に注意してください。移動操作では,ペースト順序は変化しません。したがって,ディスプレイ 2 はディスプレイ 3 に部分的に隠された状態のままです。
SMG$MOVE_TEXT ルーチンを使用すれば, 1 つの仮想ディスプレイから別の仮想ディスプレイにテキストを移動できます。長方形の対角線上の 2 つの点が与えられると, SMG$MOVE_TEXT ルーチンは適切な幅と高さを判断します。最初の仮想ディスプレイの属性はそのまま移動されます。長方形領域のテキストが移動した後で,その領域は最初の仮想ディスプレイから消去されます。
また,この操作によって,文字が分割されてしまうような場合 ( 例えば,全角文字が 1 バイトずつに分割した場合など ) には,分割された文字は未定義文字となります。
2.1.5 削除操作とポップ操作
これまで説明したアンペースト操作,再ペースト操作,および移動操作は仮想ディスプレイを消失させませんでした。 SMG$DELETE_VIRTUAL_DISPLAY ルーチンを使用すれば,仮想ディスプレイを削除できます。また SMG$POP_VIRTUAL_DISPLAY ルーチンを使用すれば, 1 回の操作で 1 つのペーストボードから多くの仮想ディスプレイを削除できます。このルーチンは指定された仮想ディスプレイと,その仮想ディスプレイより後でペーストされた他のすべての仮想ディスプレイをアンペーストし,削除します。
ポップ操作はモジュール環境で役立ちます。たとえば,サブルーチンを呼び出し,出力を作成する対象となるペーストボードの pasteboard-id 引数だけを渡すことができます。この後,そのサブルーチンはさらに仮想ディスプレイを作成し,それらの仮想ディスプレイを指定されたペーストボードにペーストできます。サブルーチンは制御を呼び出し側に戻すときに,ペーストした最初の仮想ディスプレイの display-id 引数を戻します。その後,呼び出しプログラムは SMG$POP_VIRTUAL_DISPLAY ルーチンを呼び出し,サブルーチンから戻された仮想ディスプレイの display-id 引数を指定することにより,サブルーチンの処理を取り消すことができます。この方法を使用すれば,呼び出しプログラムとサブルーチンの間で渡さなければならない情報の量を最低限に抑えることができます。 図 2-5 はディスプレイ 2 をポップした結果を示しています。
図 2-5 ポップ操作
特定のペーストボードにペーストされたディスプレイが重なっているかどうかを判断しなければならないことがあります。このような場合には,SMG$CHECK_FOR_OCCLUSION ルーチンを使用します。たとえば, 図 2-6 に示した構成では,ディスプレイ 1 とディスプレイ 2 は重なっていると報告され,ディスプレイ 3 とディスプレイ 4 は重なっていないと報告されます。しかし,この方法を使用して,どのディスプレイがペーストボードの一番上にペーストされているかを判断することはできません。この判定では,ペーストされているディスプレイが重なっているかどうかだけしか判断できません。
複数の仮想ディスプレイをペーストボードにペーストした場合には, SMG$LIST_PASTING_ORDER ルーチンを使用することにより,仮想ディスプレイをペーストした順序を判断できます。このルーチンは,最初にペーストされた(一番下の)仮想ディスプレイの識別子を戻します。その後,ペーストされたすべての仮想ディスプレイの識別子が戻されるまで, SMG$LIST_PASTING_ORDER ルーチンを繰り返し呼び出すことができます。
図 2-6 重なり合いの確認
2.2 仮想ディスプレイによる出力
この節では,仮想ディスプレイを通じて出力を実行するために使用する日本語 SMG ルーチンについて説明します。
仮想ディスプレイに書き込む操作は,漢字ターミナルに直接書き込む操作によく似ています。しかし,仮想ディスプレイに書き込む操作は,すべて日本語 SMG ルーチンを呼び出すことにより実行されます。画面の消去,カーソルの位置の設定,出力テキストのスクロールは,日本語 SMG が提供する典型的な機能です。テキストは仮想ディスプレイのバッファに並べられます。したがって,出力を受け付ける前に,ディスプレイをペーストしておく必要はありません。物理画面に書き込む場合には,画面の物理境界に制限されます。同様に,日本語 SMG 出力操作は仮想ディスプレイの境界に制限されます。仮想ディスプレイの最後のカラムをこえてテキストを書き込むことはできません。
ペーストボードの中で画面に表示されている部分に仮想ディスプレイがペーストされていない限り,仮想ディスプレイを変更しても,その変更結果は画面に表示されません。仮想ディスプレイがペーストされていない場合や,表示されていない位置にペーストされている場合には,このような変更結果は仮想ディスプレイを表現する内部データベースにのみ反映されます。
2.2.1 カーソルの位置
仮想ディスプレイを最初に作成した状態では,仮想カーソルは仮想ディスプレイの 1 行目,1 カラム目に配置されます。仮想ディスプレイに対する様々な出力操作は,通常の出力操作が物理ターミナルでカーソルを移動するのと同様に,仮想カーソルを移動します。
仮想ディスプレイ内での仮想カーソルの位置と,画面上の物理カーソルの位置を混同しないでください。 1 つのペーストボードに複数の仮想ディスプレイをペーストできるため,物理画面には同時に複数の仮想ディスプレイが表示される可能性があります。各仮想ディスプレイにはそれぞれ対応する仮想カーソルの位置がありますが,これらのすべてのディスプレイの仮想カーソルのうち, 1 つの仮想カーソルの位置だけが物理カーソルに対応します。これは通常,最後に変更された仮想ディスプレイのカーソルの位置です。
仮想ディスプレイ内での仮想カーソルの現在の位置を判断するには, SMG$RETURN_CURSOR_POS ルーチンを使用します。このルーチンは現在の仮想カーソルの行とカラムを戻します。
プログラミングを容易にするために,この情報は SMG$CURSOR_ROW ルーチンと SMG$CURSOR_COLUMN ルーチンを使用して別々に検索することもできます。これらのルーチンは関数として動作します。これらの2つのルーチンを使用すれば,次のような構造を簡単にコーディングできます。
IF SMG$CURSOR_ROW ( Display-id ) > Max-row THEN BEGIN . . . END |
SMG$RETURN_CURSOR_POS ルーチンを使用してこの情報を検索する場合には,次のように指定しなければなりません。
CALL SMG$RETURN_CURSOR_POS ( Display-id, Cursor-row, Cursor-column ) IF Cursor-row > Max-row THEN BEGIN . . . END |
SMG$RETURN_CURSOR_POS ルーチンを使用する場合には,cursor-row
と cursor-column という2つのローカル変数を定義しなければなりません。これらのローカル変数は,このテストを実行する場合にだけしか必要ありませんが,このルーチンを使用すれば, 1 回のルーチン呼び出しで行とカラムをどちらも検索できます。
次の3つのルーチンを使用すれば,仮想ディスプレイ内での仮想カーソルの位置を設定できます。
仮想ディスプレイの指定された角に仮想カーソルを設定する。
仮想ディスプレイの一部を削除するために,次に示す 2 つのルーチンが準備されています。
1 行内の文字を,1 文字以上削除します。このルーチンによって削除された文字があった位置は,同じ行で,削除された文字の右側にあった文字によって置換されます。行の最後の部分の空になった文字位置には空白が挿入されます。
DEC 漢字文字集合を使用している際に,全角文字の右半分から削除操作が始まる場合は,その文字の左半分は未定義文字になります。また,全角文字の左半分で削除操作が終了する場合には,その文字の右半分は未定義文字になります。
1 行以上を行単位で削除します。このルーチンによって削除された行は,削除された行のすぐ下の行によって置換されます。仮想ディスプレイの一番下の空になった行は空白になります。
消去操作では,仮想ディスプレイ内の消去された部分は空白になります。仮想ディスプレイの他の部分は並べ換えられません。
DEC 漢字文字集合を使用している際に,消去操作が全角文字の右半分から始まる場合は,その文字の右半分は消去されて,左半分は未定義文字になります。また消去操作が全角文字の左半分で終了する場合には,その文字の右半分は未定義文字になります。
仮想ディスプレイの一部を消去するために,次の4つのルーチンが提供されます。
仮想ディスプレイの一部または全部を消去します。
仮想ディスプレイにテキストを挿入するために,2 つのルーチンが準備されています。
DEC 漢字文字集合を使用している際に,全角文字の右半分から挿入操作が始まり,その文字を分割してしまう場合には,分割された文字は,2 つの未定義文字になります。全角文字の右半分から切り捨て操作が始まる場合には,その文字の左半分が未定義文字になります。
指定された文字列を指定された開始位置に挿入します。これらの位置の既存の文字は右に移動し,各文字を挿入するための空間が確保されます。右端のカラムをこえて移動された文字は切り捨てられます。
指定されたテキスト行を指定された位置に挿入し,行を挿入するための空間を確保するために,仮想ディスプレイ内の既存の行を上または下にスクロールします。仮想ディスプレイの上端より上,または下端より下にスクロールされた行は切り捨てられます。自動改行が設定されていない場合で,挿入行が仮想ディスプレイの 1 行以内に収まらない場合には,あふれた文字は切り捨てられます。
日本語 SMG は,仮想ディスプレイにテキストを書き込むために2種類のルーチンを提供します。 1 つは文字単位の出力ルーチンで,もう 1 つは行単位の出力ルーチンです。この後の節では,これらの各ルーチンについて説明します。
2.2.5.1 文字単位の出力
仮想ディスプレイを直接アクセス装置として使用する場合には,通常,文字単位の出力ルーチンを使用します。この操作モードでは,プログラムは仮想ディスプレイ内でカーソルを明示的に設定し,そこにテキストを置きます。次の出力操作は通常,前の出力操作と空間的な関係がないため,カーソルの位置とディスプレイのスクロールを明示的に制御する必要があります。
DEC漢字文字集合を使用している際に,全角文字の右半分から出力が始まる場合は,その文字の左半分は未定義文字になります。また,全角文字の左半分で出力が終了する場合は,その文字の右半分は未定義文字になります。
文字単位の出力ルーチンとしては,次に示すルーチンがあります。
通常の文字を仮想ディスプレイに書き込みます。
倍角の文字を仮想ディスプレイに書き込みます。
4倍角の文字を仮想ディスプレイに書き込みます。
複数の属性で,文字を仮想ディスプレイに書き込みます。
文字単位の出力ルーチンと異なり,行単位のルーチンは漢字ターミナルを順次アクセス装置として取り扱います。この操作モードでは,プログラムは通常,情報を1行ずつ順に書き込みます。概念的には,この動作は情報ストリーム ( たとえばファイル ) を仮想ディスプレイにコピーする操作に対応します。各ルーチン呼び出しは,操作が正常終了した後,カーソルを次の行の 1 カラム目に設定します。
DEC 漢字文字集合を使用している際に,出力が全角文字の右半分から始まる場合には,その文字の左半分は未定義文字になります。
テキスト行を仮想ディスプレイに書き込みます。
倍角のテキスト行を仮想ディスプレイに書き込みます。
4倍角のテキスト行を仮想ディスプレイに書き込みます。
複数の属性でテキスト行を仮想ディスプレイに書き込みます。
前へ | 次へ | 目次 | 索引 |