Rexx Pull не работает с clrscrn после отображения панели ispf
В настоящее время я пишу программу Rexx, в которой мне нужно замаскировать ввод пароля. Я использую этот код для отображения панели:
address ispexec"libdef ispplib dataset id('my.pds')
address ispexec 'display panel(member)'
Это прекрасно работает и возвращает пароль переменной, в которой я выполняю различные проверки.
После этого я продолжаю в моей программе Rexx. следующая возникающая функция - ввод данных от пользователя с помощью метода "сказать" "тянуть" в Rexx. Вот где происходит странная ошибка.
Я должен проверить ввод пользователя снова, если он недействителен, он возвращается к "тянуть". Однако после возврата в режим "тянуть" вместо того, чтобы позволить пользователю вводить данные, программа получает нижнюю часть символа данных "***". Это, конечно, вызывает бесконечный цикл, и пользователь не может вставить данные.
Я считаю, что причиной является отображение панели, а затем с помощью clrscrn. Потому что я могу вынуть clrscrn, и он работает нормально, но данные усекаются на других страницах. Или я могу пожертвовать маскировкой пароля пользователя, НЕ отображая панель ispf, и она работает. Но вместе это не удается.
Мне было интересно, что происходит и возможное решение.
Код Rexx, который я использую, чтобы повторить ошибку после отображения панели:
do while chk <> 'N'
clrscrn
do i = 1 to 5
say '-test'
end
pull chk
end
Результат один с пользовательским вводом ''
-test
-test
-test
-test
-test
' ' <---- User inputs space, invalid entry, has to be 'N'
*** <-- for some reason hits bottom of data
Затем он возвращается назад с результатом:
-test
-test
-test
-test
-test
*** <---- automatically hits bottom of data
Повторим, если я уберу clrscrn, низ данных никогда не появится. но ошибка слишком много раз, данные усекаются на другую страницу.
Вставьте clrscrn обратно, не отображайте панель ispf. Код работает без нареканий, низ данных никогда не встречается.
Код панели:
)PANEL
)ATTR
~ TYPE(INPUT) INTENS(NON) Pad(_)
! TYPE(TEXT) COLOR(RED) SKIP(ON)
)BODY WINDOW(80,24)
! CREATE YOUR PIN NUM
!--------------------------------------------
!
! ENTER YOUR PIN:~INP !
! CONFIRM PIN...:~INPT!
!
! MUST BE 4-DIGITS
)END
Еще одна панель, которую я также называю перед похожими ситуациями:
)PANEL
)ATTR
~ TYPE(INPUT) INTENS(NON) Pad(_)
! TYPE(TEXT) COLOR(RED) SKIP(ON)
)BODY
! VERIFY YOUR IDENTITY
!--------------------------------------------
!
! ENTER YOUR PIN: ~Z !
)INIT
&ZEDSMSG = ''
&ZEDLMSG = ''
.ZVARS = '( INP )'
.ATTR(INP) = '&ATTRPIN'
)PROC
&RESP = .RESP
)END
1 ответ
3 звездочки означают, что вы перешли из полноэкранного режима в линейный режим. REXX говорит, что оператор является линейным режимом. Возможно, у вас есть терминал, использующий альтернативный размер экрана (мод 5, 62 х 160 и т. Д.). TSO VTAM заставит *** защищаться от проблем при переключении между основным и альтернативным размером экрана. Используйте следующий сервис ISPF вместо CLRSCRN
адрес ISPEXEC "ДИСПЛЕЙ КОНТРОЛЯ ЛИНИИ СТАРТ (1)"
Это переведет вас в линейный режим и очистит экран. Ваша процедура REXX работает для меня, когда я использую ЛИНИЮ КОНТРОЛЯ. Это также говорит ISPF, что был введен линейный режим, который также может избежать ошибок повреждения экрана при использовании CLRSCRN.