我有一个程序可以显示与此类似的 4 个子文件:
COL1 COL2 COL3
SFLAA----------------------------|
1 9999 9999 9999
2 9999 9999 9999
3 9999 9999 9999
*More...
SFLBB----------------------------|
1 9999 9999 9999
2 9999 9999 9999
3 9999 9999 9999
*More...
SFLCC----------------------------|
1 9999 9999 9999
2 9999 9999 9999
3 9999 9999 9999
*More...
SFLDD----------------------------|
1 9999 9999 9999
2 9999 9999 9999
3 9999 9999 9999
*More...
这些子文件显示各种类型的摘要信息,用户希望能够单击任何这些摘要数字并“向下钻取”到底层详细信息。为了做到这一点,我必须知道他们点击了哪个子文件中的哪条记录。
我正在从中检索光标位置,INFDS
因此当用户单击屏幕时,我知道他们正在单击哪个子文件(因为我知道他们单击了哪一行)。
SFLCSRRRN
关键字非常适合子文件,SFLAA
因为它是“活动”子文件(程序执行EXFMT CTLAA
,所有其他控制格式都通过 显示WRITE
)。到目前为止,我还无法弄清楚如何确定子文件的哪条记录已被点击,如果它是SFLBB
,SFLCC
或SFLDD
.
每个子文件最多可容纳约 100 条记录(一次全部加载),因此用户有可能(并且很可能)在单击子文件之前滚动了它们。
如果用户单击“非活动”子文件之一,我如何确定用户单击了哪个子文件记录?
---- 开始编辑 ----
我可以很好地获取用户在屏幕上单击的行/列,我的问题是当用户向下滚动 SFLBB、SFLCC 或 SFLDD 以说出第 75 个子文件记录然后他们单击该子文件时。我可以说他们点击了屏幕上的第 8 行(这将是 SFLBB 的第一行)——但我不能说这是 SFLBB 中的第 75 行记录。
----结束编辑----
我已经尝试过SFLCSRRRN
,SFLRCDNBR
和SFLSCROLL
各种组合,但无法为非活动子文件工作。
以下是来自的相关代码DSPF
:
A DSPSIZ(24 80 *DS3)
A MOUBTN(*ULP CF06)
A R SFLAA SFL
A RRN1 4Y 0O 4 11EDTCDE(Z)
A R CTLAA SFLCTL(SFLAA)
A SFLSIZ(9999)
A SFLPAG(0003)
A CF03
A OVERLAY
A SFLCSRRRN(&ARRN)
A 10 SFLDSP
A SFLDSPCTL
A N10 SFLCLR
A 11 SFLEND(*MORE)
A ARRN 5S 0H
A 3 2'SFLAA'
A R SFLBB SFL
A RRN2 4Y 0O 9 11EDTCDE(Z)
A R CTLBB SFLCTL(SFLBB)
A SFLSIZ(9999)
A SFLPAG(0003)
A OVERLAY
A* Doesn't work SFLCSRRRN(&BRRN)
A 15 SFLDSP
A SFLDSPCTL
A N15 SFLCLR
A 16 SFLEND(*MORE)
A* Doesn't work BRRN 5S 0H
A* Doesn't work BRRN2 5S 0H SFLSCROLL
A 8 2'SFLBB'
SFLCC/CTLCC
子文件和控制记录SFLDD/CTLDD
在逻辑上相同,SFLBB/CTLBB
所以我省略了它们。
相关RPGLE代码:
ftestd cf e workstn sfile(sflaa: rrn1)
f sfile(sflbb: rrn2)
f sfile(sflcc: rrn3)
f sfile(sfldd: rrn4)
f infds(cusloc)
...
dcusloc ds
d rowcol 370 371b 0
...
drrn1 s 4 0 inz(0)
drrn2 s 4 0 inz(0)
drrn3 s 4 0 inz(0)
drrn4 s 4 0 inz(0)
...
c/free
...
begsr mouse_sr;
row# = rowcol / 256;
col# = %rem(rowcol: 256);
select;
when row# >= 4 and row# <= 6;
chain arrn sflaa;
if %found();
exsr detail1_sr;
endif;
when row# >= 9 and row# <= 11;
chain brrn sflbb;
if %found();
exsr detail2_sr;
endif;
when row# >= 14 and row# <= 16;
chain crrn sflcc;
if %found();
exsr detail3_sr;
endif;
when row# >= 19 and row# <= 21;
chain drrn sfldd;
if %found();
exsr detail4_sr;
endif;
endsl;
endsr;
...
c/end-free