窗口A明明打开,在窗口B中调用窗口A中的函数,提示null object reference at ...

l_chlmh 2009-08-26 02:30:02
前几天还好用的,今天突然间不好用了。
...全文
313 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
kenshu 2009-08-27
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 gui41021 的回复:]
额 意思是不是
window lw_tmp
OpenSheet( lw_tmp, ls_A)
然后
OPEN(B)

B为当前窗口时,此时如果调用A的函数提示NULL OBJECT,isvalid(A) == false 是因为实例化的只是LW_TMP,WINDOW类型,窗口类A并没有实例化,所以不能调用
[/Quote]

对.大致可以这样理解.

isvalid(A),这个时候的A,是一个全局变量的名称。它没有被实例化.所以isvalid(A)是FALSE

你可以在A的OPEN事件中,加入一句
A = this //前面的A是全局变量.这一句并不是使A这个全局变量实例化,而是使这个全局变量指向你刚才随手定义的lw_tmp

这样后面的B,就可以 a.wf_function_name(parmname)......
dahaidao 2009-08-27
  • 打赏
  • 举报
回复
别opensheet了,直接open试一下。
gui41021 2009-08-27
  • 打赏
  • 举报
回复
额 意思是不是
window lw_tmp
OpenSheet( lw_tmp, ls_A)
然后
OPEN(B)

B为当前窗口时,此时如果调用A的函数提示NULL OBJECT,isvalid(A) == false 是因为实例化的只是LW_TMP,WINDOW类型,窗口类A并没有实例化,所以不能调用
kenshu 2009-08-26
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 kenshu 的回复:]


实际上,是PB的语法"帮我们"混淆了类名和实例.//在一些情况下,w_child_1表示类名,另一些情况下,w_child_1又表示实例,还有一些情况下,它又表示全局变量.
[/Quote]

比如

w_child_1 lw //这个时候w_child_1是类名
open(w_child_1)//这个时候,w_child_1是一个全局变量,并且把这个全局变量实例化.在OPEN之前,这个变量还不是一个实例.//isvalid(w_child_1) == false
open后,这个全局变量实例化了,isvalid(w_child_1) == true
kenshu 2009-08-26
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 l_chlmh 的回复:]
window child

OpenSheetWithParm(child, sle_state, &

        "w_child_1", MDI_User, 4, Layered!)
[/Quote]

你后面用类似于 close(w_child_1),写是没问题,运行时会出错的(有时仅仅没有任何反应)

你要是想简单一点.

在 w_child_1的open事件中,加一句


w_child_1 = this


就可以了.

实际上,是PB的语法"帮我们"混淆了类名和实例.//在一些情况下,w_child_1表示类名,另一些情况下,w_child_1又表示实例,还有一些情况下,它又表示全局变量.
l_chlmh 2009-08-26
  • 打赏
  • 举报
回复
我刚才用了
A中的按钮事件
string ls_pp
openwithparm(B,ls_pp)
ls_pp= message.stringparm
if ls_pp='执行' then
wf_init()
else
return;
end if
B的退出按钮:closewithreturn(parent,'执行')
的办法倒是可以,但是仅限于response窗口。

gui41021 2009-08-26
  • 打赏
  • 举报
回复
if ls_name = 'w_child_1' then OpenSheetwithparm( w_child_1 ,'parm', MDI_user, 5, Layered! )

这样打开,A B调用倒是没问题,不过不现实,太笨了。
或者不能调函数,调事件呗。。。
Window lw_ActiveSheet
lw_ActiveSheet = ParentWindow.GetActiveSheet()

IF IsValid(lw_ActiveSheet) THEN
lw_ActiveSheet.TriggerEvent(as_event)
End If

你要是自己找到解决办法了,也告诉我下。

l_chlmh 2009-08-26
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 gui41021 的回复:]
OpenSheet( lw_tmp, ls_windowname , w_main_frame, 5, Layered! )  //1

OpenSheet(  w_1 , w_main_frame, 5, Layered! )//2


方法1打开的窗口A(ls_windowname),B窗口不能调用它的任何函数

--------------------
能不能调用A.函数 取决于A是否是已创建的实例,与谁来调用无关

所以您要看看A是怎么打开的

--------------------

这样考虑
在点击A.cb_1
打开B的时候传参数过去
在A.cb_1的clicked事件写:
datawindow ldw
ldw = A.dw_1
openwithparm(B,ldw )

在B定义一实例变量datawindow idw
在B的open事件写:
idw = message.powerobjectparm
然后就可以在B的cb_1的clicked事件写:
idw.retrieve()

-----------------

我前几天遇到同样的问题,这是兄弟们给的解决办法 应该可以解决
[/Quote]
能不能想办法得到A的实例名。
l_chlmh 2009-08-26
  • 打赏
  • 举报
回复
window child

OpenSheetWithParm(child, sle_state, &

"w_child_1", MDI_User, 4, Layered!)
l_chlmh 2009-08-26
  • 打赏
  • 举报
回复
大哥,情况和1一样,我的菜单是动态生成的。我刚才打开看了看。
gui41021 2009-08-26
  • 打赏
  • 举报
回复
OpenSheet( lw_tmp, ls_windowname , w_main_frame, 5, Layered! ) //1

OpenSheet( w_1 , w_main_frame, 5, Layered! )//2


方法1打开的窗口A(ls_windowname),B窗口不能调用它的任何函数

--------------------
能不能调用A.函数 取决于A是否是已创建的实例,与谁来调用无关

所以您要看看A是怎么打开的

--------------------

这样考虑
在点击A.cb_1
打开B的时候传参数过去
在A.cb_1的clicked事件写:
datawindow ldw
ldw = A.dw_1
openwithparm(B,ldw )

在B定义一实例变量datawindow idw
在B的open事件写:
idw = message.powerobjectparm
然后就可以在B的cb_1的clicked事件写:
idw.retrieve()

-----------------

我前几天遇到同样的问题,这是兄弟们给的解决办法 应该可以解决
jlwei888 2009-08-26
  • 打赏
  • 举报
回复
代码?问题要说清楚啊!
l_chlmh 2009-08-26
  • 打赏
  • 举报
回复
所以我也感觉奇怪,就连A窗口上的菜单调用窗口的函数也不好用,regenerate过了,没用。
jlwei888 2009-08-26
  • 打赏
  • 举报
回复
不可能的!
使用的对象为空!你再好好检查吧!
这几天这么多访问其它窗口的问题!

604

社区成员

发帖
与我相关
我的任务
社区描述
PowerBuilder 控件与界面
社区管理员
  • 控件与界面社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