能否从其他窗口触发段调用窗口过程?技术实现求助
调用窗口过程替代PLIP调用的解决方案
看起来你现在用launch.i通过PLIP机制调用了无UI的远程过程,但想要改为调用带窗口的本地/同会话过程——这确实需要调整调用方式,因为PLIP更适合跨分区的后台过程,而窗口过程需要在当前UI会话中运行。下面给你两种常用的解决方案:
1. 直接运行窗口程序并调用内部过程
如果目标窗口还未打开,你可以直接RUN窗口程序(如果需要保持窗口打开就加PERSISTENT),然后调用其内部的过程:
首先,定义窗口句柄变量(用于后续操作窗口):
DEFINE VARIABLE hPartWindow AS HANDLE NO-UNDO.
然后运行窗口并调用过程:
// 持久化打开窗口(如果窗口本身有初始化参数,可在括号内传递) RUN ford/win/YourPartWindow.p PERSISTENT SET hPartWindow. // 调用窗口内部的AddPart过程,传递你的参数 RUN AddPart IN hPartWindow ( INPUT cPartType, INPUT cSubPartType, INPUT cAttributeExp, INPUT cOutputQty, INPUT cOutputExp, OUTPUT cResult, OUTPUT cCheckCase ).
如果窗口只需要执行过程后自动关闭,也可以直接在RUN时传递过程参数(前提是窗口程序支持直接接收这些参数并触发对应过程):
RUN ford/win/YourPartWindow.p ( INPUT cPartType, INPUT cSubPartType, INPUT cAttributeExp, INPUT cOutputQty, INPUT cOutputExp, OUTPUT cResult, OUTPUT cCheckCase ).
2. 调用已打开的窗口过程
如果目标窗口已经在当前会话中运行(比如用户已经手动打开了),你可以通过遍历窗口句柄找到它,再调用内部过程:
DEFINE VARIABLE hTargetWindow AS HANDLE NO-UNDO. // 遍历顶级窗口的子窗口,找到目标窗口(这里假设窗口NAME为"PartWindow") FOR EACH hTargetWindow IN FRAME {&FRAME-NAME}:TOP-WINDOW:CHILDREN: IF hTargetWindow:NAME = "PartWindow" THEN DO: RUN AddPart IN hTargetWindow ( INPUT cPartType, INPUT cSubPartType, INPUT cAttributeExp, INPUT cOutputQty, INPUT cOutputExp, OUTPUT cResult, OUTPUT cCheckCase ). LEAVE. // 找到目标窗口后退出循环 END. END.
关键注意点
- 不要用PLIP调用带UI的窗口过程:PLIP是跨应用服务器/分区的后台调用,无法渲染UI,必须在当前会话内用
RUN ... IN HANDLE的方式调用窗口过程。 - 确保目标窗口的内部过程
AddPart的参数列表和你传递的参数类型、顺序完全匹配,否则会触发参数不匹配的报错。 - 如果需要窗口保持打开状态,一定要用
PERSISTENT关键字,否则窗口会在过程执行完成后自动关闭。
内容的提问来源于stack exchange,提问作者Thiru
相关产品推荐
相关产品推荐

