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

Progress-4GL填字段事件处理疑问:多处理器优先级与事件识别

Progress 4GL 同一部件事件绑定的常见疑问解答

作为常年写Progress 4GL的老司机,这两个问题刚好是日常开发里容易踩的坑,给你详细拆解下:

疑问1:同一F5事件存在两个处理器为何能编译,且执行原有代码而非新增的?

首先说编译通过的原因:Progress 4GL的语法本身允许为同一个部件的同一个事件注册多个事件处理器,编译器不会把这种重复绑定判定为错误,所以自然能顺利编译。

至于为什么只执行原有代码,核心在于事件处理器的执行顺序是严格按照代码定义的先后顺序来的:你的原有绑定语句(通过{&SEARCH-KEYBOARD}宏绑定F5)出现在新增的ON F5语句之前,所以当F5触发时,会先执行早定义的那个处理器。如果原有处理器里写了RETURN NO-APPLY,那后续的处理器就会被直接跳过——这大概率是你新增代码没生效的原因。如果原有处理器没有阻止后续执行,其实两个处理器会按顺序依次执行,你可以在两个处理器里加个MESSAGE语句验证一下。

疑问2:同一部件绑定多个事件时,如何识别触发的具体事件?

当同一个部件绑定了多个不同事件(比如你这里的F5键盘事件和双击鼠标事件),可以用TRIGGER-EVENT系统变量来精准判断当前触发的是哪个事件。举个实际的代码例子:

ON {&SEARCH-KEYBOARD},{&SEARCH-MOUSE} OF particular_fill-in_Field DO:
    CASE TRIGGER-EVENT:
        WHEN "{&SEARCH-KEYBOARD}":U THEN
            MESSAGE "F5快捷键被触发" VIEW-AS ALERT-BOX.
        WHEN "{&SEARCH-MOUSE}":U THEN
            MESSAGE "鼠标双击事件被触发" VIEW-AS ALERT-BOX.
    END CASE.
END.

你提到的官网示例是用SELF来区分不同部件的触发源,而区分同一部件的不同事件,TRIGGER-EVENT就是最直接的工具。如果是鼠标相关的事件,还可以结合MOUSE-EVENT变量做更细的判断,但键盘事件用TRIGGER-EVENT就足够了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 08:18:59