You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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.

四、注意事项

  1. 不同COBOL编译器的功能键值存在差异,比如Micro Focus COBOL的F3键值为PF3,如果按键不生效,可以临时加一行DISPLAY KEY-PRESSED打印键值,替换成自己环境对应的取值即可。
  2. 现有LOANDEL、BOOKBYID等子程序无需修改,可直接复用。

内容的提问来源于stack exchange,提问作者eisem

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 15:48:04