TESTDSMF --************************************************************************************************** -- FILE TO HOLD COPY OF SCREEN -- -- Revision History: -- 08/11/2021 P.Dow -- Initial version. -- --************************************************************************************************** create or replace table TESTDSMF ( KeyName char(10) not null with default , RowNbr integer not null with default , RowData char(132) not null with default , PRIMARY KEY(KeyName, RowNbr) ) RCDFMT TESTDSMrec; TESTDSMD ******************************************************************** * TEST DYNAMIC SCREEN MANAGEMENT * * Revision History: -* 08/12/2021 P.DOW * Initial version. * A******************************************************************** A DSPSIZ(*DS3 *DS4) A R TESTDSMF1 INVITE A 21 DSPMOD(*DS4) A 1 2'TESTDSM' A 1 27'Test Dynamic Screen Management' A DSPATR(HI) A 1 70DATE A EDTCDE(Y) A 2 70TIME A EDTWRD(' 0: : ') A N21 3 11'Key some data but do NOT press - A ENTER.' A N21 4 11'Capture should happen after 10 - A seconds.' A 21 4 21'Key some data but do NOT press - A ENTER. Capture should happen - A within 10 seconds.' A SOMEDATA1 50A B 6 11CHECK(LC) A *DS4 6 21 A 21 COLOR(RED) A SOMEDATA2 50A B 7 11CHECK(LC) A *DS4 7 21 A 21 COLOR(YLW) A SOMEDATA3 50A B 8 11CHECK(LC) A *DS4 8 21 A 21 COLOR(GRN) A SOMEDATA4 50A B 9 11CHECK(LC) A *DS4 9 21 A 21 COLOR(BLU) A SOMEDATA5 50A B 10 11CHECK(LC) A *DS4 10 21 A 21 COLOR(TRQ) TESTDSM h option(*nodebugio: *srcstmt) h dftactgrp(*no) actgrp(*new) h bnddir('QC2LE') ********************************************************************************************** * TEST DYNAMIC SCREEN MANAGEMENT * * This program displays a screen with several input fields, and allows the user * up to 10 seconds to enter some data. Without the user pressing any AID key, * the data they entered will be read via an API and written to the TESTDSMF file, * and the program will end. * * This program uses excerpts from http://www.redbooks.ibm.com/redpapers/pdfs/redp4321.pdf * * The main points used are: * * The Create Input Buffer API is called to get a buffer handle for the screen. * Only call the remainder of the DSM APIs if a buffer handle was successfully created. * * Read the screen and determine the number of bytes returned; this will be 1920 for a * 24x80 screen or 3564 for a 27x132 screen. This API captures all characters currently * on the screen at the time it was called. * * Get a pointer to the buffer for the screen just read. * ********************************************************************************************** fTESTDSMD cf e workstn fTESTDSMF o e disk * Prototypes d TESTDSM pi *ENTRY parms d peNAME 32a * Dynamic Screen Manager APIs d CreateInputBuffer... d pr 10i 0 ExtProc( 'QsnCrtInpBuf' ) d BufferSize 10i 0 Const d Increment 10i 0 Const Options(*Omit) d MaximumSize 10i 0 Const Options(*Omit) d BufferHandle 10i 0 Options(*Omit) d Error Like(APIError) Options(*OMIT) d ReadScreen pr 10i 0 ExtProc( 'QsnReadScr' ) d BytesRead 10i 0 Options( *Omit ) d BufferHandle 10i 0 Const Options( *Omit ) d CmdBufferhandle... d 10i 0 Const Options( *Omit ) d EnvironmentHandle... d 10i 0 Options( *Omit ) d Error Like(APIError) Options(*OMIT) d RetrieveDataPtr... d pr * ExtProc( 'QsnRtvDta' ) d BufferHandle 10i 0 Const d DataPointer * Options( *Omit ) d Error Like(APIError) Options(*OMIT) d sleep pr 10u 0 extproc('sleep') d seconds 10u 0 value * Data structures D ProgramStatus SDS D NAME 10a Overlay(ProgramStatus:244) D USER 10a Overlay(ProgramStatus:254) D JOBNO 6a Overlay(ProgramStatus:264) // Standard API Error data structure used with most APIs D APIError DS Qualified D BytesProvided 10I 0 inz(%size(APIError)) D BytesAvail 10I 0 inz(0) D MsgId 7A D 1A D MsgData 240A D ScreenIn DS 4000 based(DataPtr) * Standalone variables d i s 10i 0 d j s 10i 0 d NbrCols s 3p 0 d NbrRows s 3p 0 d BufferHandle s 10i 0 d BytesReturned s 10i 0 * Main logic *inLR = *on; *in21 = (%parms > *zero); write TESTDSMF1; sleep(10); BufferHandle = CreateInputBuffer( 27 * 132 : *Omit : *Omit : *Omit : APIError ); If APIError.BytesAvail = *zero; BytesReturned = ReadScreen( *Omit : BufferHandle : *Omit : *Omit : *Omit ); DataPtr = RetrieveDataPtr( BufferHandle : *Omit : *Omit ); If BytesReturned = 1920; NbrCols = 80; NbrRows = 24; Else; NbrCols = 132; NbrRows = 27; Endif; j = 1; for i = 1 to NbrRows; if %parms > *zero; KeyName = peName; else; KeyName = %char( %time() ); endif; RowNbr = i; RowData = %subst(ScreenIn:j:NbrCols); write TESTDSMrec; j += NbrCols; endfor; Endif;