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

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')        

问题原因

  1. CA键的自动退出特性:CA03属于命令注意键(Command Attention),按下后系统会立即终止当前exfmt操作并触发程序退出流程,导致exfmt之后的判断代码可能无法正常执行,或INFDS的键值字段已被系统操作覆盖。
  2. 键值字段类型不匹配:INFDS的369位存储的是十六进制功能键代码,但你定义的KeyPressed是默认字符型,直接存储十六进制值会变成不可打印字符,导致dsply显示异常;同时字符型与十六进制常量的比较逻辑也会出错。
  3. 不可打印字符的显示问题: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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 20:45:00