iBIアライアンスはIBM i 市場における最強の専門家集団として、常にお客様システムのあるべき姿を研究し、技術的な研鑽を重ねています。参加11社は主軸とする事業領域や得意技術はそれぞれ異なるものの、IBM i への特別な思い入れと市場への強い危機感を共有しています。そんなグループが今後を見据えて定期的に開催している「勉強会」・・・IBM i の「これから」に必ず役立つ技術を習得する場で紹介されている内容の一部を連載形式でご紹介します。
第4回はWindows系のアプリケーションではおなじみのメニューバーの実装についてご紹介します。
メニューバーを追加してみよう
オープン系のアプリケーションでは標準と言えるメニューバーですが、これもエミュレータ画面で実装する事ができます。今までご紹介してきたキーワードと比べて、修正箇所は多くなりますが、オープン系アプリケーションに慣れたユーザーには違和感なく使って頂ける機能であり有用ではないかと思います。
従来の24x80(*DS3)画面でもメニューバーを使う事は可能ですが、メニューバーが1・2行目を占有する事に注意しましょう。
ここでは、*DS3で出来た入力画面を*DS4に拡張して、メニューバーを追加する方法をご紹介します。
この画面にメニューバーを追加する為には、メニューバー内の機能を決める必要があります。現行のファンクションキーから、メニューバーへ移行できるものを選択します。
F2:POP画面 →POP画面の表示 F3:終了 →プログラム終了 F5:モード切替 →モード選択画面の表示 F6:処理切替 →処理切替画面の表示 F12:前画面 →前画面に戻る
これらのファンクションキーの機能をメニューバーにまとめて、
処理メニュー: POP画面、前画面、終了 モード切替メニュー:登録、修理/削除 処理切替メニュー:在庫照会など別プログラムの起動
※処理切替メニューに設定されるプログラムは、別マスターに登録されているものを使い、動的に変更される事を考慮します。
では、最初に画面サイズを拡張して、メニューバーの表示エリアを確保します。*DS3から*DS4へ拡張し、画面全体を2行分下にずらして、1・2行目を空けます。これで、メニューバーの表示エリアが確保されました。
次に、画面ファイルのソースにメニューバーの記述を追加します。メニューバーを定義するには、MNUBARレコード1つと複数のPULLDOWNレコードが必要となります。これらのレコードを追加し、メニューバーを表示する元のレコードにはMNUBARDSPキーワードを追加します。
MNUBARSW①はメニューバーと通常画面のカーソル・フォーカス切替の為に割り当てるファンクションキーを指定しています。 これはファイル・レベル・キーワードです。
MNUBARレコードは、メニューバー要素とそれぞれに我当するレコード様式名を指定し、表示色などの属性も指定します。メニューバーの要素はMNUBARCHCキーワードで指定します。この場合、3つのプルダウン・メニューを設定しています。
MENU01~MENU03レコードは、メニューバーの各要素に該当するプルダウン・メニューの内容を定義します。MENU01とMENU02の内容は固定なので、CHOICEキーワードで選択番号と表示文字列を指定しますが、MENU03の内容は動的に変更したい為、表示名をフィールドとして定義しプログラムでセットするようにします。また、MENU01~MENU03それぞれに定義されるフィールドは、同名のN01としていますが、それぞれ別名にする事も可能です。この例では同名で定義しています。
次にメニューバーを表示したい画面にMNUBARDSPキーワードを指定します。これでその画面と一緒にメニューバーが表示され、オペレーションできるようになります。
MNUBARDSPキーワードには、表示したいメニューバー・レコードの様式名と、メニューバーが選択された際に戻される要素を指定します。この場合、MENUBARレコードが表示するメニューバー・レコードで、MENUフィールドにはメニューバーの要素番号(MNUBARCHCの値)、INPTフィールドには各PULLDOWNレコードの要素番号(CHOICEの値)が入る設定になっています。
この例では、FMT10をEXFMTするとメニューバーが表示され、メニューバーで「処理」の「終了」が選択された場合、MENUには1が入り、INPTには3が入ってプログラムに戻ります。
プログラム側の修正箇所
- メニューバーの3番目が動的に内容を変えるので、プログラムの初期処理でこれをセットします。
全て固定の場合、この処理は不要です。 - FMT10画面のEXFMT直後で、MENU及びINPTの値により処理を分岐させます。
このプログラムの例だと、メニューバーの各処理は元々ファンクションキーに割り当てられていたものなので、修正は簡単です。
MENU | INPT | 処理 |
---|---|---|
1 | 1 | F2の処理 |
1 | 2 | F12の処理 |
1 | 3 | F3の処理 |
2 | 1 | F5で1番が選択された処理 |
2 | 2 | F5で2番が選択された処理 |
3 | 1 | F6で1番が選択された処理 |
3 | 2 | F6で2番が選択された処理 |
3 | 3 | F5で3番が選択された処理 |
メニューバーを表示する為の2行分のスペースが確保できるかが重要になってきますが、今回の例のように画面サイズを*DS4に拡張すれば、そのスペースも容易に確保する事ができます。
その他考慮する点として、メニューバーはMNUBARレコードと、PULLDOWNレコードでそれぞれ定義するので、それぞれのレコード内のフィールドに対して入出力を行う場合は、そのレコードに対してREADやWRITEを行う必要があります。
今回の例では、メニュー3の「処理切替」メニューの内容をプログラム内でセットするので、下記のコーディングが追加されています。
N03Pxxは選択された際に実行されるプログラムID
N03Nxxはメニューに表示される文字列
セット後にMENU03レコードをWRITEします。
C SBINZ BEGSR C eval N03P01 = 'INQPGM' C eval N03N01 = ' 在庫照会 ' C eval N03P02 = 'INQPGM2' C eval N03N02 = ' 売掛元帳 ' C eval N03P03 = 'INQPGM3' C eval N03N03 = ' 売掛照会 ' C eval N03P04 = *blank C eval N03N04 = *blank C C WRITE MENU03
メニューバーは様々なパラメータの指定により、表示属性などを変更する事ができます。マニュアルをご覧になって活用して頂きたいと思います。
※本連載はIBM i 専門誌i Magazineに詳細版が掲載されます。ぜひそちらもご購読くださいませ。
株式会社 アイエステクノポート
本社:〒105-0012 東京都港区芝大門1-3-4 ラウンドクロス芝大門 8階
設立:1990年7月17日
事業内容:IBM i 搭載Power Systems(System i,i5,iSeries,AS/400)向けパッケージ・ツールの開発・販売(UT/400,SS/Tool,S/D Manager)、IBM製品の販売、アプリケーションソフトの開発・販売、情報システムのコンサルティング、情報システム運用・保守、インターネット/イントラネット構築