RPG工作站屏幕功能键(F3)捕获异常问题咨询
RPG工作站屏幕功能键捕获问题调试方案
问题现象
按下F3键后程序可正常退出,但后续判断KeyPressed = F3Key无法进入分支;执行dsply KeyPressed时屏幕显示长黄线而非预期的键值。关键代码及屏幕定义如下:
程序代码
dcl-f SF_04D workstn infds(infds1) sfile(SFL1:RRN) ; dcl-c F1Key const(x'01'); dcl-c F3Key const(x'03'); dcl-c F5Key const(x'05'); D infds1 DS D KeyPressed 369 369 ... dsply KeyPressed; // 显示'1' exfmt CtlRecord ; // 按下F3可退出,但后续判断不生效 dsply KeyPressed; // 显示长黄线 If Keypressed = F3Key; // 无法进入此分支 dsply 'F3'; Endif;
屏幕定义
CA03(03 'F3=Exit')
问题原因
- CA键的自动退出特性:
CA03属于命令注意键(Command Attention),按下后系统会立即终止当前exfmt操作并触发程序退出流程,导致exfmt之后的判断代码可能无法正常执行,或INFDS的键值字段已被系统操作覆盖。 - 键值字段类型不匹配:INFDS的369位存储的是十六进制功能键代码,但你定义的
KeyPressed是默认字符型,直接存储十六进制值会变成不可打印字符,导致dsply显示异常;同时字符型与十六进制常量的比较逻辑也会出错。 - 不可打印字符的显示问题:x'03'是不可打印的控制字符,直接
dsply会导致屏幕显示乱码(长黄线)。
解决办法
1. 将CA键改为CF键
修改屏幕定义,把CA03换成CF03(命令功能键),这样按下F3只会传递键值,不会自动触发程序退出,让程序可以执行后续判断逻辑:
CF03(03 'F3=Exit')
2. 修正INFDS键值字段类型
将KeyPressed定义为十六进制类型,确保能正确存储和比较键值:
D infds1 DS D KeyPressed 369 369 hex // 明确指定为十六进制存储
3. 正确调试输出键值
使用%hex()函数转换键值后再显示,避免不可打印字符导致的异常:
dsply %hex(KeyPressed); // 显示十六进制字符串,比如F3会输出'03'
修改后的完整核心代码示例
dcl-f SF_04D workstn infds(infds1) sfile(SFL1:RRN) ; dcl-c F1Key const(x'01'); dcl-c F3Key const(x'03'); dcl-c F5Key const(x'05'); D infds1 DS D KeyPressed 369 369 hex ... dsply %hex(KeyPressed); exfmt CtlRecord ; If Keypressed = F3Key; dsply 'F3 pressed'; // 在这里添加自定义退出逻辑,比如关闭文件、清理资源后返回 return; Endif;
内容的提问来源于stack exchange,提问作者mortimer
相关产品推荐
相关产品推荐

