[ 前のページ ] [ 次のページ ] [ 目次 ] [ 索引 ] [ DOC Home ]

2 日本語SMGの出力操作

この章では,日本語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.1.2 アンペースト操作

SMG$UNPASTE_VIRTUAL_DISPLAYルーチンを使用すれば, 仮想ディスプレイを物理画面から消去できます。 第2.1.1項で示した例で仮想ディスプレイ"B"をアンペーストすると, 結果は図 2-2に示すとおりになります。

図 2-2 アンペースト操作

仮想ディスプレイをアンペーストしても,仮想ディスプレイが破壊されたり, その内容が破壊されるわけではありません。 アンペーストは,単にディスプレイをペーストボードから削除するだけです。

ディスプレイは,そのサイズやペーストする位置, あるいはペーストする順序に応じて,部分的あるいは完全に重なり合うことがあります。 一番上のディスプレイをアンペーストすると, その下に隠されていたディスプレイが表示されるようになります。


2.1.3 再ペースト操作

SMG$REPASTE_VIRTUAL_DISPLAYルーチンを使用すれば, ペーストボードで仮想ディスプレイを別の位置に移動できます。 このルーチンを使用すれば, アンペースト操作と再ペースト操作の間に画面が空白になるのを防止できます。 図 2-3 は2番目のディスプレイをさらに右に再ペーストした結果を示しています。 ディスプレイ2は再ペーストされたため,ペースト順序が変化し, 一番上に表示されています。 この結果,再ペースト操作を実行する前は一番上に表示されていたディスプレイ3は, その一部が隠されるようになります。

図 2-3 再ペースト操作


2.1.4 移動操作

SMG$MOVE_VIRTUAL_DISPLAYルーチンを使用すれば,ペースト順序を変更せずに, ペーストボードで仮想ディスプレイを移動できます。 図 2-4は2番目のディスプレイを右に移動した結果を示しています。 アンペースト操作と移動操作の相違点に注意してください。 移動操作では,ペースト順序は変化しません。 したがって,ディスプレイ2はディスプレイ3に部分的に隠された状態のままです。

図 2-4 移動操作

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 ポップ操作


2.1.6 重なり合いの確認操作

特定のペーストボードにペーストされたディスプレイが重なっているかどうかを判断しなければならないことがあります。 このような場合には,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.2.2 削除操作

仮想ディスプレイの一部を削除するために,次に示す2つのルーチンが準備されています。


2.2.3 消去操作

消去操作では,仮想ディスプレイ内の消去された部分は空白になります。 仮想ディスプレイの他の部分は並べ換えられません。

DEC漢字文字集合を使用している際に,消去操作が全角文字の右半分から始まる場合は, その文字の右半分は消去されて,左半分は未定義文字になります。 また消去操作が全角文字の左半分で終了する場合には, その文字の右半分は未定義文字になります。

仮想ディスプレイの一部を消去するために,次の4つのルーチンが提供されます。


2.2.4 挿入操作

仮想ディスプレイにテキストを挿入するために,2つのルーチンが準備されています。

DEC漢字文字集合を使用している際に,全角文字の右半分から挿入操作が始まり, その文字を分割してしまう場合には,分割された文字は,2つの未定義文字になります。 全角文字の右半分から切り捨て操作が始まる場合には, その文字の左半分が未定義文字になります。


2.2.5 書き込み操作

日本語SMGは, 仮想ディスプレイにテキストを書き込むために2種類のルーチンを提供します。 1つは文字単位の出力ルーチンで,もう1つは行単位の出力ルーチンです。 この後の節では,これらの各ルーチンについて説明します。


2.2.5.1 文字単位の出力

仮想ディスプレイを直接アクセス装置として使用する場合には,通常, 文字単位の出力ルーチンを使用します。 この操作モードでは,プログラムは仮想ディスプレイ内でカーソルを明示的に設定し, そこにテキストを置きます。 次の出力操作は通常,前の出力操作と空間的な関係がないため, カーソルの位置とディスプレイのスクロールを明示的に制御する必要があります。

