1

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

我正在使用 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

4 回答 4

1

如果你想让它更面向对象,那么创建一个窗口祖先......说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
于 2013-09-20T06:27:00.110 回答
0

利用:

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

代替

win = m_manage_truck.getParent() //get window associated with the menu
于 2013-09-17T21:13:06.980 回答
0

是的,那段代码确实有效,但它是做你想做的最好的方法吗?

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

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

于 2013-09-18T19:24:18.097 回答
0

像这样使用它:

w_whichwindow win
win = this.parentwindow

win.callthefunction()
于 2014-06-11T11:49:12.513 回答