前回はパネル・グループで操作指示を表示する簡単な方法を紹介した。
今回はまさにテクニックといえる裏ワザを紹介する。
こんな方法もあるのだと驚いて頂ければ幸いである。

パネル・グループでメニューを開発していると現在の状況などを
情報表示したい場合がある。
CLPなどプログラム・メニューであればことは簡単で
UIMメニューでも情報を表示する変数を定義して
UIMメニューを表示すればよいことになるので
早速、VAR変数やCLASS定義をパネル・グループに定義して
CRTMNU でコンパイルしてみるとVAR変数やCLASS定義も
すべてコンパイル・エラーになってしまう。
*MENUを作成するCRTMNU では VAR変数やCLASS定義は定義することが
できない文法エラーとなってしまうのである。
さあ、ここでどうする?
読者諸氏の中には「やっぱりパネル・グループでメニューを
作成するには限界があるのでは…?」と思われる方もいるかもしれないが
実はそうではない。
ここからがテクニックであるが解決方法は
1. CRTMENUではなくCRTPNLGRPでパネル・グループを作成する。
2. CLPでパネル・グループをオープンするプログラムを作成する
3. CRTMNUコマンドで *PGMタイプのメニューとして作成する
MENUタグを含むパネル・グループもCRTMNUではなくCRTPNLGRPで
パネル・グループとして作成することもできる。
さらにはそのパネル・グループを表示するだけで
MENUタグはメニュー項目として機能する。
これがパネル・グループの非常に柔軟なところである。
参考とし製品the WINDOWSライターのメイン・メニューを紹介する。
[メニュー GO WINDOWS ]
the WINDOWS ライター・メニュー
システム : S652EA92
状況 : ログ開始中
次の中から1つを選んでください。
ライターの開始と終了
1. サブ・システム WINDOWS の開始 STRSBS WINDOWS
2. WINDOWS ライターの開始 STRWINWTR( かんたんウィザード )
3. 終了 ENDWINWTR
4. プリンタ定義ファイル (PDF) の保守 EDTF /WONDOWS/PDF
組織と部門を登録する
11. 部門組織の登録 WRKDEPMENT
装置記述の構成を登録と運用
21. WINDOWS ライターの構成 WRKWINWTR
22. かんたんウィザード CRTDEVAUT
続く ...
選択項目またはコマンド
===>
F3= 終了 F4= プロンプト F5= 活動状況 F6= メッセージ
F7= ジョブ・ログの表示 F9= コマンドの複写 F12= 取消し F24= キーの続き
F5 キーを押して WINDOWS ライターを確認してください。
[解説]
メニューの右上部には状況として「ログ開始中」と表示されているのが情報表示の変数である。
オプションを選択してジョブ・ログを開始/終了すると現在の状況が表示されるように
なっている。
[パネル・グループ WINDOWS ]
ソースはこちらから
0001.00 .*******************************************************************
0002.00 .*
0003.00 .* PANEL GRP NAME: WINDOWS
0004.00 .*
0005.00 .* TEXT : WINDOWS ライター・メニュー
0006.00 .*
0007.00 .* TYPE : 単一メニュー・パネル
0008.00 .*
0009.00 .* SRCF : R610SRC/QMNUSRC(WINDOWS)
0010.00 .*
0011.00 .* 作成日 : 2019/04/29 7:10:51
0012.00 .*
0013.00 .* 作成ユーザー : QTR QPADEV0035
0014.00 .*
0015.00 .* 変更日 : 2019/04/29 7:10:51
0016.00 .*
0017.00 .* 変更ユーザー : QTR QPADEV0035
0018.00 .*
0019.00 .*******************************************************************
0020.00
0021.00 :PNLGRP.
0022.00 :COPYR.
0023.00 F5 キーを押して WINDOWS ライターを確認してください
0024.00 :IMPORT NAME='*' PNLGRP=CMDMNU.
0025.00 .* -------------------------
0026.00 .* クラスの定義
0027.00 .* -------------------------
0028.00 :CLASS NAME=MODECL
0029.00 BASETYPE='CHAR 7'.
0030.00 :TL.
0031.00 :TI VALUE='" "'. 状況 :
0032.00 :ETL.
0033.00 :ECLASS.
0034.00 :CLASS NAME=CHA0006
0035.00 BASETYPE='CHAR 6'.
0036.00 :ECLASS.
0037.00 :CLASS NAME=CHA0012
0038.00 BASETYPE='CHAR 12'.
0039.00 :ECLASS.
0040.00 :CLASS NAME=CHA0020
0041.00 BASETYPE='CHAR 20'.
0042.00 :ECLASS.
0043.00 .* -------------------------
0044.00 .* 変数の定義
0045.00 .* -------------------------
0046.00 :VAR NAME=ZMENU.
0047.00 :VAR NAME=MODE CLASS=MODECL.
0048.00 :VAR NAME=DSPMOD CLASS=CHA0012.
0049.00 :VAR NAME=UPDWINMOD CLASS=CHA0020.
0050.00 .* -------------------------
0051.00 .* レコードの定義
0052.00 .* -------------------------
0053.00 :VARRCD NAME=UPDMODRCD VARS='UPDWINMOD'.
0054.00 :VARRCD NAME=DSPMODRCD VARS='DSPMOD'.
0055.00 .* -------------------------
0056.00 .* 条件の定義
0057.00 .* -------------------------
0058.00 :COND NAME=STRLOG
0059.00 EXPR='CHKOBJ("QTEMP/LOG", "*DTAARA")'.
0060.00 :COND NAME=ENDLOG
0061.00 EXPR='*NOT(CHKOBJ("QTEMP/LOG","*DTAARA"))'.
0062.00 .* -------------------------
0063.00 .* 機能キーの定義
0064.00 .* -------------------------
0065.00 :KEYL NAME=MNUKEYL.
0066.00 :KEYI KEY=ENTER
0067.00 HELP=ENTER
0068.00 ACTION=ENTER.
0069.00 :KEYI KEY=HELP
0070.00 HELP=HELP
0071.00 ACTION=HELP.
0072.00 :KEYI KEY=F3
0073.00 HELP=F3
0074.00 ACTION='EXIT SET'
0075.00 VARUPD=NO.
0076.00 F3= 終了
0077.00 :KEYI KEY=F4
0078.00 HELP=F4
0079.00 ACTION='PROMPT'
0080.00 VARUPD=NO.
0081.00 F4= プロンプト
0082.00 :KEYI KEY=F5
0083.00 HELP=F5
0084.00 ACTION='CMD WINDOWS/WRKWTRJOB'
0085.00 VARUPD=NO.
0086.00 F5= 活動状況
0087.00 :KEYI KEY=F6
0088.00 HELP=F6
0089.00 ACTION='CMD DSPMSG'
0090.00 VARUPD=NO.
0091.00 F6= メッセージ
0092.00 :KEYI KEY=F7
0093.00 HELP=F7
0094.00 ACTION='CMD WRKOUTQ WINUSRSYS/QEZJOBLOG'
0095.00 VARUPD=NO.
0096.00 F7= ジョブ・ログの表示
0097.00 :KEYI KEY=F9
0098.00 HELP=F9
0099.00 ACTION='RETRIEVE'
0100.00 VARUPD=NO.
0101.00 F9= コマンドの複写
0102.00 :KEYI KEY=F10
0103.00 HELP=F10
0104.00 ACTION='CMD CALL QCMD'
0105.00 VARUPD=NO.
0106.00 F10= コマンド入力
0107.00 :KEYI KEY=F12
0108.00 HELP=F12
0109.00 ACTION='CANCEL SET'
0110.00 VARUPD=NO.
0111.00 F12= 取消し
0112.00 :KEYI KEY=F13
0113.00 HELP=F13
0114.00 ACTION='CMD WINDOWS/WRKOUTQ OUTQ(*LIBL/*ALL)'
0115.00 VARUPD=NO.
0116.00 F13= 印刷待ち行列
0117.00 :KEYI KEY=F24
0118.00 HELP=F24
0119.00 ACTION=MOREKEYS
0120.00 VARUPD=NO.
0121.00 F24= キーの続き
0122.00 :KEYI KEY=PAGEUP
0123.00 HELP=PAGEUP
0124.00 ACTION=PAGEUP.
0125.00 :KEYI KEY=PAGEDOWN
0126.00 HELP=PAGEDOWN
0127.00 ACTION=PAGEDOWN.
0128.00 :EKEYL.
0129.00 .* -------------------------
0130.00 .* ヘルプの定義
0131.00 .* -------------------------
0132.00 .* STRHLPDFN : DO NOT REMOVE THIS LINE
0133.00 :HELP NAME=OPTION01. サブ・システム WINDOWS の開始
0134.00 :XH3.
0135.00 サブ・システム WINDOWS の開始
0136.00 :P.
0137.00 :PC.
0138.00 :EHELP.
0139.00 :HELP NAME=OPTION02.WINDOWS ライターの開始
0140.00 :XH3.
0141.00 WINDOWS ライターの開始
0142.00 :P.
0143.00 :PC.
0144.00 :EHELP.
0145.00 .* ENDHLPDFN : DO NOT REMOVE THIS LINE
0146.00 .* STRHLPDFN : DO NOT REMOVE THIS LINE
0147.00 :HELP NAME=OPTION03.WINDOWS ライター終了
0148.00 :XH3.
0149.00 WINDOWS ライター終了
0150.00 :P.
0151.00 :PC.
0152.00 :EHELP.
0153.00 .* ENDHLPDFN : DO NOT REMOVE THIS LINE
0154.00 .* -------------------------
0155.00 .* 表 示 パ ネ ル
0156.00 .* -------------------------
0157.00 :PANEL NAME=DSPMNU HELP='MENU'
0158.00 KEYL=MNUKEYL
0159.00 PANELID=ZMENU
0160.00 ENTER='MSG CPD9817 QCPFMSG'
0161.00 USREXIT='CALL UPDWINMOD'
0162.00 TOPSEP=SYSNAM.
0163.00 the WINDOWS ライター・メニュー
0164.00 :DATA DEPTH=1
0165.00 HELP='DSPTOPH'
0166.00 BOTSEP=NONE.
0167.00 :DATACOL WIDTH=53.
0168.00 :DATACOL WIDTH='*'.
0169.00 :DATAI VAR=MODE
0170.00 USAGE=OUT.
0171.00 :DATAIX VAR=DSPMOD
0172.00 ALIGN=RIGHT
0173.00 NEWLINE=NO
0174.00 USAGE=OUT.
0175.00 :EDATA.
0176.00 :MENU DEPTH='*'
0177.00 SCROLL=YES
0178.00 BOTSEP=SPACE.
0179.00 :TOPINST. 次の中から1つを選んでください。
0180.00 .* STRMNUDFN : DO NOT REMOVE THIS LINE
0181.00 :MENUGRP. ライターの開始と終了
0182.00 :MENUI OPTION=01
0183.00 ACTION='CMD ?STRSBS WINDOWS/WINDOWS'
0184.00 HELP='OPTION01'.
0185.00 サブ・システム WINDOWS の開始 STRSBS WINDOWS
0186.00 :MENUI OPTION=02
0187.00 ACTION='CMD CALL WINDOWS/STRWINSTR'
0188.00 HELP='OPTION02'.
0189.00 WINDOWS ライターの開始 STRWINWTR( かんたんウィザード )
0190.00 .* ENDMNUDFN : DO NOT REMOVE THIS LINE
0191.00 .* STRMNUDFN : DO NOT REMOVE THIS LINE
0192.00 :MENUI OPTION=03
0193.00 ACTION='CMD ?WINDOWS/ENDWINWTR'
0194.00 HELP='OPTION03'.
0195.00 終了 ENDWINWTR
0196.00 .* ENDMNUDFN : DO NOT REMOVE THIS LINE
0197.00 :MENUI OPTION=04
0198.00 ACTION='CMD ?EDTF STMF(''/WINDOWS/PDF'')'
0199.00 HELP='OPTION03'.
0200.00 プリンタ定義ファイル (PDF) の保守 EDTF /WONDOWS/PDF
0201.00 :EMENUGRP.
0202.00 :MENUGRP. 組織と部門を登録する
0203.00 :MENUI OPTION=11
0204.00 ACTION='CMD WINDOWS/WRKDEPMENT'
0205.00 HELP='OPTION11'.
0206.00 部門組織の登録 WRKDEPMENT
0207.00 :EMENUGRP.
0208.00 :MENUGRP. 装置記述の構成を登録と運用
0209.00 :MENUI OPTION=21
0210.00 ACTION='CMD ?WINDOWS/WRKWINWTR'
0211.00 HELP='OPTION11'.
0212.00 WINDOWS ライターの構成 WRKWINWTR
0213.00 :MENUI OPTION=22
0214.00 ACTION='CMD ?WINDOWS/CRTDEVAUT'
0215.00 HELP='OPTION11'.
0216.00 かんたんウィザード CRTDEVAUT
0217.00 :EMENUGRP.
0218.00 :MENUGRP. 作成
0219.00 :MENUI OPTION=23
0220.00 ACTION='CMD ?WINDOWS/CRTDEVGDI'
0221.00 HELP='OPTION11'.
0222.00 GDi 印刷装置の作成 CRTDEVGDI
0223.00 :MENUI OPTION=24
0224.00 ACTION='CMD ?WINDOWS/CRTDEVPDT'
0225.00 HELP='OPTION11'.
0226.00 PDT 印刷装置の作成 CRTDEVPDT
0227.00 :MENUI OPTION=25
0228.00 ACTION='CMD ?WINDOWS/CRTDEVLPD'
0229.00 HELP='OPTION11'.
0230.00 LPD 印刷装置の作成 CRTDEVLPD
0231.00 :EMENUGRP.
0232.00 :MENUGRP. 変更
0233.00 :MENUI OPTION=26
0234.00 ACTION='CMD ?WINDOWS/CHGDEVGDI'
0235.00 HELP='OPTION11'.
0236.00 GDi 印刷装置の変更 CHGDEVGDI
0237.00 :MENUI OPTION=27
0238.00 ACTION='CMD ?WINDOWS/CHGDEVPDT'
0239.00 HELP='OPTION11'.
0240.00 PDT 印刷装置の変更 CHGDEVPDT
0241.00 :MENUI OPTION=28
0242.00 ACTION='CMD ?WINDOWS/CHGDEVLPD'
0243.00 HELP='OPTION11'.
0244.00 LPD 印刷装置の変更 CHGDEVLPD
0245.00 :EMENUGRP.
0246.00 :MENUGRP. 削除
0247.00 :MENUI OPTION=29
0248.00 ACTION='CMD ?WINDOWS/DLTDEVGDI'
0249.00 HELP='OPTION11'.
0250.00 GDi 印刷装置の削除 DLTDEVGDI
0251.00 :MENUI OPTION=30
0252.00 ACTION='CMD ?WINDOWS/DLTDEVPDT'
0253.00 HELP='OPTION11'.
0254.00 PDT 印刷装置の削除 DLTDEVPDT
0255.00 :MENUI OPTION=31
0256.00 ACTION='CMD ?WINDOWS/DLTDEVLPD'
0257.00 HELP='OPTION11'.
0258.00 LPD 印刷装置の削除 DLTDEVLPD
0259.00 :EMENUGRP.
0260.00 :MENUGRP. 表示
0261.00 :MENUI OPTION=32
0262.00 ACTION='CMD ?WINDOWS/DSPDEVGDI'
0263.00 HELP='OPTION11'.
0264.00 GDi 印刷装置の表示 DSPDEVGDI
0265.00 :MENUI OPTION=33
0266.00 ACTION='CMD ?WINDOWS/DSPDEVPDT'
0267.00 HELP='OPTION11'.
0268.00 PDT 印刷装置の表示 DSPDEVPDT
0269.00 :MENUI OPTION=34
0270.00 ACTION='CMD ?WINDOWS/DSPDEVLPD'
0271.00 HELP='OPTION11'.
0272.00 LPD 印刷装置の表示 DSPDEVLPD
0273.00 :EMENUGRP.
0274.00 :MENUGRP. 活動プリンターの開始と終了
0275.00 :MENUI OPTION=35
0276.00 ACTION='CMD WINDOWS/WRKPRTWTR'
0277.00 HELP='OPTION11'.
0278.00 活動プリンター処理 WRKPRTWTR
0279.00 :EMENUGRP.
0280.00 :MENUGRP. 問題解決の手引き
0281.00 :MENUI OPTION=41
0282.00 ACTION='CMD ?STRWINLOG'
0283.00 HELP='OPTION01'.
0284.00 WINDOWS ライター・ログ開始 STRWINLOG
0285.00 :MENUI OPTION=42
0286.00 ACTION='CMD ?ENDWINLOG'
0287.00 HELP='OPTION01'.
0288.00 終了 ENDWINLOG
0289.00 :MENUI OPTION=43
0290.00 ACTION='CMD WRKOUTQ WINUSRSYS/QEZJOBLOG'
0291.00 HELP='OPTION01'.
0292.00 ジョブ・ログの表示 QEZJOBLOG
0293.00 :MENUI OPTION=44
0294.00 ACTION='CMD ?WINDOWS/CLRLOG CLRLOG(WINUSRSYS/QEZJOBLOG)'
0295.00 HELP='OPTION01'.
0296.00 クリヤー CLRLOG
0297.00 :MENUI OPTION=45
0298.00 ACTION='CMD ?WRKCFGSTS CFGTYPE(*DEV) CFGD(*PRT)'
0299.00 HELP='OPTION01'.
0300.00 構成状況処理 WRKCFGSTS
0301.00 :EMENUGRP.
0302.00 :MENUGRP. 外字の登録
0303.00 :MENUI OPTION=51
0304.00 ACTION='CMD ?WINDOWS/CRTIGCTBL'
0305.00 HELP='OPTION01'.
0306.00 外字テーブルの作成 CRTIGCTBL
0307.00 :EMENUGRP.
0308.00 :MENUGRP. ライセンス
0309.00 :MENUI OPTION=61
0310.00 ACTION='CMD WINDOWS/DSPLIC OBJLIB(WINDOWS)'
0311.00 HELP='OPTION01'.
0312.00 ライセンスの確認 DSPLIC
0313.00 :EMENUGRP.
0314.00 :MENUGRP. マニュアルの参照
0315.00 :MENUI OPTION=71
0316.00 ACTION='CMD WINDOWS/WINUSERS'
0317.00 HELP='OPTION01'.
0318.00 ユーザーズ・ガイド WINUSERS
0319.00 :EMENUGRP.
0320.00 :MENUGRP. 導入後のセットアップ
0321.00 :MENUI OPTION=81
0322.00 ACTION='CMD WINDOWS/SETUP '
0323.00 HELP='SETUPH'.
0324.00 導入後のセットアップ SETUP
0325.00 :EMENUGRP.
0326.00 :EMENU.
0327.00 .* STRCMDDFN : DO NOT REMOVE THIS LINE
0328.00 :CMDLINE SIZE=LONG.
0329.00 選択項目またはコマンド
0330.00 .* ENDCMDDFN : DO NOT REMOVE THIS LINE
0331.00 :EPANEL.
0332.00
0333.00 :EPNLGRP.
0334.00 .* * * * END OF PANEL GROUP * * *
[コンパイル]
CRTPNLGRP OBJLIB/WINDOWS SRCFILE(MYSRCLIB/QMNUSRC) AUT(*ALL)
[解説]
このパネル・グループをCRTMNUコマンドで試しにコンパイルてみて欲しい。
CRTMNUでのコンパイルではCLASS定義やVAR定義、VARRCD定義などはことごとく
コンパイル・エラーとなるはずである。
*MENUをいきなり作成するCRTMNUではこれらのタグの使用は許されていない。
しかし今回はCRTPNLGRPでコンパイルするので正常にコンパイルできるはずである。
PANELを表示する
0157.00 :PANEL NAME=DSPMNU HELP='MENU'
0158.00 KEYL=MNUKEYL
0159.00 PANELID=ZMENU
0160.00 ENTER='MSG CPD9817 QCPFMSG'
0161.00 USREXIT='CALL UPDWINMOD'
0162.00 TOPSEP=SYSNAM.
でユーザー出口プログラムとして UPDWINMOD を定義していて
このプログラムが操作の都度パネル・グループの変数を更新する。
この出口プログラムのソースも紹介しておく。
[出口プログラムCLP:UPDWINMOD]
ソースはこちらから
0001.00 PGM PARM(&RCVPRM)
0002.00 /*-------------------------------------------------------------------*/
0003.00 /* UPDWINMOD: WINDOWS メニューのモード更新 */
0004.00 /* */
0005.00 /* 2021/05/07 作成 */
0006.00 /*-------------------------------------------------------------------*/
0007.00 DCL VAR(&RCVPRM) TYPE(*CHAR) LEN(70)
0008.00 DCL VAR(&MSG) TYPE(*CHAR) LEN(80)
0009.00 DCL VAR(&MSGID) TYPE(*CHAR) LEN(7)
0010.00 DCL VAR(&MSGF) TYPE(*CHAR) LEN(10)
0011.00 DCL VAR(&MSGFLIB) TYPE(*CHAR) LEN(10)
0012.00 DCL VAR(&MSGDTA) TYPE(*CHAR) LEN(132)
0013.00 DCL VAR(&HANDLE) TYPE(*CHAR) LEN(8) /* +
0014.00 摘要業務ハンドル */
0015.00 DCL VAR(&LHANDL) TYPE(*CHAR) LEN(4) /* +
0016.00 リストハンドル */
0017.00 DCL VAR(&LSTHND) TYPE(*CHAR) LEN(4) /* +
0018.00 リストハンドル */
0019.00 DCL VAR(&LSTNAM) TYPE(*CHAR) LEN(10)
0020.00 DCL VAR(&SFLLEN) TYPE(*CHAR) LEN(4) +
0021.00 VALUE(X'00000400') /* 2 進数 */
0022.00 DCL VAR(&LSTOPT) TYPE(*CHAR) LEN(4)
0023.00 DCL VAR(&SLCHND) TYPE(*CHAR) LEN(4)
0024.00 DCL VAR(&APIERR) TYPE(*CHAR) LEN(116) +
0025.00 VALUE(X'000074') /* 2 進数 */
0026.00 DCL VAR(&SFLDTA) TYPE(*CHAR) LEN(1024)
0027.00 DCL VAR(&ERR) TYPE(*CHAR) LEN(1)
0028.00 DCL VAR(&MSGTYPE) TYPE(*CHAR) LEN(10) +
0029.00 VALUE('*ESCAPE ')
0030.00 DCL VAR(&APIERR) TYPE(*CHAR) LEN(116) +
0031.00 VALUE(X'000074') /* 2 進数 */
0032.00 DCL VAR(&DTALEN) TYPE(*CHAR) LEN(4) +
0033.00 VALUE(X'0000000E') /* 2 進数 */
0034.00 DCL VAR(&CURLOG) TYPE(*CHAR) LEN(4)
0035.00 DCL VAR(&DSPMODRCD) TYPE(*CHAR) LEN(14)
0036.00 DCL VAR(&DSPMOD) TYPE(*CHAR) LEN(12)
0037.00 DCL VAR(&WHTCLR) TYPE(*CHAR) LEN(1) VALUE(X'22')
0038.00 DCL VAR(&ENDCLR) TYPE(*CHAR) LEN(1) VALUE(X'20')
0039.00 MONMSG MSGID(CPF0000) EXEC(GOTO CMDLBL(ERROR))
0040.00
0041.00 CHGVAR VAR(&HANDLE) VALUE(%SST(&RCVPRM 17 8))
0042.00 CHGVAR VAR(&LSTNAM) VALUE(%SST(&RCVPRM 35 10))
0043.00 CHGVAR VAR(&LHANDL) VALUE(%SST(&RCVPRM 45 4))
0044.00
0045.00 /*( オプション機能の実行 )*/
0046.00 /*-------------------------------------------------------------*/
0047.00 /* QUIPUTV : パネル・グループの変数を更新する */
0048.00 /*-------------------------------------------------------------*/
0049.00 RTVDTAARA DTAARA(WINDOWS/CLIENT (401 4)) RTNVAR(&CURLOG)
0050.00 IF COND(&CURLOG *EQ '*ON ') THEN(DO)
0051.00 CHGVAR VAR(&DSPMO) VALUE(' ログ開始中 ')
0052.00 ENDDO
0053.00 ELSE CMD(DO)
0054.00 CHGVAR VAR(&DSPMOD) VALUE(' ログ停止 ')
0055.00 ENDDO
0056.00 CHGVAR VAR(%SST(&DSPMODRCD 1 1)) VALUE(&WHTCLR)
0057.00 CALL PGM(QUIPUTV) PARM(&HANDLE &DSPMODRCD &DTALEN +
0058.00 'DSPMODRCD ' &APIERR)
0059.00 RETURN
0060.00
0061.00 APIERR:
0062.00 CHGVAR VAR(&MSGID) VALUE(%SST(&APIERR 9 7))
0063.00 CHGVAR VAR(&MSGDTA) VALUE(%SST(&APIERR 17 100))
0064.00 CHGVAR VAR(&MSGF) VALUE('QCPFMSG ')
0065.00 CHGVAR VAR(&MSGFLIB) VALUE('QSYS ')
0066.00 GOTO SNDMSG
0067.00
0068.00 ERROR: RCVMSG MSGTYPE(*LAST) RMV(*NO) MSG(&MSG) +
0069.00 MSGDTA(&MSGDTA) MSGID(&MSGID) MSGF(&MSGF) +
0070.00 SNDMSGFLIB(&MSGFLIB)
0071.00 SNDMSG:
0072.00 IF COND(&MSGID *EQ ' ') THEN(DO)
0073.00 SNDPGMMSG MSGID(CPF9897) MSGF(QCPFMSG) MSGDTA(&MSG) +
0074.00 TOMSGQ(*TOPGMQ) MSGTYPE(*ESCAPE)
0075.00 ENDDO
0076.00 ELSE CMD(DO)
0077.00 SNDPGMMSG MSGID(&MSGID) MSGF(&MSGFLIB/&MSGF) +
0078.00 MSGDTA(&MSGDTA) TOMSGQ(*TOPGMQ) +
0079.00 MSGTYPE(*ESCAPE)
0080.00 ENDDO
0081.00 ENDPGM
[メニューを表示するCLP: WINDOWS ]
ソースはこちらから
0001.00 PGM PARM(&MENU &MNULIB &RTNCOD)
0002.00 /*-------------------------------------------------------------------*/
0003.00 /* WINDOWS : THE WINDOWS ライター・メニュー */
0004.00 /* */
0005.00 /* 2021/05/06 作成 */
0006.00 /*-------------------------------------------------------------------*/
0007.00 DCL VAR(&PNLGRP) TYPE(*CHAR) LEN(10)
0008.00 DCL VAR(&PNLPNLLIB) TYPE(*CHAR) LEN(10)
0009.00 DCL VAR(&PNLGRPLIB) TYPE(*CHAR) LEN(20) +
0010.00 VALUE('WINDOWS WINDOWS ')
0011.00 DCL VAR(&MENU) TYPE(*CHAR) LEN(10)
0012.00 DCL VAR(&MNULIB) TYPE(*CHAR) LEN(10)
0013.00 DCL VAR(&RTNCOD) TYPE(*CHAR) LEN(2) /* +
0014.00 戻りコード */
0015.00 DCL VAR(&MSG) TYPE(*CHAR) LEN(132)
0016.00 DCL VAR(&MSGID) TYPE(*CHAR) LEN(7)
0017.00 DCL VAR(&MSGF) TYPE(*CHAR) LEN(10)
0018.00 DCL VAR(&MSGFLIB) TYPE(*CHAR) LEN(10)
0019.00 DCL VAR(&MSGDTA) TYPE(*CHAR) LEN(132)
0020.00 /*( パネル・グループ表示のための変数 )*/
0021.00 DCL VAR(&HANDLE) TYPE(*CHAR) LEN(8) /* +
0022.00 摘要業務ハンドル */
0023.00 DCL VAR(&HNDCHR) TYPE(*CHAR) LEN(24)
0024.00 DCL VAR(&FNCTON) TYPE(*CHAR) LEN(4) +
0025.00 VALUE(X'00000000') /* 2 進数 */
0026.00 DCL VAR(&PANEL) TYPE(*CHAR) LEN(10) +
0027.00 VALUE('DSPMNU ')
0028.00 DCL VAR(&AGAIN) TYPE(*CHAR) LEN(1) VALUE(Y)
0029.00 DCL VAR(&USRTSK) TYPE(*CHAR) LEN(1) VALUE(N)
0030.00 DCL VAR(&STACK) TYPE(*CHAR) LEN(4) +
0031.00 VALUE(X'00000001') /* 2 進数 */
0032.00 DCL VAR(&UIMMSG) TYPE(*CHAR) LEN(10) VALUE(*CALLER)
0033.00 DCL VAR(&MSGKEY) TYPE(*CHAR) LEN(4)
0034.00 DCL VAR(&CSROPT) TYPE(*CHAR) LEN(1) VALUE(D)
0035.00 DCL VAR(&LASLST) TYPE(*CHAR) LEN(4) VALUE(NONE)
0036.00 DCL VAR(&ERRLST) TYPE(*CHAR) LEN(4)
0037.00 DCL VAR(&WAITTIME) TYPE(*CHAR) LEN(4) +
0038.00 VALUE(X'FFFFFFFF') /* 2 進数 */
0039.00 DCL VAR(&CF03) TYPE(*CHAR) LEN(4) +
0040.00 VALUE(X'FFFFFFFC') /* 2 進数 */
0041.00 DCL VAR(&CF05) TYPE(*CHAR) LEN(4) +
0042.00 VALUE(X'00000005') /* 2 進数 */
0043.00 DCL VAR(&CF06) TYPE(*CHAR) LEN(4) +
0044.00 VALUE(X'00000006') /* 2 進数 */
0045.00 DCL VAR(&CF10) TYPE(*CHAR) LEN(4) +
0046.00 VALUE(X'0000000A') /* 2 進数 */
0047.00 DCL VAR(&CF12) TYPE(*CHAR) LEN(4) +
0048.00 VALUE(X'FFFFFFF8') /* 2 進数 */
0049.00 DCL VAR(&CF13) TYPE(*CHAR) LEN(4) +
0050.00 VALUE(X'0000000D') /* 2 進数 */
0051.00 DCL VAR(&CF14) TYPE(*CHAR) LEN(4) +
0052.00 VALUE(X'0000000E') /* 2 進数 */
0053.00 DCL VAR(&CF15) TYPE(*CHAR) LEN(4) +
0054.00 VALUE(X'0000000F') /* 2 進数 */
0055.00 DCL VAR(&CF17) TYPE(*CHAR) LEN(4) +
0056.00 VALUE(X'00000011') /* 2 進数 */
0057.00 DCL VAR(&CF18) TYPE(*CHAR) LEN(4) +
0058.00 VALUE(X'00000012') /* 2 進数 */
0059.00 DCL VAR(&VARDTA) TYPE(*CHAR) LEN(1024)
0060.00 DCL VAR(&VARRCD) TYPE(*CHAR) LEN(10)
0061.00 DCL VAR(&SQLRCD) TYPE(*CHAR) LEN(10)
0062.00 DCL VAR(&CSRVAR) TYPE(*CHAR) LEN(10) +
0063.00 VALUE('OPT ')
0064.00 DCL VAR(&CSRPOS) TYPE(*CHAR) LEN(2) VALUE(X'0001')
0065.00 DCL VAR(&CSRLST) TYPE(*CHAR) LEN(10) +
0066.00 VALUE('SFL ')
0067.00 DCL VAR(&CSRNAME) TYPE(*CHAR) LEN(10) +
0068.00 VALUE(' ')
0069.00 DCL VAR(&AREA) TYPE(*CHAR) LEN(4) +
0070.00 VALUE(X'FFFFFFFF') /* 2 進数 */
0071.00 DCL VAR(&EXITPG) TYPE(*CHAR) LEN(4) +
0072.00 VALUE(X'00000000') /* 2 進数 */
0073.00 DCL VAR(&OPT) TYPE(*CHAR) LEN(2) VALUE(X'0000')
0074.00 DCL VAR(&DEC08) TYPE(*DEC) LEN(8 0)
0075.00 DCL VAR(&PANELNAM) TYPE(*CHAR) LEN(10)
0076.00 DCL VAR(&NXTPNL) TYPE(*CHAR) LEN(10)
0077.00 DCL VAR(&BEFPNL) TYPE(*CHAR) LEN(10) VALUE('*NONE')
0078.00 DCL VAR(&B_EXTPGM) TYPE(*LGL) LEN(1) VALUE('0') +
0079.00 /* *PNLGRP */
0080.00 DCL VAR(&PGMINFO) TYPE(*CHAR) LEN(48)
0081.00 DCL VAR(&PGMBUFF) TYPE(*CHAR) LEN(48)
0082.00 DCL VAR(&USRDFN) TYPE(*CHAR) LEN(10)
0083.00 DCL VAR(&DTALEN) TYPE(*CHAR) LEN(4) +
0084.00 VALUE(X'00000014') /* 2 進数 */
0085.00 DCL VAR(&UPDWINMOD) TYPE(*CHAR) LEN(20) +
0086.00 VALUE('UPDWINMOD WINDOWS ')
0087.00 DCL VAR(&APIERR) TYPE(*CHAR) LEN(116) +
0088.00 VALUE(X'000074') /* 2 進数 */
0089.00 DCL VAR(&NULL4) TYPE(*CHAR) LEN(4) +
0090.00 VALUE(X'00000000')
0091.00 DCL VAR(&SNDPRM) TYPE(*CHAR) LEN(70)
0092.00 MONMSG MSGID(CPF0000) EXEC(GOTO CMDLBL(ERROR))
0093.00
0094.00 /*( QUIOPNDA : パネル・グループのオープン )*/
0095.00 OPNPNL: CALL PGM(QUIOPNDA) PARM(&HANDLE &PNLGRPLIB &AREA +
0096.00 &EXITPG 'N' &APIERR)
0097.00 IF COND(%SST(&APIERR 5 4) *NE &NULL4) THEN(DO)
0098.00 SNDPGMMSG MSG('WINDOWS(1)API: +
0099.00 QUIOPNDA の実行で次のエラーが発生しました。 +
0100.00 ') MSGTYPE(*DIAG)
0101.00 GOTO APIERR
0102.00 ENDDO
0103.00
0104.00 /*( USREXITPGM を指定 )*/
0105.00 CALL PGM(QUIPUTV) PARM(&HANDLE &UPDWINMOD &DTALEN +
0106.00 'UPDMODRCD ' &APIERR)
0107.00 /*( 最初の DSPMOD を更新 )*/
0108.00 CHGVAR VAR(%SST(&SNDPRM 17 8)) VALUE(&HANDLE)
0109.00 CALL PGM(WINDOWS/UPDWINMOD) PARM(&SNDPRM)
0110.00 /*-------------------------------------*/
0111.00 /* QUIDSPP: パネルの表示 */
0112.00 /*-------------------------------------*/
0113.00 DSPLY: CALL PGM(QUIDSPP) PARM(&HANDLE &FNCTON &PANEL +
0114.00 &AGAIN &APIERR &USRTSK &STACK &UIMMSG +
0115.00 &MSGKEY &CSROPT &LASLST &ERRLST &WAITTIME)
0116.00 IF COND(%SST(&APIERR 5 4) *NE &NULL4) THEN(DO)
0117.00 CHGVAR VAR(&MSGID) VALUE(%SST(&APIERR 9 7))
0118.00 IF COND(&MSGID *EQ 'CPF6A13') THEN(DO)
0119.00 RETURN
0120.00 ENDDO
0121.00 ENDDO
0122.00 /*----------------------*/
0123.00 /* 機能キー */
0124.00 /*----------------------*/
0125.00 /*( CF03 )= 終了 */
0126.00 CF03: IF COND(&FNCTON *EQ &CF03) THEN(DO)
0127.00 CHGVAR VAR(&RTNCOD) VALUE(X'FFFF') /* 終了要求 */
0128.00 GOTO CLOSE
0129.00 ENDDO
0130.00 /*( CF12 )= 取消し */
0131.00 CF12: IF COND(&FNCTON *EQ &CF12) THEN(DO)
0132.00 CHGVAR VAR(&RTNCOD) VALUE(X'FFFF') /* 終了要求 */
0133.00 GOTO CLOSE
0134.00 ENDDO
0135.00
0136.00 /*( 適用業務のクローズ )*/
0137.00 CLOSE:
0138.00 CALL PGM(QUICLOA) PARM(&HANDLE 'M' &APIERR)
0139.00 RETURN
0140.00
0141.00 APIERR:
0142.00 CHGVAR VAR(&MSGID) VALUE(%SST(&APIERR 9 7))
0143.00 CHGVAR VAR(&MSGDTA) VALUE(%SST(&APIERR 17 100))
0144.00 CHGVAR VAR(&MSGF) VALUE('QCPFMSG ')
0145.00 CHGVAR VAR(&MSGFLIB) VALUE('QSYS ')
0146.00 GOTO SNDMSG
0147.00
0148.00 ERROR: RCVMSG MSGTYPE(*LAST) RMV(*NO) MSG(&MSG) +
0149.00 MSGDTA(&MSGDTA) MSGID(&MSGID) MSGF(&MSGF) +
0150.00 MSGFLIB(&MSGFLIB)
0151.00 SNDMSG: IF COND(&MSGID *EQ ' ') THEN(DO)
0152.00 SNDPGMMSG MSGID(CPF9897) MSGF(QCPFMSG) MSGDTA(&MSG) +
0153.00 MSGTYPE(*ESCAPE)
0154.00 ENDDO
0155.00 ELSE CMD(DO)
0156.00 SNDPGMMSG MSGID(&MSGID) MSGF(&MSGFLIB/&MSGF) +
0157.00 MSGDTA(&MSGDTA) TOMSGQ(*TOPGMQ) +
0158.00 MSGTYPE(*ESCAPE)
0159.00 ENDDO
0160.00 ENDPGM
[コンパイル]
CRTCLPGM OBJLIB/WINDOWS SRCFILE(MYSRCLIB/QCLSRC) AUT(*ALL)
[メニューの作成]
CRTMNU MENU(WINDOWS/WINDOWS) TYPE(*PGM) PGM(OBJLIB/WINDOWS) AUT(*ALL)
[解説]
上記はパネル・グループを単にオープンして表示するだけのプログラムであり
これで十分である。
0107.00 /*( 最初の DSPMOD を更新 )*/ 0108.00 CHGVAR VAR(%SST(&SNDPRM 17 8)) VALUE(&HANDLE) 0109.00 CALL PGM(WINDOWS/UPDWINMOD) PARM(&SNDPRM)
でメニュー画面の変数を最初に更新している。
CLPではCF03とCF12キーに対する記述しかしていないが他の機能キーの処理は
パネル・グループ内に記述されているしオプション選択の処理も
パネル・グループ内に記述されているのでここでは記述していなくても
メニューとして動作する。
これがパネル・グループを作成する利点でもある。
この方法でいったんパネル・グループとして作成してそれを*PGMタイプのメニューとして
CRTMNU で作成する方法であればどのような機能でもパネル・グループに組み込むことができ
CRTMNUでパネル・グループのソースを作成するときの文法エラーが発生することはない。
この方法であればパネル・グループによるメニューの機能を大幅に拡張することができる。
もちろんこのテクニックはIBMマニュアルのどこにも掲載されていない。
AS400-NET.COMだけのテクニックである。
目からウロコが落ちましたか?