DEC漢字文字集合を使用している際に,全角文字の右半分から出力が始まる場合は, その文字の左半分は未定義文字になります。また, 全角文字の左半分で出力が終了する場合は,その文字の右半分は未定義文字になります。

文字単位の出力ルーチンとしては,次に示すルーチンがあります。


2.2.5.2 行単位の出力

文字単位の出力ルーチンと異なり, 行単位のルーチンは漢字ターミナルを順次アクセス装置として取り扱います。 この操作モードでは,プログラムは通常,情報を1行ずつ順に書き込みます。 概念的には,この動作は情報ストリーム(たとえばファイル) を仮想ディスプレイにコピーする操作に対応します。各ルーチン呼び出しは, 操作が正常終了した後,カーソルを次の行の1カラム目に設定します。

DEC漢字文字集合を使用している際に,出力が全角文字の右半分から始まる場合には, その文字の左半分は未定義文字になります。

行単位の出力ルーチンとしては,次に示すルーチンがあります。


2.2.6 仮想ディスプレイの属性の変更

SMG$CREATE_VIRTUAL_DISPLAYルーチンを使用して仮想ディスプレイを作成する場合には, 仮想ディスプレイ内に表示されるすべてのテキストに対して省略時の属性を指定します。 既存の仮想ディスプレイの属性は, SMG$CHANGE_VIRTUAL_DISPLAYルーチンを呼び出すことにより変更できます。

SMG$CHANGE_VIRTUAL_DISPLAYルーチンを使用すれば, ディスプレイ全体のビデオ属性とディスプレイ属性の両方を変更できます。

仮想ディスプレイに対して省略時の属性を指定するには, ビット・マスクを使用してディスプレイ属性引数にビットを設定します。 次の各ビットを設定できます。

表 2-1 ビットの設定

SMG$M_BLINK 点滅文字を指定します。
SMG$M_BOLD 通常より明るい輝度の文字を指定します。
SMG$M_ REVERSE 文字を反転表示することを指定します。 つまり,仮想ディスプレイの現在の属性の反対の状態で,文字を表示します。
SMG$M_UNDERLINE 下線付き文字を指定します。
SMG$M_ INVISIBLE 表示されない文字を指定します。 つまり,文字は仮想ディスプレイ内に存在しますが,ペーストボードには表示されません。
SMG$M_USER1からSMG$M_USER8 ユーザ定義属性を指定します。

SMG$M_USER1からSMG$M_USER8のユーザ定義属性を使用する場合には, STRING_2 機能を使用して, TERMTABLE.TXTファイルに適切な定義を指定しなければなりません。 TERMTABLE定義とSTRING_2機能については 第5章を参照してください。

これまで示した属性の一部またはすべてを,仮想ディスプレイの属性として指定できます。 複数のビデオ属性を指定する場合には,これらの属性の論理和を使用します。たとえば, 仮想ディスプレイの省略時の設定として下線付き文字を反転表示することを指定する場合には, 適切なビット・マスクの論理和を display-attributes 引数に割り当てます。

     Display_attributes = ( SMG$M_REVERSE OR SMG$M_UNDERLINE )

この後,SMG$CREATE_VIRTUAL_DISPLAYルーチンを呼び出すとき, この display-attributes 引数を指定します。

日本語SMG出力ルーチンを使用すれば,省略時の属性を変更できます。 このようにすれば,他の属性でテキストを書き込むときに, そのたびに省略時の設定を変更する必要がなくなります。 省略時の属性を変更するには,2つの引数を使用します。 それは rendition-set 引数と rendition-complement 引数です。 これらの引数にビデオ属性を設定する方法は, 仮想ディスプレイを作成するときにビデオ属性を設定する方法と同じです。

