0

目前我正在编写一个 rexx 程序,我需要在其中屏蔽密码输入。我使用此代码来显示我的面板:

address ispexec"libdef ispplib dataset id('my.pds')
address ispexec 'display panel(member)'

这完美地工作,并将密码返回给一个变量,我在其中执行各种检查。

之后我继续我的 rexx 程序。发生的下一个功能是使用 Rexx 的“say”“pull”方法接收用户的输入。这是发生奇怪错误的地方。

我必须再次检查用户输入,如果它无效,它会循环回“拉”。然而,在返回到“拉”而不是允许用户输入数据时,程序得到数据符号“***”的底部。这当然会导致无限循环,然后用户无法输入数据。

我相信原因是显示面板,然后使用 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
4

1 回答 1

0

3 个星号表示您已从全屏模式切换到行模式。REXX say 语句是行模式。您可能有一个使用备用屏幕尺寸(mod5、62 x 160 等)的终端。TSO VTAM 将强制 *** 防止在主屏幕尺寸和备用屏幕尺寸之间发生变化时出现问题。使用以下 ISPF 服务而不是 CLRSCRN

地址 ISPEXEC“控制显示行开始(1)”

这将使您进入线路模式并清除屏幕。当我使用 CONTROL DISPLAY LINE 时,您的 REXX 例程对我有用。这也告诉 ISPF 已进入线路模式,这也可以避免使用 CLRSCRN 的屏幕损坏错误。

于 2017-10-16T09:49:00.960 回答