MEMBRE . . . . . . . . . RTVSCRSRV SEQNBR*...+... 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+... 6 ...+... 7 ...+... 8 ...+... 9 ...+... 0 100 *--------------------------------------------------------------------------------------------* 200 * Programme de SERVICE RTVSCRSRV = Récup du buffer de l'écran encours * 300 * Utilisation de Dynamic Screen Manager APIs * 400 * Appelé par PGM RTVSCR * 500 *--------------------------------------------------------------------------------------------* 600 * Compilation CrtRPGMod Module(YourLib/RTVSCRSRV) * 700 * SrcFile(YourLib/QRPGLESRC) * 800 * CrtSrvPgm SrvPgm(YourLib/RTVSCRSRV) * 900 * Export(*All) * 1000 *--------------------------------------------------------------------------------------------* 1100 H NoMain 1200 H BndDir( 'QSNAPI' ) 1300 1400 * - RtvScreen - Capture Screen 1500 D RtvScreen PR 1N 1600 D 1 1700 D 2 1800 D 2 1900 D 3565 2000 D 272 Options( *NoPass ) 2100 2200 * - CrtInputBuffer - API to create screen input buffer 2300 D CrtInputBuffer PR 10I 0 ExtProc( 'QsnCrtInpBuf' ) 2400 D 2500 D 10I 0 2600 D 10I 0 Options( *Omit ) 2700 D 10I 0 Options( *Omit ) 2800 D 10I 0 Options( *Omit ) 2900 D 272 Options( *Omit ) 3000 3100 * - ReadScreen - API to read screen image - 3200 3300 D ReadScreen PR 10I 0 ExtProc( 'QsnReadScr' ) 3400 D 10I 0 Options( *Omit ) 3500 D 10I 0 Options( *Omit ) 3600 D 10I 0 Options( *Omit ) 3700 D 10I 0 Options( *Omit ) 3800 D 272 Options( *Omit ) 3900 4000 * - RtvBufferPtr - API to retrieve pointer to input buffer data 4100 4200 D RtvBufferPtr PR * ExtProc( 'QsnRtvDta' ) 4300 D 10I 0 4400 D * Options( *Omit ) 4500 D 272 Options( *Omit ) 4600 4700 * Procédure RtvScreen 4800 * Description... Capture et Récup du buffer écran 4900 5000 P RtvScreen B Export 5100 5200 D RtvScreen PI 1N 5300 D TypeEcran 1 1= 80*24 2= 132*27 5400 D LigDebA 2 Ligne Début 5500 D LigFinA 2 Ligne Fin 5600 D BufferEcran 3565 Buffer Ecran 5700 D APIError 272 Options( *NoPass ) Api Erreur 5800 5900 * - Data definitions - 6000 6100 D BufferHdl S 10I 0 6200 * 80*24 = 1920 132*27 = 3564 6300 D BufferSize S 10I 0 Inz( 0 ) 6400 D BufferIncr S 10I 0 Inz( 0 ) 6500 D NbrBytesRead S 10I 0 6600 D BufferPtr S * INZ 6700 D BufferDtaFld S 3565 Based( BufferPtr ) 6800 D BufferDta S 3565 6900 D BufferPos S 10I 0 Inz( 1 ) 7000 D PosDeb S 10I 0 Inz( 0 ) 7100 D LngFin S 10I 0 Inz( 0 ) 7200 7300 D NoAPIError C Const( *Zero ) 7400 D APIErrorPassed S 1N 7500 D Status S 1N 7600 D Buffer80 S 80 Inz(*Blanks) 7700 D Buffer132 S 132 Inz(*Blanks) 7800 D NbrBytesParm S 10I 0 Inz(0) 7900 D LigDeb S 2 0 Ligne Début 8000 D LigFin S 2 0 Ligne Fin 8100 8200 D APIErrorDS DS 8300 D BytesProvided 10I 0 Inz( %Size( APIErrorDS ) ) 8400 D BytesAvail 10I 0 Inz( *Zero ) 8500 D MsgID 7 Inz( *Blanks ) 8600 D Reserved 1 Inz( X'00' ) 8700 D MsgDta 256 Inz( *Blanks ) 8800 8900 * - Determine si le param API error à été transmis 9000 9100 C If %Parms 4 9200 C Eval APIErrorPassed = *On 9300 C EndIf 9400 *--------------------------------------------------------------------- 9500 C If TypeEcran = '1' 9600 * Ecran 80*24 9700 C Eval BufferSize = 1920 9800 C Eval BufferIncr = 1920 9900 C Else 10000 * Ecran 132*27 10100 C Eval BufferSize = 3564 10200 C Eval BufferIncr = 3564 10300 C End 10400 *--------------------------------------------------------------------- 10500 * - Create input buffer - 10600 * ------------------------------------------------------------------- 10700 10800 C Reset APIErrorDS 10900 11000 C Eval BufferHdl = CrtInputBuffer( 11100 C BufferSize : 11200 C BufferIncr : 11300 C *Omit : 11400 C *Omit : 11500 C APIErrorDS 11600 C ) 11700 C If BytesAvail < NoAPIError 11800 C ExSr ReturnError 11900 C EndIf 12000 12100 * ------------------------------------------------------------------- 12200 * - Read screen image - 12300 * ------------------------------------------------------------------- 12400 12500 C Reset APIErrorDS 12600 12700 C Eval NbrBytesRead = ReadScreen( 12800 C *Omit : 12900 C BufferHdl : 13000 C *Omit : 13100 C *Omit : 13200 C APIErrorDS 13300 C ) 13400 13500 C If BytesAvail < NoAPIError 13600 C ExSr ReturnError 13700 C EndIf 13800 13900 * - Retrieve pointer to buffer data - 14000 14100 C Reset APIErrorDS 14200 14300 C Eval BufferPtr = RtvBufferPtr( 14400 C BufferHdl : 14500 C *Omit : 14600 C APIErrorDS 14700 C ) 14800 14900 C If BytesAvail < NoAPIError 15000 C ExSr ReturnError 15100 C EndIf 15200 15300 * Retrieve input buffer data - 15400 15500 C Eval BufferDta = BufferDtaFld 15600 C Eval BufferEcran = *Blanks 15700 C ExSr CalculPos 15800 C Eval BufferEcran = %Subst(BufferDta:PosDeb:LngFin) 15900 *----------------------------------------------------------------------------- 16000 16100 * Return normal completion status to caller - 16200 16300 C ExSr ReturnNormal 16400 16500 * - Subroutine.... ReturnNormal - 16600 * - Description... Return normal completion status to caller - 16700 16800 C ReturnNormal BegSr 16900 C Eval Status = *Off 17000 C ExSr ReturnStatus 17100 C EndSr 17200 17300 * - Subroutine.... ReturnError - 17400 * - Description... Return error condition status to caller - 17500 17600 C ReturnError BegSr 17700 C Eval Status = *On 17800 C ExSr ReturnStatus 17900 C EndSr 18000 18100 * - Subroutine.... ReturnStatus - 18200 * - Description... Return completion status to caller - 18300 18400 C ReturnStatus BegSr 18500 C If APIErrorPassed 18600 C Eval APIError = APIErrorDS 18700 C EndIf 18800 C Return Status 18900 C EndSr 19000 19100 C CalculPos BegSr 19200 C Move LigDebA LigDeb 19300 C Move LigFinA LigFin 19400 C Eval PosDeb=0 1ère Pos Extract Buf 19500 C Eval LngFin=0 Long Pos Extract Buf 19600 C If TypeEcran = '1' 19700 C If LigDeb 0 And LigDeb < 25 19800 C Eval PosDeb = (LigDeb * 80) - 79 19900 C Endif 20000 C If LigFin 0 And LigFin < 25 20100 C Eval LngFin = ((LigFin * 80) - PosDeb) + 1 20200 C Endif 20300 20400 C Else 20500 * TypeEcran = '2' 20600 C If LigDeb 0 And LigFin < 28 20700 C Eval PosDeb = (LigDeb * 132) - 131 20800 C Endif 20900 C If LigFin 0 And LigFin < 28 21000 C Eval LngFin = ((LigFin * 132) - PosDeb) + 1 21100 C Endif 21200 C Endif 21300 21400 C If PosDeb <= 0 Or LngFin <= 0 21500 C Eval PosDeb = 1 21600 C EndIf 21700 C If LngFin = 0 21800 C If TypeEcran = '1' 21900 C Eval LngFin = 80 * 24 22000 C Else 22100 C Eval LngFin = 132 * 27 22200 C EndIf 22300 C EndIf 22400 C EndSr 22500 22600 22700 P RtvScreen E * * * * F I N D U S O U R C E * * * *