省略時のビデオ属性,rendition-set 引数, および rendition-complement 引数を組み合わせることにより, 次の方法に従って,出力属性を指定できます。

  1. 省略時のビデオ属性と rendition-set 引数を格納したマスクに対して, 論理和またはビット単位の論理和演算が実行されます。

  2. 前の論理和演算の結果と rendition-complement 引数に対して, 排他的論理和演算またはビット単位の排他的論理和演算が実行されます。

この方法の結果は次の表に示すとおりです。

設定 補足 動作
0 0 属性を省略時の値に設定する。
10 属性をオンに設定する。
0 1 属性を省略時の値の補数に設定する。
1 1属性をオフに設定する。

この方法の結果は,仮想ディスプレイの現在の属性ではなく, 省略時の属性設定に対して決まります。したがって, 属性を明示的に指定する日本語SMG出力ルーチンをすでに使用している場合には, 現在の属性はその仮想ディスプレイの省略時の属性と一致しない可能性があります。


2.2.7 ラインとライン描画文字を描く操作と削除する操作

水平線と垂直線を作成するための簡単な方法として,3つのルーチンが準備されています。

SMG$DRAW_LINEルーチンまたはSMG$DRAW_RECTANGLEルーチンを使用して描いたラインを消去する場合には, SMG$REMOVE_LINEルーチンを使用します。このルーチンはラインを削除しますが, ラインの交点にあるライン描画文字は保存されます。

他のすべての日本語SMGルーチンと同様に,これらのルーチンも装置から独立しています。 ラインをVT 100で描く場合には,VT 100の曲線描画文字設定が使用されます。 同じラインをVT 52で描く場合には( VT 52はこのハードウェア機能を備えていません), ラインはプラス記号(+),縦線(|),ダッシュ(-)を使用することにより自動的に近似されます。 ユーザ・プログラムが各ターミナル・タイプに対して異なる文字コードを提供する必要はありません。

さらに,これらのルーチンは2本のラインの交点に,適切な文字を自動的に描きます。 たとえば,プログラムが画面に直接水平線を書き込み,その後, その水平線と交差する垂直線を書き込む場合には,通常, 図 2-7のようになります。

図 2-7 SMG$DRAW_LINEルーチンを使用せずに描いたライン

SMG$DRAW_LINEルーチンを使用して,これらの同じラインを描いた場合には, 画面は図 2-8に示すようになります。

図 2-8 SMG$DRAW_LINEルーチンを使用して描いたライン


2.2.8 外部テキストの表示

外部テキストを仮想ディスプレイまたはターミナルに表示する, 2つのルーチンがあります。


2.2.9 仮想ディスプレイからの読み込み

SMG$READ_FROM_DISPLAYルーチンを使用すれば, 仮想ディスプレイからテキストを簡単に読み込むことができます。 このルーチンは,仮想ディスプレイを使用することにより, 画面にメニュー項目を表示するアプリケーションで使用できます。 このようなアプリケーションでは,ユーザはメニュー項目間でカーソルを移動し, その後,適切な項目を選択できます(たとえば,[Return]を押すことにより)。 この時点で,プログラムはディスプレイの現在のカーソルの位置から文字を読み込み, どのメニュー項目が選択されたかを判断できます。

このルーチンはまた, SMG$M_INVISIBLE属性を使用して書き込まれた文字を読み込むための方法としても使用できます。


2.2.10 ビューポート

仮想ディスプレイは非常に大きくなる可能性があるため, ディスプレイ全体を一度に画面に表示できるとは限りません。 ユーザは大きな仮想ディスプレイの各部分を表示するために, 仮想ディスプレイを再ペーストしなければなりません。 仮想ディスプレイに対応づけられたビューポートはこの操作を容易にします。

ビューポート操作とは,仮想ディスプレイの各部分を表示するために, 仮想ディスプレイ上で長方形の表示領域を移動する処理のことです。 ビューポートは仮想ディスプレイに対応づけられるため, 仮想ディスプレイに対して実行され,出力操作はすべて, ビューポート上で反映されます。


2.2.10.1 ビューポートの作成

