如何使用COBOL Screen Section实现支持F3/F4按键的可滚动列表
COBOL Screen Section 可滚动列表+自定义按键实现方案
一、前期改造准备
先在现有代码的WORKING-STORAGE SECTION中新增必要变量:
- 列表基础参数定义
77 PAGE-SIZE PIC 9(2) VALUE 10. *> 单页展示10条记录,可自行调整 77 CURRENT-PAGE PIC 9(4) VALUE 1. *> 当前页码 77 LIST-OFFSET PIC 9(4) VALUE 1. *> 列表当前偏移量 77 TOTAL-LOAN-CNT PIC 9(4) VALUE 0. *> 当前用户总借阅记录数 77 KEY-PRESSED PIC X(2) VALUE SPACE. *> 捕获按键输入 * 功能键值可根据你使用的COBOL编译器调整,以下为GnuCOBOL环境参考值 01 FUNCTION-KEYS. 05 KEY-F3 PIC X(2) VALUE "3". 05 KEY-F4 PIC X(2) VALUE "4". 05 KEY-ENTER PIC X(2) VALUE "0".
- 借阅记录缓存表:提前把用户所有借阅记录读入内存,避免反复读取文件影响性能
01 LOAN-CACHE-TABLE. 05 LOAN-CACHE-ENTRY OCCURS 100 TIMES INDEXED BY CACHE-IDX. *> 最多支持100条借阅记录,可自行调整 10 CACHE-LOAN-ID PIC 9(5). 10 CACHE-LOAN-BOOK PIC 9(5). 10 CACHE-BOOK-TITLE PIC X(50). 10 CACHE-BOOK-AUTHOR PIC X(30). * 屏幕展示变量,和单页条数对应 01 DISP-VARIABLES. 05 DISP-LOAN-ID PIC 9(5) OCCURS 10 TIMES INDEXED BY ROW-IDX. 05 DISP-BOOK-ID PIC 9(5) OCCURS 10 TIMES. 05 DISP-BOOK-TITLE PIC X(40) OCCURS 10 TIMES.
二、Screen Section 滚动列表定义
在DATA DIVISION下新增SCREEN SECTION定义列表页面:
SCREEN SECTION. 01 LOAN-LIST-SCREEN. 05 LINE 1 COL 1 VALUE "用户借阅列表:" FOREGROUND-COLOR 11. 05 LINE 2 COL 1 VALUE "借阅ID" COL 10 VALUE "图书ID" COL 20 VALUE "书名" COL 60 VALUE "作者" UNDERLINE. * 循环生成10行列表内容,对应LINE3到LINE12 05 LIST-ROW OCCURS 10 TIMES INDEXED BY SCREEN-ROW. 10 LINE 3 + SCREEN-ROW COL 1 PIC Z(5) FROM DISP-LOAN-ID(SCREEN-ROW + 1). 10 LINE 3 + SCREEN-ROW COL 10 PIC Z(5) FROM DISP-BOOK-ID(SCREEN-ROW + 1). 10 LINE 3 + SCREEN-ROW COL 20 PIC X(40) FROM DISP-BOOK-TITLE(SCREEN-ROW + 1). 05 LINE 14 COL 1 VALUE "操作提示:F3上一页 F4下一页 ENTER选择要归还的图书" FOREGROUND-COLOR 10. 05 LINE 15 COL 1 PIC X(2) TO KEY-PRESSED CONTROL KEY. *> 开启功能键捕获
三、滚动+自定义按键逻辑实现
1. 原有读取逻辑适配
修改原来的READ-LOAN-DATA段落,读完借阅记录后不要直接输出,写入缓存表并统计总条数:
READ-LOAN-DATA. MOVE "Y" TO LOAN-FOUND MOVE 0 TO TOTAL-LOAN-CNT START LOAN-FILE KEY = LOAN-CUSTOMER INVALID KEY DISPLAY "No lent books." MOVE "N" TO LOAN-FOUND MOVE "Y" TO LOAN-FILE-AT-END END-START. PERFORM READ-NEXT-LOAN-DATA UNTIL LOAN-FILE-AT-END = "Y". READ-NEXT-LOAN-DATA. IF LOAN-CUSTOMER = CUSTOMER-ID READ LOAN-FILE NEXT RECORD AT END MOVE "Y" TO LOAN-FILE-AT-END NOT AT END * 写入缓存表 ADD 1 TO TOTAL-LOAN-CNT SET CACHE-IDX TO TOTAL-LOAN-CNT MOVE LOAN-ID TO CACHE-LOAN-ID(CACHE-IDX) MOVE LOAN-BOOK TO CACHE-LOAN-BOOK(CACHE-IDX) * 调用BOOKBYID补全书名作者 CALL "BOOKBYID" USING LOAN-BOOK MOVE BOOK-TITLE TO CACHE-BOOK-TITLE(CACHE-IDX) MOVE BOOK-AUTHOR TO CACHE-BOOK-AUTHOR(CACHE-IDX) ELSE MOVE "Y" TO LOAN-FILE-AT-END.
2. 滚动交互逻辑实现
新增列表展示交互段落,替换原来的DISPLAY-LOAN-DATA:
DISPLAY-LOAN-LIST. PERFORM UNTIL KEY-PRESSED = KEY-ENTER * 计算当前页起始偏移量 COMPUTE LIST-OFFSET = (CURRENT-PAGE - 1) * PAGE-SIZE + 1 * 给展示变量赋值 PERFORM VARYING ROW-IDX FROM 1 BY 1 UNTIL ROW-IDX > PAGE-SIZE COMPUTE CACHE-IDX = LIST-OFFSET + ROW-IDX - 1 IF CACHE-IDX <= TOTAL-LOAN-CNT MOVE CACHE-LOAN-ID(CACHE-IDX) TO DISP-LOAN-ID(ROW-IDX) MOVE CACHE-LOAN-BOOK(CACHE-IDX) TO DISP-BOOK-ID(ROW-IDX) MOVE CACHE-BOOK-TITLE(CACHE-IDX) TO DISP-BOOK-TITLE(ROW-IDX) ELSE * 超出总记录数的行填空 MOVE SPACES TO DISP-LOAN-ID(ROW-IDX) MOVE SPACES TO DISP-BOOK-ID(ROW-IDX) MOVE SPACES TO DISP-BOOK-TITLE(ROW-IDX) END-IF END-PERFORM * 清屏展示列表 DISPLAY BLANK SCREEN DISPLAY LOAN-LIST-SCREEN ACCEPT LOAN-LIST-SCREEN * 处理按键 EVALUATE KEY-PRESSED WHEN KEY-F3 * 上一页:页码不能小于1 IF CURRENT-PAGE > 1 COMPUTE CURRENT-PAGE = CURRENT-PAGE - 1 END-IF WHEN KEY-F4 * 下一页:不能超出总页数 COMPUTE LIST-OFFSET = CURRENT-PAGE * PAGE-SIZE + 1 IF LIST-OFFSET <= TOTAL-LOAN-CNT COMPUTE CURRENT-PAGE = CURRENT-PAGE + 1 END-IF WHEN OTHER CONTINUE END-EVALUATE END-PERFORM. * 选中后把要归还的图书ID传给LOANDEL COMPUTE CACHE-IDX = LIST-OFFSET + ROW-IDX -1 MOVE CACHE-LOAN-BOOK(CACHE-IDX) TO THE-BOOK-TO-RETURN-ID.
四、注意事项
- 不同COBOL编译器的功能键值存在差异,比如Micro Focus COBOL的F3键值为
PF3,如果按键不生效,可以临时加一行DISPLAY KEY-PRESSED打印键值,替换成自己环境对应的取值即可。 - 现有
LOANDEL、BOOKBYID等子程序无需修改,可直接复用。
内容的提问来源于stack exchange,提问作者eisem
相关产品推荐
相关产品推荐

