このドキュメントでは、ユーザーとアプリケーションとの対話を簡単かつ柔軟に行うキャラクタユーザーインターフェイスの設計方法について説明します。
注意:
グラフィカルユーザーインターフェイス(GUI)の詳細については、「イベントドリブンプログラミングについて」を参照してください。
以下のトピックについて説明します。
システム変数 *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
および 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 は、マップの入力データを使用して単純な加算処理を実行しています。 このマップでは、拡張フィールド編集の AL フィールドで指定されている長さの変更可能なフィールドとして、(マップの最後に)*COM
は定義されています。 計算結果はウィンドウに表示されます。 このウィンドウには入力できませんが、ウィンドウ外部のマップ内では引き続き *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=A
、または AD=M
)を持っていない場合、カーソルはウィンドウの左上隅に配置されます。
アクティブなウィンドウに入力フィールドがない場合、端末コマンド %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
ステートメントの再実行時に 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 コマンドプロセッサは、アプリケーション内のナビゲーション(移動操作)を定義および制御するために使用します。 Natural コマンドプロセッサは、開発部分とランタイム部分の 2 つの部分によって構成されています。
開発部分は、ユーティリティ SYSNCP です。 このユーティリティを使用すると、コマンド、およびこれらのコマンドの実行に対応するアクションを定義できます。 SYSNCP は、管理者が設定した定義により、コマンド入力時に実行する処理を判断するデシジョンテーブルを生成します。
ランタイム部分は、ステートメント PROCESS COMMAND
です。 このステートメントは、Natural プログラムからコマンドプロセッサを呼び出すために使用します。 このステートメントで、データ入力時の操作に使用する SYSNCP テーブルの名前を指定します。
Natural コマンドプロセッサの詳細については、『ユーティリティ』ドキュメントの「SYSNCP ユーティリティ」、および『ステートメント』ドキュメントの「PROCESS COMMAND
」を参照してください。