SMG$CREATE_VIEWPORTルーチンは, 特定の仮想ディスプレイに対応するビューポートを作成します。 仮想ディスプレイは,ビューポートを作成する前に作成しておかなければならず, 各仮想ディスプレイに対してビューポートを1つだけ作成できます。

ビューポートを表示するには, SMG$PASTE_VIRTUAL_DISPLAYルーチンを呼び出すことにより, 仮想ディスプレイをペーストしなければなりません。 仮想ディスプレイの中で,ビューポートの内部に存在する部分だけが表示されます。


2.2.10.2 ビューポートの削除

ビューポートはSMG$DELETE_VIEWPORTルーチンを使用して削除できます。 このルーチンを呼び出すと, ビューポートはペーストされているペーストボードから自動的にアンペーストされます。 しかし,ビューポートに対応づけられている仮想ディスプレイは削除されません。 したがって,SMG$PASTE_VIRTUAL_DISPLAYルーチンを呼び出すことにより, その仮想ディスプレイを表示できます。


2.2.10.3 ビューポートのペーストとアンペースト

SMG$PASTE_VIRTUAL_DISPLAYルーチンは, ビューポートまたは仮想ディスプレイをペーストボードにペーストします。 ビューポートを仮想ディスプレイに対応づけた後, SMG$PASTE_VIRTUAL_DISPLAYルーチンを呼び出す場合には,仮想ディスプレイではなく, ビューポートが使用されます。 つまり,仮想ディスプレイに対するビューポートを作成した後, その仮想ディスプレイの中で表示できる部分は, ビューポートの内部に含まれる長方形の領域だけです。 ビューポートを削除せずに,そのビューポートをアンペーストする場合には, SMG$UNPASTE_VIRTUAL_DISPLAYルーチンを使用します。

対応する仮想ディスプレイがすでにペーストされているときに, ビューポートを作成する場合には,そのビューポートは表示されません。 SMG$PASTE_VIRTUAL_DISPLAYルーチンを呼び出すと, 仮想ディスプレイはアンペーストされ,その場所にビューポートがペーストされます。


2.2.10.4 ビューポートのスクロールと移動

仮想ディスプレイに対応するビューポートは,ペーストボードに全体, またはある一部分をペーストできます。 あるいはペーストボードの完全な外に置くこともできます。ただし, ビューポートは対応づけられた仮想ディスプレイを越えて拡大することはできません。 仮想ディスプレイの境界をこえてビューポートを拡張しようとした場合には, 日本語 SMGは仮想ディスプレイの内部に収まるように, 自動的にビューポートを切り詰めます。

ビューポートを"スクロール"するには, そのビューポートに対応する仮想ディスプレイをスクロールします。 この場合には,SMG$SCROLL_VIEWPORTルーチンを呼び出します。 実際には,スクロールをシミュレートするために, ビューポートが仮想ディスプレイ上で移動するたびに,ビューポートの座標が変化します。 しかし,画面上でのビューポートの位置は変化しません。 SMG$SCROLL_VIEWPORTルーチンを使用する場合には,スクロールの方向(上,下,左,右)を指定できます。

ビューポートを移動する場合には,SMG$CHANGE_VIEWPORTルーチンを呼び出します。 このルーチンを使用する場合には,ビューポートの新しい開始位置とサイズを指定できます。 ビューポートの開始位置とサイズを変更すれば,仮想ディスプレイ上でウィンドウを移動できます。


2.2.10.5 ビューポート属性の変更

SMG$GET_VIEWPORT_CHARルーチンを使用すれば,ビューポートの現在の属性を検索できます。 ビューポートの属性は,ビューポートの開始行と終了行,および開始カラムと終了カラムで構成されます。 このルーチンはSMG$CHANGE_VIEWPORTルーチンと組み合わせて使用でき, 既存のビューポートの開始位置と終了位置を変更できます。

開始位置または終了位置以外のビューポート属性を変更する場合には, SMG$CHANGE_VIRTUAL_DISPLAYルーチンを使用しなければなりません。 仮想ディスプレイへのすべての変更は,対応するビューポートで反映されます。

