パネル・グループの表示や操作はすべてAPIを使って行われることになる。
API の使用が必須であるため、パネル・グループの使用が普及しなかったのかも知れないが、APIの問題以上に使用するAPIにはパラメータがかなり数多くあるため、どのように設定すればよいのかが最初は理解できない。
そこで、まず最初に前述の例にあげた単一パネルを表示するためのCLPソースを例にして説明することとする。
【 CLPソース】
0001.00 PGM 0002.00 /*---------------------------------------------------------*/ 0003.00 /* BNK001CL : パネル表示 */ 0004.00 /*---------------------------------------------------------*/ 0005.00 DCL VAR(&MSG) TYPE(*CHAR) LEN(80) 0006.00 DCL VAR(&HANDLE) TYPE(*CHAR) LEN(8) /* + 0007.00 摘要業務ハンドル */ 0008.00 DCL VAR(&PNLGRPLIB) TYPE(*CHAR) LEN(20) + 0009.00 VALUE('BNK001 TESTOBJ ') 0010.00 DCL VAR(&AREA) TYPE(*CHAR) LEN(4) /* 2 進数 */ 0011.00 DCL VAR(&DEC08) TYPE(*DEC) LEN(8 0) 0012.00 DCL VAR(&EXITPG) TYPE(*CHAR) LEN(4) + 0013.00 VALUE(X'00000000') /* 2 進数 */ 0014.00 DCL VAR(&FNCTON) TYPE(*CHAR) LEN(4) /* 2 進数 */ 0015.00 DCL VAR(&PANEL) TYPE(*CHAR) LEN(10) + 0016.00 VALUE('DSPHEAD ') 0017.00 DCL VAR(&AGAIN) TYPE(*CHAR) LEN(1) VALUE(Y) 0018.00 DCL VAR(&APIERR) TYPE(*CHAR) LEN(4) + 0019.00 VALUE(X'00000000') /* 2 進数 */ 0020.00 DCL VAR(&USRTSK) TYPE(*CHAR) LEN(1) VALUE(N) 0021.00 DCL VAR(&STACK) TYPE(*CHAR) LEN(4) + 0022.00 VALUE(X'00000000') /* 2 進数 */ 0023.00 DCL VAR(&UIMMSG) TYPE(*CHAR) LEN(10) VALUE(*CALLER) 0024.00 DCL VAR(&MSGKEY) TYPE(*CHAR) LEN(4) 0025.00 DCL VAR(&CSROPT) TYPE(*CHAR) LEN(1) VALUE(D) 0026.00 DCL VAR(&LASLST) TYPE(*CHAR) LEN(4) VALUE(NONE) 0027.00 DCL VAR(&ERRLST) TYPE(*CHAR) LEN(4) 0028.00 DCL VAR(&WAITTIME) TYPE(*CHAR) LEN(4) + 0029.00 VALUE(X'FFFFFFFF') /* 2 進数 */ 0030.00 DCL VAR(&CF03) TYPE(*CHAR) LEN(4) + 0031.00 VALUE(X'00000003') /* 2 進数 */ 0032.00 DCL VAR(&ENTER) TYPE(*CHAR) LEN(4) + 0033.00 VALUE(X'0000001B') /* 2 進数 */ 0034.00 /* MONMSG MSGID(CPF0000) EXEC(GOTO CMDLBL(ERROR)) */ 0035.00 0036.00 /*( QUIOPNDA : パネル・グループのオープン )*/ 0037.00 CHGVAR VAR(&DEC08) VALUE(-1) 0038.00 CHGVAR VAR(%BIN(&AREA)) VALUE(&DEC08) 0039.00 CALL PGM(QUIOPNDA) PARM(&HANDLE &PNLGRPLIB &AREA + 0040.00 &EXITPG 'N' &APIERR) 0041.00 /*( QUIDSPP : パネル表示 )*/ 0042.00 DSPLY: CALL PGM(QUIDSPP) PARM(&HANDLE &FNCTON &PANEL + 0043.00 &AGAIN &APIERR &USRTSK &STACK &UIMMSG + 0044.00 &MSGKEY &CSROPT &LASLST &ERRLST &WAITTIME) 0045.00 MONMSG MSGID(CPF6A95) 0046.00 /*( CF03 )= 終了 */ 0047.00 IF COND(&FNCTON *EQ &CF03) THEN(DO) 0048.00 /*( QUICLOA : パネル・グループのクローズ )*/ 0049.00 CALL PGM(QUICLOA) PARM(&HANDLE 'M' &APIERR) 0050.00 RETURN 0051.00 ENDDO 0052.00 /*( 実行キー )*/ 0053.00 IF COND(&FNCTON *EQ &ENTER) THEN(DO) 0054.00 GOTO CMDLBL(DSPLY) 0055.00 ENDDO 0056.00 0057.00 ERROR: RCVMSG RMV(*NO) MSG(&MSG) 0058.00 SNDPGMMSG MSG(&MSG) MSGTYPE(*DIAG) 0059.00 ENDPGM
【 解説】
PNLGRP を使用するためのAPIはIBMマニュアルの中では「ユーザー・インターフェースAPI」としてまとめて紹介されているが、パラメータの数があまりにも多いために、どのように設定すればよいかを最初は困惑してしまう。
上記の例ではできるだけCLP変数の初期値として示してあるのでよほど特殊なことが必要でない限り、この値をそのまま利用することができる。
パネル・グループAPIの使用で特徴的なことはハンドル(HANDLE)の使用である。
パネル・グループをオープンすると、そのオープンされたパネル・グループのそのときの固有のハンドルがOS/400によって割り振られる。
ハンドルはそのパネル・グループを一意的なものとして識別するために利用される。
パネル・グループだけでなくWindowsの世界においてもハンドルの概念は一般的であるのでご存知の方もいるかも知れない。
ハンドルにどのような値が割り振られるのかは OS/400のみぞ知るということになるが、実行中のJOBでハンドルの値が重なることは決して無い。
これによってハンドルの値さえわかれば別のPGMにハンドルの値を渡してやればそれだけで1つのPNLGRPを複数のいろいろなPGMからアクセスすることができる。
このことがオブジェクト指向を可能にしている。
上記の例では変数値をセットしていないので変数の値がブランクとなる画面が表示される。
変数値をセットする方法については後で解説する。
ここでは単にPNLGRPのオープン・クローズについてのみ理解して頂きたい。