这是一个PowerBuilder问题。我正在使用PowerBuilder 12 Classic。
我有一个窗口,其中大多数控件都是使用OpenUserObject在代码中动态声明的。单击其中一个控件时,应在容器窗口中打开一个面板。但是,我不确定如何从动态声明的控件触发事件。控件类型是自定义的(标准可视对象中的自定义代码,singleLineEdit),并且我在控件的getfocus事件中声明了自定义代码。但是如何引用容器窗口?
我知道我可以通过名称引用容器窗口,但这是非常自我限制的。有没有其他方法可以实现这个目标?
答案 0 :(得分:2)
如果您不需要传递参数,可以使用parent.triggerEvent("event_name")
在窗口中触发事件。如果在窗口的祖先中定义了事件或函数(例如像PFC),则可以将parent
强制转换为祖先类型并直接调用。使用PFC的示例:
w_master w_container
w_container = parent
w_container.of_SetUpdateObjects({this})
答案 1 :(得分:1)
在自定义对象GetFocus事件中使用parent.dynamic。 parent关键字将引用控件的容器,使用dynamic关键字将允许您调用容器上的任何自定义函数或事件。例如:
parent.dynamic uf_OpenPanel(ls_SomeArg)
答案 2 :(得分:1)
我喜欢使用的另一种技术是向用户对象添加一个方法,用于设置对父窗口的引用,然后将该引用存储在用户对象的实例变量中。您仍然可以使用dynamic关键字,并使您的参数和实例变量通用类型为'window'
如果您拥有包含多个级别的可视控件的复杂自定义可视控件(例如tab - > datawindow),并且父级可能不一定是父窗口并且您需要对事件进行冒泡,则此技术非常有用向后。它不一定比前面的例子更好,但是有助于增加你的编程技术库。
创建自定义对象后,立即进行如下函数调用:
window lw
lw =这个 iuo_customcontrol.uf_setparent(LW)
在自定义控件中,添加实例变量和函数/事件: 保护: 窗口iw_parentwindow
新功能:uf_setparent(window as_window): iw_parentwindow = as_window
然后,在自定义对象的任何控件中,使用实例变量对父窗口进行动态函数调用
iw_parentwindow.EVENT dynamic ue_retrieve() 要么 iw_parentwindow.dynamic wf_retrieve()