たとえば,仮想ディスプレイに境界がある場合には,対応するビューポートにも境界があります。 仮想ディスプレイに境界がない場合には,ビューポートにも境界がありません。 ビューポートに境界を追加したり,削除する場合には, SMG$CHANGE_VIRTUAL_DISPLAY ルーチンを使用して仮想ディスプレイに境界を追加するか, または仮想ディスプレイから境界を削除します。 この変更操作はビューポートで自動的に反映されます。


2.2.11 メニュー

日本語SMGには,メニューに選択項目を作成する機能とメニューから項目を選択する機能があります。 メニューはブロック・メニュー,垂直メニュー,水平メニューのいずれでもかまいません。 ブロック・メニューは項目を2次元に並べた配列であり, おもに使用されるメニュー・タイプです。 垂直メニューはメニュー項目を1列に縦に並べて表示し, 水平メニューはメニュー項目を1行に横に並べて表示します。 ビューポートの境界内に収まらないメニュー項目は, 表示領域にスクロールされるまで表示されません。


2.2.11.1 メニューの作成

SMG$CREATE_MENUルーチンは, 指定された仮想ディスプレイのスクロール領域にメニューを作成します (省略時の設定では,スクロール領域は仮想ディスプレイ全体です。 SMG$SET_DISPLAY_SCROLL_REGIONルーチンを使用すれば,スクロール領域を変更できます)。 メニューを作成するときに,メニューの形式(ブロック,垂直,水平のいずれか)を指定します。

ブロック・メニューはメニューの省略時の形式です。 メニュー内の項目は一定の文字列配列の形式でルーチンに渡されます。 省略時の設定では,各メニュー項目はシングル・スペースで配置されますが, ダブル・スペースも要求できます。 水平方向には,各メニュー項目は4つのスペースで区切られます。 さらに,メニュー項目を固定形式カラムに表示することも要求できます。 この場合には,カラムの幅は渡される固定長文字列のサイズに等しくなります。

各仮想ディスプレイには,1つのメニューだけを格納できます。 また,SMG$CREATE_MENUルーチンを呼び出した後, ディスプレイ内のメニューを格納した領域に,他の文字を出力することはできません。 このような操作を実行すると,予測できない結果になります。 メニューは仮想ディスプレイのスクロール領域に出力されます。


2.2.11.2 メニューの削除

メニューを削除するには,SMG$DELETE_MENUルーチンを使用します。 このルーチンは,指定された仮想ディスプレイ内のメニュー項目に対するアクセスを禁止します。 さらに,SMG$DELETE_MENUルーチンがメニューを削除するときに, すべてのメニュー項目をディスプレイから削除することも要求できます。


2.2.11.3 メニューからの選択

メニューを作成した後, SMG$SELECT_FROM_MENUルーチンを使用してそのメニューから項目を選択できます。 1つのメニュー項目から別のメニュー項目に移動すると,省略時の設定では, 現在選択されている項目が反転表示されます。 SMG$SELECT_FROM_MENUルーチンを呼び出したときに,省略時の選択項目を指定できます。 省略時の選択項目を指定しなかった場合には,前に選択した項目が強調表示されたままになります。

SMG$SELECT_FROM_MENUルーチンには,3種類の操作モードがあります。 これらのモードは flags 引数を使用して切り換えることができます。 各モードについては,この後の項で説明します。


2.2.11.3.1 省略時のモード

SMG$SELECT_FROM_MENUルーチンの省略時の操作モードは, flags 引数を省略することにより有効になります。 このモードでは,矢印キーを使用して各メニュー項目間を移動でき, 項目を選択した後,別の項目を追加選択できます。 また,省略時のモードでは,すでに選択されている項目を"再選択"できます。


2.2.11.3.2 RETURN_IMMEDモード

