从Powerbuilder 9.0的Popup窗口返回自定义结构
如何从Powerbuilder 9.0的"弹出"窗口返回值或者结构? CloseWithReturn仅对响应窗口有效,因此不可用。当我为Message.PowerObjectParm设置一个值时,当Popup窗口关闭时,该值将为null。我需要使用一个弹出窗口,以便用户可以单击返回到调用者窗口并滚动浏览各行。
程序流程:
1)窗口A OpenWithParm
2)窗口B现在打开
3)用户与两个窗口都进行交互
3)用户关闭窗口B
4)窗口B需要将结构传递回窗口A
解决方案
我们将无法以自己的思维方式完成此任务。由于我们从父窗口打开的窗口不是"响应"窗口,因此这两个窗口未明确链接在一起。
但是,我们可以通过在父窗口中使用属于自定义结构类型的公共实例变量来实现此目的。然后在关闭子窗口之前,从子窗口中,通过类似以下方式在父窗口中显式设置变量:
w_my_parent_window_name.istr_my_structure = lstr_my_structure
仅当实例化w_my_parent_window_name的一个实例时,才应执行此操作。
通过在打开弹出窗口时将引用传递给父窗口,并将引用存储在实例变量中,可以绕开父限制的"一个实例"。这也可以确保我们使用的是正确版本的w_my_parent_window_name。
如果我们使用的是PFC,如果我没记错的话,还有一项我们也可以使用的服务。
Message.PowerObjectParm可用于传递对象。当关闭弹出窗口时,它变为NULL的原因是因为结构是自动实例化的,并且会自动销毁。它们仅在声明的范围内有效。例如,如果在函数中声明了它,则它将在函数完成时销毁;否则,它将被销毁。如果它是弹出窗口的实例变量,则在关闭弹出窗口时它将与弹出窗口一起销毁。
我们可以按照Dougman的建议,在关闭弹出窗口之前将结构复制回父窗口中相同类型的变量中,或者,也可以使用对象代替结构。例如。只需创建自定义对象并在其中声明公共实例变量即可,就像我们在结构中使用变量一样。
当然,我们需要显式创建和销毁对象。弹出窗口创建的对象将保持实例化,直到明确销毁为止,即使弹出窗口本身已被销毁。
总有多种方法可以解决问题。即使问题仍然存在,我也会提出另一个建议。
关闭弹出窗口时,可以在父窗口上触发自定义事件。从技术上讲,我们可以在父窗口上触发任何事件,但是我建议为此专门创建一个自定义事件,以便我们可以将结构作为该事件的参数传递。