将事件添加到动态声明的控件

时间:2010-09-24 18:49:56

标签: powerbuilder

这是一个PowerBuilder问题。我正在使用PowerBuilder 12 Classic。

我有一个窗口,其中大多数控件都是使用OpenUserObject在代码中动态声明的。单击其中一个控件时,应在容器窗口中打开一个面板。但是,我不确定如何从动态声明的控件触发事件。控件类型是自定义的(标准可视对象中的自定义代码,singleLineEdit),并且我在控件的getfocus事件中声明了自定义代码。但是如何引用容器窗口?

我知道我可以通过名称引用容器窗口,但这是非常自我限制的。有没有其他方法可以实现这个目标?

3 个答案:

答案 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()