Powerbuilder窗口控制为null?

时间:2013-09-17 20:44:00

标签: powerbuilder

我的问题是:如何通过父窗口上的菜单引用数据窗口中的数据?

我正在使用Powerbuilder 7。

为了尝试自己找到解决方案,我使用了以下代码:  

int iNum, i

Window win
//get window
win = m_manage_truck.getParent() //get window associated with the menu

//grab all objects on window

//  Next line I get a 'NULL' value error which terminates the application
iNum = upperBound(win.control)   

在为iNum分配控件数时会导致空引用错误的原因是什么?  (我假设它是一个空白的窗口对象,在这种情况下如何使用菜单找到窗口?)

最终,我正试图从数据窗口中获取数据。是否有更简单/更好的方法从菜单项中获取函数中的数据窗口数据?

谢谢

4 个答案:

答案 0 :(得分:1)

如果您想要更多OO,那么创建一个窗口祖先 ...说 w_a 并创建存根事件,如:

string ue_request_data(string as_requestmsg)
return ''

请记住从您的窗口祖先 w_a 继承所有窗口将特定代码添加到ue_request_data 事件并删除“扩展祖先”复选框,只有后代代码运行。代码如下,但显然你会做一些更有创意的事情。

string ls_rtnvalue
choose case as_requestmsg
case 'customer_id'
  ls_rtnvalue ='10'
case 'customer_name'
  ls_rtnvalue = 'John Doe'
case 'rowstatus'
  ls_rtnvalue = 'Modified'
case else
  ls_rtnvalue = 'Unknown message! Programming error'
end choose

return ls_rtnvalue

最后在您的菜单点击事件... 动态调用中请求数据,只要您从w_a继承,您的代码就不会被打断,因为您已经删除了功能。在进行动态调用之前,您甚至可以先检查类名,以防您没有从w_a继承所有窗口

string ls_customer_name
window lw
lw = this.ParentWindow
ls_customer_name = lw.event dynamic ue_request_data('customer_name')

或先检查班级名称

string ls_customer_name
window lw
lw = this.ParentWindow
string ls_classname
if ClassName(lw) = 'w_customer_detail' then
  ls_customer_name = lw.event dynamic ue_request_data('customer_name')
end if

答案 1 :(得分:0)

使用:

win = this.parentwindow //get window associated with the menu

而不是

win = m_manage_truck.getParent() //get window associated with the menu

答案 2 :(得分:0)

是的,代码当然有效,但它是做你想要的最好的方法吗?

我的OO纯粹主义者有一条规则:“永远不要把业务逻辑放在视觉控制中”,比如菜单或按钮。您永远不应该需要来访问菜单中窗口(或其控件)的属性或数据。编写一个窗口函数来完成你想要的东西,并让菜单简单地调用那个窗口方法。这使得该逻辑可用于窗口内的其他事件,而不会发生一些疯狂的menu.m_whatever.triggerevent()废话。

或者更好的是,创建一个“控制器”NVO,将其绑定到OPEN事件中的窗口,并在该NVO内部拥有该窗口的所有业务逻辑。

答案 3 :(得分:0)

像这样使用:

w_whichwindow win
win = this.parentwindow

win.callthefunction()