У меня есть программа, которая отображает 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 записей (все загружаются одновременно), поэтому возможно (и вероятно), что пользователь прокручивал подфайлы, прежде чем нажимать на них.
Как определить, какую запись подфайла щелкнул пользователь, если он щелкнул один из "неактивных" подфайлов?
---- НАЧАТЬ РЕДАКТИРОВАНИЕ ----
Я могу получить Row/Col, где пользователь щелкнул по экрану, просто отлично, моя проблема заключается в том, что пользователь прокручивает SFLBB, SFLCC или SFLDD вниз, чтобы сказать 75-ю запись подфайла, а затем они нажимают на этот подфайл. Я могу сказать, что они нажали на строку 8 на экране (это будет первая строка SFLBB), но я не могу сказать, что это запись 75 в SFLBB.
---- КОНЕЦ РЕДАКТИРОВАНИЯ ----
Я пробовал 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