PANEL-WORKER

6. API を使ってパネル・グループを表示する。

パネル・グループの表示や操作はすべて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のオープン・クローズについてのみ理解して頂きたい。