我的问题是:如何通过父窗口上的菜单引用数据窗口中的数据?
我正在使用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分配控件数时会导致空引用错误的原因是什么? (我假设它是一个空白的窗口对象,在这种情况下如何使用菜单找到窗口?)
最终,我正试图从数据窗口中获取数据。是否有更简单/更好的方法从菜单项中获取函数中的数据窗口数据?
谢谢
答案 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()