基础问题连串问之:祖先定义的实例变量,赋值后,子孙类中执行代码仍是空object.什么原因啊?

lovemoreh 2010-04-25 07:29:37
我定义了一个菜单m_main,并为其定义了一个datawindow类型的实例变量dw_1。
然后从m_main继承出来一个类m_ordinary,m_ordinary中的一些代码对dw_1进行操作。
然后又从m_ordinary继承一个菜单m_stock。

做一个窗口,使用菜单m_stock。在窗口的open事件中将窗口中的一个数据窗口赋值给m_stock.dw_1.
执行时会出错,错在m_ordinary中对dw_1进行操作的代码,错误内容是:引用了null object.

调试时的情况如下:
在m_ordinary出错的代码处:isnull(dw_1)为false,即dw_1不是null object.
dw_1前面的图标是"x+y=?",而不是object的图标,表示dw_1被当成了一个计算式,而不是一个object.

这是什么原因啊?
...全文
162 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
lovemoreh 2010-05-09
  • 打赏
  • 举报
回复
终于解决这个问题了。
把解决的方法和过程写出来分享一下,希望不要有人遇到这种情形时再走弯路。

开始我在窗口的open事件里写的代码如下:
//im_this是m_stock类型的窗口实例变量

im_this = create m_stock
im_this.dw_1 = dw_1 //dw_1是窗口里的一个数据窗口控件

this.changemenu(im_this)
...
_________________________________________________
我是通过trace文件查看执行时到底发生了些什么。
设置好tracing文件后,执行代码,浏览trace文件,赫然发现:在执行changemenu()函数时,居然又创建了一次m_stock菜单,然后把创建的菜单作为窗口的菜单。原来changemenu函数会把传递给它的菜单参数再创建一个实例!原来如此!

解决的办法就是:在changemenu函数创建了菜单实例后,再给菜单的dw_1实例变量赋值。代码如下:
//im_this = create m_stock //不必自己创建
//im_this.dw_1 = dw_1 //dw_1是窗口里的一个数据窗口控件

this.changemenu(im_this)
im_this.dw_1 = dw_1
...


谢谢各位!过一小段时间就结贴了。
永生天地 2010-04-26
  • 打赏
  • 举报
回复
lz给些代码出来,看了半天都不知道程序怎么运行的
wag_enu 2010-04-26
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 lovemoreh 的回复:]
我是要用菜单操作窗口里的datawindow,所以在菜单里定义一个datawindow实例变量,然后把窗口里的datawindow控件赋值给菜单里的datawindow类型的实例变量。如果只是继承一次,是完全没有问题的,我有很多程序都是这样处理的。

[/Quote]

建议换一种方法:
在菜单项的clicked 事件中写 parentwindow.dynamic event ue_XXX()

再做一个祖先窗口w_base, 并且自定义一个事件 ue_xxx
以后要引用该菜单的窗口都继承自w_base

并且, 在继承后的窗口的ue_xxx 中写相关的代码.
lovemoreh 2010-04-26
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 sky_4k_ppm 的回复:]
最好是动态 设定对象 integer returns setDataWindow(DataWindow adw_obj)
idw_obj=adw_obj
return 1
[/Quote]
嗯,这个思路很好!可以试一下。试了后我会来报告。
sjlion 2010-04-26
  • 打赏
  • 举报
回复
没赋值之前就执行祖先代码了?LZ不把代码贴上了不好分析
SKY_4K_PPM 2010-04-26
  • 打赏
  • 举报
回复
最好是动态 设定对象 integer returns setDataWindow(DataWindow adw_obj)
idw_obj=adw_obj
return 1
new4everlau 2010-04-26
  • 打赏
  • 举报
回复
也没看懂,帮顶!
lovemoreh 2010-04-26
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 dawugui 的回复:]
我知道以前陶清网有好几个比较好用的菜单代码,很有用,你去找找.
[/Quote]
谢谢!陶清网上的好东东,现在可能难找齐全了,呵呵。遗憾!


[Quote=引用 4 楼 xys_777 的回复:]
lz给些代码出来,看了半天都不知道程序怎么运行的
[/Quote]
涉及到三个继承的菜单,然后一个使用菜单的窗口,帖源代码会有一大长溜啊,看着会很累。

其实业务逻辑很简单:就是一个父菜单类,定义了一个实例变量dw_1, 然后一个继承的父类菜单对dw_1进行了操作,最后继承的子菜单把窗口中的一个dw赋值给菜单实例的dw_1.


[Quote=引用 5 楼 new4everlau 的回复:]
也没看懂,帮顶!
[/Quote]
谢谢!


[Quote=引用 6 楼 sjlion 的回复:]
没赋值之前就执行祖先代码了?LZ不把代码贴上了不好分析
[/Quote]
赋值是在窗口的open事件中进行的。等窗口打开完成后,然后才对菜单进行操作,才出错。

所以,赋值的代码肯定是在执行祖先代码前执行的。



[Quote=引用 7 楼 wag_enu 的回复:]
建议换一种方法:
在菜单项的clicked 事件中写 parentwindow.dynamic event ue_XXX()

再做一个祖先窗口w_base, 并且自定义一个事件 ue_xxx
以后要引用该菜单的窗口都继承自w_base

并且, 在继承后的窗口的ue_xxx 中写相关的代码.
[/Quote]
其实我这样做,是为了菜单的通用性:
不管是怎样的窗口,只要把窗口中的数据窗口赋值给菜单的dw_1,菜单就可以轻松地对窗口中的数据窗口进行操作了。很方便的,对窗口没有任何限制,菜单的通用性很强。


谢谢各位!我现在是将父菜单进行另存,然后进行修改来解决问题的。
只是还没有弄清楚其中的原因。待有时间了,会继续研究这个问题。
dawugui 2010-04-25
  • 打赏
  • 举报
回复
我知道以前陶清网有好几个比较好用的菜单代码,很有用,你去找找.
lovemoreh 2010-04-25
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 wag_enu 的回复:]
判断变量值是否为空用 isnull(变量) ,
判断对象是否存在用 isvalid(对象)

在菜单里定义:
datawindow dw_1 的话.

需要找个地方写:
dw_1 = create datawindow

另外,建议在菜单里用Datastore 而不要用 datawindow
[/Quote]
我是要用菜单操作窗口里的datawindow,所以在菜单里定义一个datawindow实例变量,然后把窗口里的datawindow控件赋值给菜单里的datawindow类型的实例变量。如果只是继承一次,是完全没有问题的,我有很多程序都是这样处理的。
wag_enu 2010-04-25
  • 打赏
  • 举报
回复
判断变量值是否为空用 isnull(变量) ,
判断对象是否存在用 isvalid(对象)

在菜单里定义:
datawindow dw_1 的话.

需要找个地方写:
dw_1 = create datawindow

另外,建议在菜单里用Datastore 而不要用 datawindow

1,108

社区成员

发帖
与我相关
我的任务
社区描述
PowerBuilder 相关问题讨论
社区管理员
  • 基础类社区
  • WorldMobile
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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