OpenCobolIDE中ACCEPT ... FROM ESCAPE KEY不响应ESC键求助
解决OpenCobolIDE中ACCEPT FROM ESCAPE KEY不响应ESC键的问题
问题根源
你的代码逻辑存在顺序问题:ACCEPT OK LINE 25 POSITION 79会先阻塞程序等待用户输入,此时按下ESC键会被这个普通ACCEPT语句捕获为输入字符,而非触发后续的ACCEPT ESC FROM ESCAPE KEY,导致ESC键无法触发退出逻辑。此外,OpenCobolIDE默认终端配置可能未启用特殊键捕获支持。
代码调整方案
修改逻辑顺序,先检查ESC键状态,再处理菜单输入;同时调整数据定义匹配ESC键的ASCII值:
ID DIVISION. PROGRAM-ID. ALUMAIN. * Menu principal de la aplicación. ALUMAIN.CBL ENVIRONMENT DIVISION. DATA DIVISION. WORKING-STORAGE SECTION. 77 OK PIC X. 77 ESC PIC 9(3). // 调整为3位数字,适配ASCII值27的存储 88 SALIDA VALUE 27. PROCEDURE DIVISION. XXX. PERFORM UNTIL SALIDA OR OK = "S" OR OK = "s" DISPLAY "SISTEMA DE ALUMNOS" LINE 1 POSITION 31 ERASE SCREEN "A ALTAS" LINE 8 POSITION 33 "B BAJAS" LINE 10 POSITION 33 "M MODIFICACIONES" LINE 12 POSITION 33 "C CONSULTAS" LINE 14 POSITION 33 "L LISTADO" LINE 16 POSITION 33 "S SALIR (ESC)" LINE 18 POSITION 33 MOVE 0 TO ESC // 先检查ESC键是否被按下 ACCEPT ESC FROM ESCAPE KEY IF NOT SALIDA THEN ACCEPT OK LINE 25 POSITION 79 // 处理普通ACCEPT捕获ESC的情况(ESC的十六进制为X'1B') IF OK = X'1B' THEN SET SALIDA TO TRUE END-IF END-IF IF OK = "A" OR OK = "a" CALL "ALUALTAS" END-IF IF OK = "B" OR OK = "b" CALL "ALUBAJA" END-IF IF OK = "C" OR OK = "c" CALL "ALUMNOS" END-IF IF OK = "M" OR OK = "m" CALL "ALUMODI" END-IF IF OK = "L" OR OK = "l" CALL "ALUMLIST" END-IF END-PERFORM STOP RUN.
OpenCobolIDE编译设置调整
- 打开OpenCobolIDE,进入项目设置(Project Settings)
- 在编译选项(Compiler Options)中添加参数:
-C term=ansi,启用ANSI终端支持以捕获特殊键 - 保存设置后重新编译程序
补充说明
ACCEPT ... FROM ESCAPE KEY在GnuCOBOL中为非阻塞检查,未检测到ESC键时会直接跳过,因此需放在普通ACCEPT之前- 增加普通ACCEPT中捕获ESC的逻辑作为 fallback,避免终端环境不支持ESCAPE KEY扩展的情况
内容的提问来源于stack exchange,提问作者HombresDios
相关产品推荐
相关产品推荐

