前回はパネル・グループで操作指示を表示する簡単な方法を紹介した。
今回はまさにテクニックといえる裏ワザを紹介する。
こんな方法もあるのだと驚いて頂ければ幸いである。
パネル・グループでメニューを開発していると現在の状況などを
情報表示したい場合がある。
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だけのテクニックである。
目からウロコが落ちましたか?