类型:转载 责任编辑:asp 日期:2007/03/01
我有一个窗口w_1是继承pfc_w_sheet的,w_1上放了一个数据窗口dw_1是继承u_dw的,
然而在打开w_1的情况下从别的窗口写代码isvalid(w_1)和isvalid(pfc_w_sheet)都是返回false。
我现在想在别的窗口上调用w_1窗口上dw_1的一个事件,这样写报错“null object reference”此代码是在窗口w_2上触发的,如下:
pfc_w_sheet lw_sheet
lw_sheet = w_1
lw_sheet.dw_1.trigger event retrievestart()//这里报错
///////////////////////////////////////////////////
这样写也不行:
w_1.dw_1.trigger event retrievestart()
推荐阅读
可能吗????
要想调用继承过来的代码,要用命令call。
不应该这样声明:
w_1 lw_sheet //这是重点!只有w_1中才有dw_1
lw_sheet = w_1
lw_sheet.dw_1.trigger event retrievestart()
用call,如:
call w_1.dw_1::itemchanged
用call,如:
call w_1.dw_1::itemchanged
如果程序是mdi,程序是基于pfc的如下:
w_frame lw_frame
window lw_sheet
w_1 lw_parent
lw_frame = gnv_app.of_getframe()
lw_sheet=lw_frame.getactivesheet()
do while isvalid(lw_sheet)
if lower(lw_sheet.classname())=w_1 then
lw_parent=lw_sheet
exit
end if
lw_sheet=lw_frame.getactivesheet()
loop
if isvalid(lw_parent) then
lw_parent.dw_1.trigger event retrievestart()
end if
呵呵,窗口之间要有继承关系
楼主是不是想在打开别的窗口是判断该窗口是否已经打开,然后做相关的操作?
可以用一个global变量和一个全局函数来实现。
试试:
w_1.dw_1.triggerevent(retrievestart)
呵呵,pb已经提示的很清楚了,可你还是视而不见。null object referenced,就是空对象引用,你使用isvalid()函数也是同样的作用,即检查是否有空对象引用。isvalid返回false,你当然不能在继续了。其实如果你对java有点了解就知道,就是表示变量没有引用对象,所以不能对变量进行操作。比如:
w_1 mywindow
mywindow.dw_1.triggerevent()
嘿嘿,必然会空对象引用,因为mywindow根本就没有引用对象嘛,或者说,没有分配内存。要这样:
w_1 mywindow
mywindow = create w_1
mywindow.dw_1.triggerevent()
这就可以了。可是这样分配内存导致窗口不可见。所以一般我们使用open系列函数,它在给mywindow变量分配内存(或称为分配引用)时使窗口可见。即
w_1 mywindow
open(mywindow)
mywindow.dw_1.triggerevent()
如果你不定义w_1类型变量而直接使用w_1也可以,而且更好,因为w_1被默认为一个全局变量。这样你不用分配内存就可以使用它了,而且也不用担心空对象的问题。呵呵,学过c吗?全局对象的内存分配在程序初始化前完成,用你的代码就没问题啦。