SMG$SELECT_FROM_MENUルーチンの flags 引数の値として, SMG$M_RETURN_IMMEDを指定した場合には,矢印キーを使用してメニュー項目間を移動できます。 しかし,他のキーを押すと,制御はユーザに戻されます。 [Ctrl/Z]は現在の項目を選択し,SMG$_EOFを戻します。 他のキーを押した場合には,現在の項目が選択されます。

省略時のモードが提供するキー定義以外のキー定義が必要な場合には, SMG$M_RETURN_IMMEDモードを使用します。


2.2.11.3.3 REMOVE_ITEMモード

SMG$SELECT_FROM_MENUの flags 引数の値として, SMG$M_REMOVE_ITEMを指定した場合には, メニュー内の項目を"再選択"することはできません。 ただし,項目はメニュー内に残されます。 また,その項目はメニューを格納した仮想ディスプレイの省略時の属性で表示されます。

このモードで省略時の選択項目を指定し,その項目がすでに選択されている場合には, メニュー内の最初の"選択可能な"項目が強調表示されます。 どの項目も選択可能でない場合には,エラーが戻されます。


2.2.12 仮想ディスプレイの保存

SMG$SAVE_VIRTUAL_DISPLAYルーチンは,仮想ディスプレイの内容をファイルに保存します。 仮想ディスプレイを再作成するのに必要なテキスト,ビデオ属性, およびすべてのディスプレイ属性が保存されますが,メニュー,ビューポート, サブプロセスの内容は保存されません。

SMG$SAVE_VIRTUAL_DISPLAYルーチンによって保存したファイルをプリントすることはできません。 仮想ディスプレイを復元するには,SMG$LOAD_ VIRTUAL_DISPLAYルーチンを使用します。 このルーチンは新しい仮想ディスプレイを作成し, その仮想ディスプレイに保存されているディスプレイの内容をロードします。 新しい仮想ディスプレイはどのペーストボードにもペーストされない状態です。


2.2.13 ターミナル属性の変更

SMG$SET_TERM_CHARACTERISTICSルーチンは, 指定されたペーストボードのターミナル属性を変更または検索します。 このルーチンを使用すれば, 1回のルーチン呼び出しで複数のターミナル属性を制御できます。


2.2.14 仮想ディスプレイに対する文字集合の設定

SMG$CREATE_VIRTUAL_DISPLAYルーチンは, 新規に作成された仮想ディスプレイに文字集合を設定するために, 省略可能な引数( character-set )を持っています。 この引数を省略した場合は,SMG$DEFAULT_CHARACTER_SET論理名が用いられます。

表 2-2は,この論理名に定義できる等価名を示しています。

表 2-2 省略時文字集合名

等価名 文字集合(コードセット)
ASCII ASCII文字集合
SPEC_GRAPHICS DEC特殊文字集合
SUPPLEMENTAL 補助文字集合 [1]
KANJI DEC漢字文字集合
JIS_KANA JISカタカナ文字集合
SDK Super DEC漢字コードセット

[1] DEC補助文字集合またはLatin-1文字集合のいずれか。

この論理名が無効な文字集合を指していたり,定義されていなかった場合には, 文字集合は未定義になります。


2.3 操作制御

この節では,特殊な操作モードを制御する日本語SMGルーチン (更新処理におけるタブの使用の制御,最低限の更新, およびバッファ処理を行なうルーチン)について説明します。 これらのモードを使用すれば,情報を実際に画面に書き込む方法を最適化できます。 これらのモードを起動するには,SMG$CONTROL_MODEルーチンを使用します。

通常,ユーザがこれらのモードを考慮する必要はありません。 日本語SMGは,文字が画面にただちに表示されるように出力を最適化します。 しかし,一部のアプリケーションでは,これらのモード設定を利用しなければならないことがあります。 この後の節では,これらの操作モードについて説明します。


2.3.1 最小限の更新

省略時の設定では, 日本語SMGは画面の中で変更された部分だけを再度書き直すことにより, 画面に書き込む文字数をできるだけ少なくしようとします。 しかし,日本語SMGはこの方法とは異なる更新操作もサポートし,その操作では, 変更によって影響を受けるすべての行が,最初に変更された文字から行の最後まで, すべて書き直されます。


