このドキュメントでは、ユーザーとアプリケーションとの対話を簡単かつ柔軟に行うキャラクタユーザーインターフェイスの設計方法について説明します。
以下のトピックについて説明します。
システム変数 *CURS-FIELD をシステム関数 POS(field-name) とともに使用すると、Enter キーが押された時点でカーソルが位置付けられているフィールドに基づいた処理を定義できます。
*CURS-FIELD には、カーソルが現在位置付けられている入力フィールドの内部 ID が格納されます。この ID は単体では使用できません。POS(field-name) と組み合わせてのみ使用できます。
*CURS-FIELD および POS(field-name) は、例えば、特定のフィールドにカーソルを配置して Enter キーを押すだけで機能を選択できるようにするために使用できます。
以下の例は、そのようなアプリケーションを示しています。
DEFINE DATA LOCAL
1 #EMP (A1)
1 #CAR (A1)
1 #CODE (N1)
END-DEFINE
*
INPUT USING MAP 'CURS'
*
DECIDE FOR FIRST CONDITION
WHEN *CURS-FIELD = POS(#EMP) OR #EMP = 'X' OR #CODE = 1
FETCH 'LISTEMP'
WHEN *CURS-FIELD = POS(#CAR) OR #CAR = 'X' OR #CODE = 2
FETCH 'LISTCAR'
WHEN NONE
REINPUT 'PLEASE MAKE A VALID SELECTION'
END-DECIDE
END
結果は以下のとおりです。
SAMPLE MAP
Please select a function
1.) Employee information _
2.) Vehicle information _ <== Cursor positioned
on field
Enter code: _
To select a function, do one of the following:
- place the cursor on the input field next to desired function and press Enter
- mark the input field next to desired function with an X and press Enter
- enter the desired function code (1 or 2) in the 'Enter code' field and press
Enter
|
ユーザーがカーソルを[Employee information]の隣の入力フィールド(#EMP)に配置して Enter キーを押すと、プログラム LISTEMP によって従業員名のリストが表示されます。
Page 1 2001-01-22 09:39:32
NAME
--------------------
ABELLAN
ACHIESON
ADAM
ADKINSON
ADKINSON
ADKINSON
ADKINSON
ADKINSON
ADKINSON
ADKINSON
ADKINSON
AECKERLE
AFANASSIEV
AFANASSIEV
AHL
AKROYD
|
注意:
*CURS-FIELD によって識別されます。*CURS-FIELD を POS 関数と併せて使用することにより、入力にフォーカスがあり、その条件に応じて処理を実行するコントロールをチェックできます。
*CURS-FIELD および POS(field-name) の値は、フィールドの内部 ID の取得にのみ使用します。算術演算には使用できません。
Natural システム関数 POS(field-name) は、指定された名前のフィールドの内部 ID を返します。
POS(field-name) はマップ内の位置と関係なく、特定のフィールドを識別するのに使用できます。これは、マップ内のフィールドのシーケンスと数が変更されても、POS(field-name) は引き続き同じフィールドを一意に識別できることを意味します。これにより、例えば、プログラムロジックに依存しているとフィールドに MARK を付ける場合、必要なのは 1 つの REINPUT ステートメントのみになります。
注意:POS(field-name) の値は、フィールドの内部 ID の取得にのみ使用します。算術演算には使用できません。
例:
...
DECIDE ON FIRST VALUE OF ...
VALUE ...
COMPUTE #FIELDX = POS(FIELD1)
VALUE ...
COMPUTE #FIELDX = POS(FIELD2)
...
END-DECIDE
...
REINPUT ... MARK #FIELDX
...
*CURS-FIELD および POS(field-name) の詳細については、『システム変数』ドキュメントおよび『システム関数』ドキュメントを参照してください。
システム変数 *CURS-LINE を使用すると、Enter キーが押された時点でカーソルが位置付けられている行に基づいた処理を作成できます。
この変数を使用することにより、ユーザーが使いやすいメニューを作成できます。適切なプログラミングが行われていれば、ユーザーは実行したいメニューオプションの行にカーソルを移動して Enter キーを押すだけで、そのオプションを実行できます。
カーソルの位置は、画面上の物理的な位置に関係なく、その時点のアクティブなウィンドウ内の位置で定義されます。
注意:
メッセージ行、ファンクションキー行、および情報行/統計行は、画面上のデータ行とは見なされません。
以下の例は、*CURS-LINE システム変数を使用した、行に基づいた処理を示しています。マップ上で Enter キーが押されると、オプション[Employee information]がある 8 行目にカーソルが配置されているかどうかがプログラムによって確認されます。8 行目にカーソルがある場合、従業員名をリストするプログラム LISTEMP が実行されます。
DEFINE DATA LOCAL
1 #EMP (A1)
1 #CAR (A1)
1 #CODE (N1)
END-DEFINE
*
INPUT USING MAP 'CURS'
*
DECIDE FOR FIRST CONDITION
WHEN *CURS-LINE = 8
FETCH 'LISTEMP'
WHEN NONE
REINPUT 'PLACE CURSOR ON LINE OF OPTION YOU WISH TO SELECT'
END-DECIDE
END
出力:
Company Information
Please select a function
[] 1.) Employee information
2.) Vehicle information
Place the cursor on the line of the option you wish to select and press
Enter |
[] で表示されているカーソルを希望するオプションに移動して Enter キーを押すと、対応するプログラムが実行されます。
システム変数 *CURS-COL は、前述の *CURS-LINE と同様に使用できます。*CURS-COL を使用すると、画面上でカーソルが位置付けられている列に基づいた処理を作成できます。
ユーザーが押したファンクションキーに応じて処理を行う必要がある場合は少なくありません。
これは、ステートメント SET KEY とシステム変数 *PF-KEY を使用し、デフォルトのマップ設定(Standard Keys =
Y)を変更することによって実現できます。
SET KEY ステートメントは、プログラムの実行中に機能をファンクションキーに割り当てます。システム変数 *PF-KEY には、ユーザーが最後に押したファンクションキーの ID が格納されます。
以下の例は、*PF-KEY と組み合わせた SET KEY の使い方を示しています。
... SET KEY PF1 * INPUT USING MAP 'DEMO&' IF *PF-KEY = 'PF1' WRITE 'Help is currently not active' END-IF ...
SET KEY ステートメントによって、PF1 キーがファンクションキーとして有効化されています。
IF ステートメントは、ユーザーが PF1 キーを押したときに実行するアクションを定義しています。システム変数 *PF-KEY の現在の値を確認し、その値が PF1 の場合は、対応するアクションを実行します。
ステートメント SET KEY およびシステム変数 *PF-KEY の詳細については、それぞれ『ステートメント』ドキュメントおよび『システム変数』ドキュメントを参照してください。
ファンクションキーに基づいた処理を定義する場合、システム変数 *PF-NAME を使用するとさらに快適に定義できます。この変数を使用すると、特定のキーではなく、ファンクションの名前に応じた処理を作成できます。
変数 *PF-NAME には、ユーザーが最後に押したファンクションキーの名前、つまり、SET KEY ステートメントの NAMED 節でキーに割り当てた名前が格納されます。
例えば、PF3 キーまたは PF12 キーが押されたらヘルプを起動できるようにする場合、両方のキーに同じ名前(以下の例では:INFO)を割り当てます。ユーザーがこれらのどちらかのキーを押すと、IF ステートメントで定義した処理が実行されます。
...
SET KEY PF3 NAMED 'INFO'
PF12 NAMED 'INFO'
INPUT USING MAP 'DEMO&'
IF *PF-NAME = 'INFO'
WRITE 'Help is currently not active'
END-IF
...
NAMED節で定義したファンクション名はファンクションキー行に表示されます。
以下に参考情報を示します。
「画面設計」の「ウィンドウ」で説明されているとおり、アクティブになれるウィンドウは常に 1 つだけです。これは、通常は、その特定のウィンドウ内でのみ入力が可能だということです。
通信エリアと見なされる *COM システム変数を使用すると、アクティブなウィンドウの外でデータを入力できます。
ただし、マップに *COM が変更可能なフィールドとして含まれていることが前提条件です。この条件が満たされていれば、ウィンドウが画面上に表示されているときは、このフィールドにデータを入力できます。*COM の内容に応じて、追加の処理を実行できます。
これにより、入力フィールドを持つウィンドウがアクティブな場合でも常にユーザーがコマンド行にデータを入力できる、Software AG のオフィスシステム Con-nect ですでに使用されているようなユーザーインターフェイスを実装できます。
*COM は、Natural セッションが終了するときにのみクリアされます。
以下の例では、プログラム ADD は、マップの入力データを使用して単純な加算処理を実行しています。このマップでは、*COM は、Extended
Field Editing の AL フィールドで指定されている長さの変更可能なフィールドとして(マップの最後に)定義されています。計算結果はウィンドウに表示されます。このウィンドウには入力できませんが、ウィンドウ外部のマップ内では引き続き
*COM フィールドを使用できます。
DEFINE DATA LOCAL
1 #VALUE1 (N4)
1 #VALUE2 (N4)
1 #SUM3 (N8)
END-DEFINE
*
DEFINE WINDOW EMP
SIZE 8*17
BASE 10/2
TITLE 'Total of Add'
CONTROL SCREEN
FRAMED POSITION SYMBOL BOT LEFT
*
INPUT USING MAP 'WINDOW'
*
COMPUTE #SUM3 = #VALUE1 + #VALUE2
*
SET WINDOW 'EMP'
INPUT (AD=O) / 'Value 1 +' /
'Value 2 =' //
' ' #SUM3
*
IF *COM = 'M'
FETCH 'MULTIPLY' #VALUE1 #VALUE2
END-IF
END
プログラム ADD の出力:
Map to Demonstrate Windows with *COM
CALCULATOR
Enter values you wish to calculate
Value 1: 12__
Value 2: 12__
+-Total of Add-+
! !
! Value 1 + !
! Value 2 = !
! !
! 24 !
! !
+--------------+
Next line is input field (*COM) for input outside the window:
|
この例では、値 M を入力すると、乗算が開始されます。入力マップの 2 つの値を乗算した結果が 2 つ目のウィンドウに表示されます。
Map to Demonstrate Windows with *COM
CALCULATOR
Enter values you wish to calculate
Value 1: 12__
Value 2: 12__
+-Total of Add-+ +--------------+
! ! ! !
! Value 1 + ! ! Value 1 x !
! Value 2 = ! ! Value 2 = !
! ! ! !
! 24 ! ! 144 !
! ! ! !
+--------------+ +--------------+
Next line is input field (*COM) for input outside the window:
M
|
通常、ウィンドウがアクティブで入力フィールド(AD=M または AD=A)が含まれていない場合、カーソルはウィンドウの左上隅に置かれます。
アクティブなウィンドウに入力フィールドがない場合、端末コマンド %T* を使用すると、ウィンドウの外にあるシステム変数 *COM にカーソルを配置できます。
%T* を再度使用すると、標準のカーソル位置に戻せます。
例:
...
INPUT USING MAP 'WINDOW'
*
COMPUTE #SUM3 = #VALUE1 + #VALUE2
*
SET CONTROL 'T*'
SET WINDOW 'EMP'
INPUT (AD=O) / 'Value 1 +' /
'Value 2 =' //
' ' #SUM3
...
以下に参考情報を示します。
これらの端末コマンドを使用すると、画面の一部を Natural スタック(%CS)またはシステム変数 *COM(%CC)にコピーできます。特定の画面行の保護データがフィールドごとにコピーされます。
これらの端末コマンドのすべてのオプションについては、『端末コマンド』ドキュメントを参照してください。
スタックまたは *COM にコピーされたデータは、その後の処理で使用できます。これらのコマンドを使用すると、以下の例のような、使いやすいインターフェイスを作成できます。
以下の例では、プログラム COM1 は、Abellan から Alestia までのすべての従業員名をリストしています。
DEFINE DATA LOCAL 1 EMP VIEW OF EMPLOYEES 2 NAME(A20) 2 MIDDLE-NAME (A20) 2 PERSONNEL-ID (A8) END-DEFINE * READ EMP BY NAME STARTING FROM 'ABELLAN' THRU 'ALESTIA' DISPLAY NAME END-READ FETCH 'COM2' END
プログラム COM1 の出力:
Page 1 2006-08-12 09:41:21
NAME
--------------------
ABELLAN
ACHIESON
ADAM
ADKINSON
ADKINSON
ADKINSON
ADKINSON
ADKINSON
ADKINSON
ADKINSON
ADKINSON
AECKERLE
AFANASSIEV
AFANASSIEV
AHL
AKROYD
ALEMAN
ALESTIA
MORE
|
プログラムの制御は COM2 に移されています。
DEFINE DATA LOCAL 1 EMP VIEW OF EMPLOYEES 2 NAME(A20) 2 MIDDLE-NAME (A20) 2 PERSONNEL-ID (A8) 1 SELECTNAME (A20) END-DEFINE * SET KEY PF5 = '%CCC' * INPUT NO ERASE 'SELECT FIELD WITH CURSOR AND PRESS PF5' * MOVE *COM TO SELECTNAME FIND EMP WITH NAME = SELECTNAME DISPLAY NAME PERSONNEL-ID END-FIND END
このプログラムでは、端末コマンド %CCC が PF5 に割り当てられています。この端末コマンドは、カーソルが配置されている行のすべての保護データをシステム変数 *COM にコピーします。コピーされた情報は、その後の処理で使用できます。この処理は、太字で記述されているプログラム行に定義されています。
任意の名前にカーソルを合わせて PF5 キーを押すと、詳しい従業員情報が出力されます。
SELECT FIELD WITH CURSOR AND PRESS PF5 2006-08-12 09:44:25
NAME
--------------------
ABELLAN
ACHIESON
ADAM <== Cursor positioned on name for which more information is required
ADKINSON
ADKINSON
ADKINSON
ADKINSON
ADKINSON
ADKINSON
ADKINSON
ADKINSON
AECKERLE
AFANASSIEV
AFANASSIEV
AHL
AKROYD
ALEMAN
ALESTIA
|
この場合、選択した従業員の個人 ID が表示されます。
Page 1 2006-08-12 09:44:52
NAME PERSONNEL
ID
-------------------- ---------
ADAM 50005800
|
INPUT ステートメントに戻って再度実行する必要がある場合、REINPUT ステートメントを使用します。これは通常、前の INPUT ステートメントの結果、データ入力が無効であったことを示すメッセージを表示するために使用します。
REINPUT ステートメントで FULL オプションを使用すると、対応する INPUT ステートメントが完全に再実行されます。
FULL オプションを使用しない通常の REINPUT ステートメントでは、INPUT ステートメントと REINPUT ステートメントの間で変更された変数の内容は表示されません。つまり、画面上のすべての変数は、INPUT ステートメントが初めて実行されたときに保持していた内容を示します。
REINPUT
FULL ステートメントでは、INPUT ステートメントの最初の実行後に行われたすべての変更が、INPUT ステートメントの再実行時に適用されます。つまり、画面上のすべての変数は、REINPUT ステートメントの実行時に保持していた値を含みます。
カーソルを特定のフィールドに配置する場合、MARK オプションを使用できます。また、特定のフィールド内の特定の位置にカーソルを配置する場合は、MARK POSITION オプションを使用します。
以下の例は、MARK
POSITION を使用した REINPUT
FULL の使い方を示しています。
DEFINE DATA LOCAL 1 #A (A10) 1 #B (N4) 1 #C (N4) END-DEFINE * INPUT (AD=M) #A #B #C IF #A = ' ' COMPUTE #B = #B + #C RESET #C REINPUT FULL 'Enter a value' MARK POSITION 5 IN *#A END-IF END
フィールド #B に「3」、フィールド #C に「3」と入力して、Enter キーを押します。
#A #B 3 #C 3 |
プログラムは、フィールド #A に空白以外の値を必要とします。MARK POSITION 5 IN *#A を使用した REINPUT FULL ステートメントによって、制御が入力画面に戻ります。COMPUTE で計算が実行されているため、変更可能なフィールド #B に値 6 が設定されています。カーソルはフィールド #A の 5 番目のポジションに配置され、すぐに入力できるようになっています。
Enter name of field
#A _ #B 6 #C 0
Enter a value
|
以下の画面は、FULL オプションを使用しなかった場合に、同じステートメントによって返される画面です。変数 #B および #C が INPUT ステートメントの実行時の状態に戻されている(各フィールドの値が 3)ことに注意してください。
#A _ #B 3 #C 3 |
Natural コマンドプロセッサは、アプリケーション内のナビゲーション(移動操作)を定義および制御するために使用します。これは、開発部分とランタイム部分の 2 つの部分によって構成されています。
開発部分は、ユーティリティ SYSNCP です。このユーティリティを使用すると、コマンド、およびこれらのコマンドの実行に対応するアクションを定義できます。SYSNCP は、管理者が設定した定義により、コマンド入力時に実行する処理を判断するデシジョンテーブルを生成します。
ランタイム部分は、ステートメント PROCESS COMMAND です。このステートメントは、Natural プログラムからコマンドプロセッサを呼び出すために使用します。このステートメントで、データ入力時の操作に使用する SYSNCP テーブルの名前を指定します。
Natural コマンドプロセッサの詳細については、『ユーティリティ』ドキュメントの「SYSNCP ユーティリティ」、および『ステートメント』ドキュメントの「PROCESS COMMAND」を参照してください。