CL

159. CLPで画面サイズを取得するには

RPGでなくてもCLP上で現在の画面サイズを取得したい場合がある。
動的管理機能APIにはそのような機能のAPIが用意されている。
_

非常に簡単に使うことができる。

[カーソル取得API : TESTDSPSIZ ]

ソースはこちらから

0001.00              PGM                                                             
0002.00 /*---------------------------------------------------------------------*/    
0003.00 /*   TESTDSPSIZ :   画面サイズの取得                                   */    
0004.00 /*                                                                     */    
0005.00 /*   2023/11/27  作成                                                  */    
0006.00 /*   SRCTYPE: CLLE                                                     */    
0007.00 /*   [COMPILE]                                                         */    
0008.00 /*   CRTBNDCL OBJLIB/TESTDSPSIZ SRCFILE(R610SRC/QCLSRC) DFTACTGRP(*NO) */    
0009.00 /*            ACTGRP(*NEW) AUT(*ALL) DBGVIEW(*SOURCE)                  */    
0010.00 /*---------------------------------------------------------------------*/    
0011.00              DCL        VAR(&MSG) TYPE(*CHAR) LEN(132)                       
0012.00              DCL        VAR(&STMMSG) TYPE(*CHAR) LEN(132)                    
0013.00              DCL        VAR(&MSGID) TYPE(*CHAR) LEN(7)                       
0014.00              DCL        VAR(&MSGF) TYPE(*CHAR) LEN(10)                       
0015.00              DCL        VAR(&MSGFLIB) TYPE(*CHAR) LEN(10)                    
0016.00              DCL        VAR(&MSGKEY) TYPE(*CHAR) LEN(4)                      
0017.00              DCL        VAR(&MSGDTA) TYPE(*CHAR) LEN(132)                    
0018.00              DCL        VAR(&ERRDTA) TYPE(*CHAR) LEN(132)                    
0019.00              DCL        VAR(&TYPE) TYPE(*CHAR) LEN(1)                        
0020.00              DCL        VAR(&TOPGMQ) TYPE(*CHAR) LEN(10)                     
0021.00              DCL        VAR(&MSGTYPE) TYPE(*CHAR) LEN(10) +                  
0022.00                           VALUE('*ESCAPE   ')                                
0023.00              DCL        VAR(&APIERR) TYPE(*CHAR) LEN(116) +                  
0024.00                           VALUE(X'0000007400000000') /* 2 進数  */     
0025.00              DCL        VAR(&ERR) TYPE(*CHAR) LEN(1)                   
0026.00              DCL        VAR(&NULL4) TYPE(*CHAR) LEN(4) +               
0027.00                           VALUE(X'00000000')                           
0028.00 /*( DSPSIZ の変数 )*/                                                  
0029.00              DCL        VAR(&WIDTH) TYPE(*CHAR) LEN(4)                 
0030.00              DCL        VAR(&WIDTHC) TYPE(*CHAR) LEN(4)                
0031.00              DCL        VAR(&WIDTHD) TYPE(*DEC) LEN(4 0)               
0032.00              DCL        VAR(&DEPTH) TYPE(*CHAR) LEN(4)                 
0033.00              DCL        VAR(&DEPTHC) TYPE(*CHAR) LEN(4)                
0034.00              DCL        VAR(&DEPTHD) TYPE(*DEC) LEN(4 0)               
0035.00              MONMSG     MSGID(CPF9999) EXEC(GOTO CMDLBL(ERROR))        
0036.00                                                                        
0037.00 /*( 環境の取得 )*/                                                     
0038.00              RTVJOBA    TYPE(&TYPE)                                    
0039.00              IF         COND(&TYPE *EQ '0') THEN(DO) /*  バッチ  */    
0040.00              CHGVAR     VAR(&TOPGMQ) VALUE('*SYSOPR   ')               
0041.00              ENDDO      /*  バッチ  */                                 
0042.00              ELSE       CMD(DO) /*  対話式  */                         
0043.00              CHGVAR     VAR(&TOPGMQ) VALUE('*TOPGMQ   ')               
0044.00              ENDDO      /*  対話式  */                                 
0045.00                                                                        
0046.00           /*---------------------------*/                              
0047.00              CALLSUBR   SUBR(DSPSIZ)                                   
0048.00           /*---------------------------*/                                
0049.00              IF         COND(%SST(&APIERR 5 4) *NE &NULL4) THEN(DO)      
0050.00              GOTO       APIERR                                           
0051.00              ENDDO                                                       
0052.00              CHGVAR     VAR(&DEPTHD) VALUE(%BIN(&DEPTH))                 
0053.00              CHGVAR     VAR(&DEPTHC) VALUE(&DEPTHD)                      
0054.00  NXTDEP:     IF         COND(%SST(&DEPTHC 1 1) = '0') THEN(DO)           
0055.00              CHGVAR     VAR(&DEPTHC) VALUE(%SST(&DEPTHC 2 3) *TCAT ' ')  
0056.00              GOTO       NXTDEP                                           
0057.00              ENDDO                                                       
0058.00              CHGVAR     VAR(&WIDTHD) VALUE(%BIN(&WIDTH))                 
0059.00              CHGVAR     VAR(&WIDTHC) VALUE(&WIDTHD)                      
0060.00  NXTWID:     IF         COND(%SST(&WIDTHC 1 1) = '0') THEN(DO)           
0061.00              CHGVAR     VAR(&WIDTHC) VALUE(%SST(&WIDTHC 2 3) *TCAT ' ')  
0062.00              GOTO       NXTWID                                           
0063.00              ENDDO                                                       
0064.00              CHGVAR     VAR(&MSG) VALUE(' この画面サイズは (' +          
0065.00                           *CAT &DEPTHC *TCAT 'x' *CAT &WIDTHC +          
0066.00                           *TCAT ') です。 ')                             
0067.00              CHGVAR     VAR(&MSGTYPE) VALUE('*DIAG')                     
0068.00              GOTO       SNDMSG                                           
0069.00                                                                          
0070.00  APIERR:                                                                 
0071.00              CHGVAR     VAR(&MSGID) VALUE(%SST(&APIERR 9 7))             
0072.00              CHGVAR     VAR(&MSGDTA) VALUE(%SST(&APIERR 17 100))          
0073.00              CHGVAR     VAR(&MSGF) VALUE('Q' *CAT %SST(&MSGID 1 +         
0074.00                           3) *CAT 'MSG')                                  
0075.00              IF         COND(&MSGF *EQ 'QCPEMSG') THEN(CHGVAR +           
0076.00                           VAR(&MSGF) VALUE('QCPFMSG'))                    
0077.00              CHGVAR     VAR(&MSGFLIB) VALUE('QSYS      ')                 
0078.00              GOTO       SNDMSG                                            
0079.00                                                                           
0080.00  ERROR:      RCVMSG     MSGTYPE(*FIRST) RMV(*NO) KEYVAR(&MSGKEY) +        
0081.00                           MSGDTA(&MSGDTA) MSGID(&MSGID) MSGF(&MSGF) +     
0082.00                           SNDMSGFLIB(&MSGFLIB)                            
0083.00              IF         COND(&MSGID *EQ 'CPF9999') THEN(DO)               
0084.00              CHGVAR     VAR(&ERRDTA) VALUE(&MSGDTA)                       
0085.00              RCVMSG     MSGTYPE(*PRV) MSGKEY(&MSGKEY) RMV(*NO) +          
0086.00                           MSG(&MSG) MSGDTA(&MSGDTA) MSGID(&MSGID) +       
0087.00                           MSGF(&MSGF) MSGFLIB(&MSGFLIB)                   
0088.00              CHGVAR     VAR(&STMMSG) VALUE(' プログラム ' *CAT +          
0089.00                           %SST(&ERRDTA 8 10) *TCAT +                      
0090.00                           ' のステートメント ' *CAT %SST(&ERRDTA +        
0091.00                           24 8) *CAT ' で次のエラーが発生しました。 ')    
0092.00              SNDPGMMSG  MSGID(CPF9897) MSGF(QCPFMSG) MSGDTA(&STMMSG) +    
0093.00                           TOMSGQ(&TOPGMQ) MSGTYPE(*DIAG)                  
0094.00              ENDDO                                                        
0095.00  SNDMSG:     IF         COND(&MSGID *EQ ' ') THEN(DO)                     
0096.00              SNDPGMMSG  MSGID(CPF9897) MSGF(QCPFMSG) MSGDTA(&MSG) +            
0097.00                           TOMSGQ(&TOPGMQ) MSGTYPE(&MSGTYPE)                    
0098.00              MONMSG     MSGID(CPF2400) EXEC(RETURN)                            
0099.00              ENDDO                                                             
0100.00              ELSE       CMD(DO)                                                
0101.00              SNDPGMMSG  MSGID(&MSGID) MSGF(&MSGFLIB/&MSGF) +                   
0102.00                           MSGDTA(&MSGDTA) TOMSGQ(&TOPGMQ) +                    
0103.00                           MSGTYPE(&MSGTYPE)                                    
0104.00              MONMSG     MSGID(CPF2400) EXEC(RETURN)                            
0105.00              ENDDO                                                             
0106.00          /******************************/                                      
0107.00              SUBR       SUBR(DSPSIZ)   /* 現在の表示サイズを取得 */            
0108.00          /******************************/                                      
0109.00              CALLPRC    PRC('QsnRtvScrDim') PARM((&DEPTH) (&WIDTH) +           
0110.00                           (&NULL4) (&APIERR))                                  
0111.00              IF         COND(%SST(&APIERR 5 4) *NE &NULL4) THEN(DO)            
0112.00              SNDPGMMSG  MSG('DSPWINCL API: +                                   
0113.00                           QsnRtvScrDim の実行で次のエラーが発生しました。 +    
0114.00                           ') MSGTYPE(*DIAG)                                    
0115.00              RTNSUBR                                                           
0116.00              ENDDO                                                             
0117.00              ENDSUBR                                                           
0118.00              ENDPGM    


                                                                                    

[解説]

画面サイズを取得しているのはサブ・ルーチン: DSPSIZ の

0109.00              CALLPRC    PRC('QsnRtvScrDim') PARM((&DEPTH) (&WIDTH) +           
0110.00                           (&NULL4) (&APIERR))  

の部分だけである。
IBMのマニュアルには 画面ハンドルの取得と指定が必要であると描かれているが
実際は NULLをこのAPIに渡すと適切なハンドルが祝されるようになっているので
ハンドルの取得と指定は必要ない。

[注意]

このCLPソースはソース・タイプはCLPではなくCLLEとして作成しコンパイルはCRTCLPGM ではなく
CRTBNDCLを使ってコンパイルすること。コンパイル・コマンドはこのソースの最初の注記を参照のこと。

_