2.3.2 バッファ操作

省略時の設定では,出力操作を実行すると, バッファが満杯になったときに画面を更新するのではなく, 部分的に格納された多くの小さいバッファを漢字ターミナルに送信することにより, 画面がただちに変更されます。これらの入出力トランザクションの数は, バッファ処理モードを有効に設定することにより最低限に抑えることができ, その結果,プログラムの実行速度を向上することができます。

バッファ処理モードでは,日本語SMGはバッファが満杯になった場合にだけ, ターミナル・バッファを画面に書き込みます。 したがって,結果が画面に表示されるまでに, 複数の出力操作が実行される可能性があります。 多くのアプリケーションではこのような遅延時間が認められないため, バッファ処理と組み合わせて使用するように, SMG$FLUSH_BUFFERという特殊なルーチンが準備されています。

SMG$FLUSH_BUFFERルーチンは,そのバッファが満杯になったかどうかとは無関係に, バッファを漢字ターミナルに強制的に書き込みます。 このルーチンは,通常はこのような出力の遅延を認めることができるものの, 場合によっては画面をただちに更新しなければならないようなアプリケーションにとって役立ちます。 常に画面を即時変更することが必要なアプリケーションの場合には, バッファ処理を無効に設定しておかなければなりません。


2.3.3 タブ

タブは更新操作をできるだけ少なくするために使用します。 タブを使用する場合には, タブ・ストップがDEC指定の位置に設定されているかどうかを確認しなければなりません。 ユーザが漢字ターミナルにどのようにタブを設定したかということとは無関係に, アプリケーションを実行したい場合には,タブを使用すべきではありません。

画面に出力されるタブはすべて,実際に画面に出力される前に, 日本語SMGルーチンによって8つのスペースに変換されます。 この規則には1つだけ例外があります。 それは,SMG$CREATE_VIRTUAL_DISPLAYルーチンを使用するときに, display-attributes 引数をSMG$M_DISPLAY_CONTROLSルーチンに設定した場合です。 この場合には,タブ文字を8つのスペースとして解釈するのではなく, タブ文字がそのまま出力されます。


2.4 出力のバッチ処理

複雑なペーストボード・イメージを作成するときに, イメージ全体が完成した後でそのイメージを画面に表示したいことがあります。 このような場合には,イメージを作成する途中では画面を空白のままにしておき, 一連の作成操作をバッチ処理し,最終結果だけを画面に表示できます。

日本語SMGには,ペーストボード・レベルで一連の操作をバッチ処理するための方法があります。 この方法については,この後の節で説明します。


2.4.1 ペーストボード更新のバッチ処理

ペーストボード更新のバッチ処理は, SMG$BEGIN_PASTEBOARD_UPDATE ルーチンを呼び出し,複数の作成操作を実行し, 最後にSMG$END_PASTEBOARD_UPDATE ルーチンを呼び出すことにより実行できます。 SMG$BEGIN_ PASTEBOARD_UPDATEルーチンは,出力操作を物理画面上ではなく, ペーストボード・バッファ内だけで反映します。 SMG$END_PASTEBOARD_UPDATEルーチンを呼び出すと, ペーストボード・バッファは物理画面に書き込まれます。

SMG$BEGIN_PASTBOARD_UPDATEルーチンとSMG$END_PASTEBOARD_UPDATEルーチンは, カウンタを増分および減分します。 このカウンタの値が0になると,ペーストボードに対する出力はただちに物理画面に送信されます。 カウンタの値が0以外の場合には,出力操作はバッチ処理されます。 ペーストボード・バッチ処理レベルはカウンタの値に等しくなります。 このカウンタ方式を使用すれば, サブルーチンは呼び出しプログラムのバッチ処理レベルを妨害せずに, バッチ処理を要求したり,バッチ処理をオフにすることができます。


[ 前のページ ] [ 次のページ ] [ 目次 ] [ 索引 ] [ DOC Home ]