实际上我并没有要求提供有关实施的详细信息。我知道如何在整个屏幕中使用子文件实现单选列表,但是当我尝试将相同的原理应用于窗口时,事情并没有按预期完成。这是窗口和子文件的DDS:
A R SWCCHK03 SFL
A S0AVAL 1Y 0H SFLCHCCTL
A S0OPTN 10A O
A R SWCCHK04 SFLCTL(SWCCHK03)
A OVERLAY
A SFLDSP
A SFLDSPCTL
A 30 SFLCLR
A 31 SFLEND
A SFLSIZ(0006)
A SFLPAG(0005)
A WINDOW(*DFT 13 32)
A SFLSNGCHC(*RSTCSR *AUTOSLT)
A 1 3'Option'
以下是RPGLE中用于显示和处理所选选项的循环:
C SR300 BEGSR
C *IN12 DOWEQ *OFF
C EXFMT SWCCHK04
C *IN12 IFEQ *OFF
C GOTO SR300E
C ENDIF
C READC SWCCHK03
C S0AVAL IFEQ 4
C ITER
C ENDIF
.
.
.
C ENDDO
C SR300E ENDSR
在某些情况下,我想将S0AVAIL设置为4,以便单个选择列表中的某些选项不可用,如果用户尝试选择此选项,则窗口和单个选择列表将保留在屏幕上光标位于第一个选项上,直到用户选择退出窗口或选择可用选项。
如果用户选择可用选项,则此实现没有问题。但是,如果用户选择了不可用的选项,则窗口将根据需要保留在屏幕上,但光标将移动到窗口的左上角,而不是保留在选择列表中的第一个选项。即使我可以手动将光标移回选项,下次选择不可用选项时,它也会再次转到窗口角落。这怎么发生的?以及如何解决这个问题?
答案 0 :(得分:0)
这段代码是如何编译的?在32列宽窗口中有一个50列子文件字段(S0OPTN)。确保您运行的是您认为应该使用的代码。
当我尝试类似的代码时,我无法选择 S0AVAL = 4的行。你怎么能'选择'一个不可用的选择?如果我使用光标键,光标会跳过不可用的选择。如果我用鼠标点击,我会收到“输入禁止”键盘错误。你使用什么终端模拟器?我正在使用Personal Communications 6.0 for Windows。
工作代码如下:
A*
A R SWCCHK03 SFL
A S0AVAL 1Y 0H SFLCHCCTL
A S0OPTN 10A O 6 11
A*
A R SWCCHK04
A SFLCTL(SWCCHK03)
A OVERLAY
A 27 SFLDSP
A N28 SFLDSPCTL
A 28 SFLCLR
A 29 SFLEND
A SFLSIZ(06)
A SFLPAG(05)
A CF12(12)
A WINDOW(*DFT 13 32)
A SFLSNGCHC(*RSTCSR *AUTOSLT)
A SFLRRN 4S 0H SFLRCDNBR(CURSOR)
A 1 10'Title'
A CHOICE 4S 0 3 1
A 4 5'Choose one'
h/copy qrpglesrc,stdhspec
h* dbgview(*list)
fsotest cf e workstn
f SFILE(SWCCHK03:RRN)
c* clear sfl
c z-add 1 sflrrn
c setoff 272829
c seton 28
c write SWCCHK04
c setoff 28
c* load sfl
c 1 do 9 rrn 4 0
c movel rrn s0optn
c if rrn = 4
c z-add 4 s0aval
c else
c z-add 0 s0aval
c endif
c write SWCCHK03
c seton 27
c enddo
C *IN12 DOWEQ *OFF
C EXFMT SWCCHK04
C *IN12 IFEQ *ON
C LEAVE
C ENDIF
C READC SWCCHK03 80
C n80 do
C movel rrn choice
C z-add 0 S0aval
C update SWCCHK03
C enddo
C ENDDO
c seton lr