能否通过变量动态修改FILL-IN等组件的SCREEN-VALUE属性?
动态引用FILL-IN组件的方案可行性解答
你的方案完全可行,而且适配你当前使用的11.7版本,升级到12.2后也能正常运行,以下是详细说明:
1. 语法正确性验证
Progress 4GL中的VALUE()函数本身就是用于通过字符型名称动态引用对象(包括UI组件)的,你编写的代码逻辑没有问题:
DEFINE INPUT PARAMETER cComponent AS CHARACTER NO-UNDO. DEFINE INPUT PARAMETER cMessage AS CHARACTER NO-UNDO. VALUE(cComponent):SCREEN-VALUE IN FRAME {&FRAME-NAME} = cMessage.
只要cComponent传入的是FILL-IN组件的准确名称(比如"fll-info1"),就能直接给对应组件的SCREEN-VALUE赋值。
2. 关键注意事项
- 组件名称必须完全匹配:虽然Progress默认对标识符大小写不敏感,但建议严格按照组件定义的名称传入,避免因命名规范不一致导致的错误。
- 框架限定不可少:如果你的FILL-IN不在默认框架中,
IN FRAME {&FRAME-NAME}的限定是必须的,否则会出现找不到组件的报错。 - 可扩展到其他属性:这种动态引用方式不仅可以设置
SCREEN-VALUE,还能修改组件的其他属性,比如启用/禁用、显示/隐藏:// 禁用指定组件 VALUE(cComponent):ENABLED IN FRAME {&FRAME-NAME} = FALSE. // 隐藏指定组件 VALUE(cComponent):VISIBLE IN FRAME {&FRAME-NAME} = FALSE.
3. 对比原代码的优势
原有的CASE分支写法在组件数量较多(比如40个FILL-IN)时会非常冗长,维护成本高,新增或删除组件都需要修改分支逻辑。而动态引用的方式只需要一段通用代码,无论组件数量多少都无需修改核心逻辑,只需要传入对应的组件名称即可,代码简洁性和可维护性大幅提升。
4. 版本兼容性说明
- 11.7版本:完全支持
VALUE()函数动态引用UI组件的特性,你的写法可以直接使用。 - 12.2版本:该特性被完整保留,并且Progress 12.x在UI组件的动态操作上有更多细节优化,升级后你的代码依然能正常运行。
内容的提问来源于stack exchange,提问作者Raphael Frei
相关产品推荐
相关产品推荐

