2009-06-21

2009-06-12

VFP事件绑定与表单Destroy事件

  今天把一个自定义控件放在一个新建的表单上测试,发现关闭表单后,表单并没有被销毁。我在命令窗口中执行了CLEAR ALL命令才能把表单彻底销毁。可是我之前的测试表单都可以正常关闭啊。之前的测试表单是不是用的FORM基类,而是基于自定义的表单类,通过检查代码发现我的自定义表单中有一句:= SYS(1104)。难道这个函数起作用?把它放到新的表单里,然后运行,关闭,一切正常。
  表单无法正常关闭,一般是由于表单中的某些控件被其他对象引用,比如把表单中的某个对象加到Collection里,然后这个Collection又是另外一个对象的属性。关闭表单前,必须删除这些引用,否则表单就无法正常退出。可是加了SYS(1104)就可以吗?这个函数显示没有这方面的作用。于是又仔细检查了一下代码,我发现我的某个自定义控件中有Collection类型的属性引用了表单中的其他控件,但是我绑定了表单的Destroy事件,在表单发生Destroy事件后清除所有引用。应该不会有问题啊。后来我发现,只要表单的Destroy事件中有代码,哪怕是注释,表单都能正确释放,而不加代码就关闭不了。原来Destroy事件中没有代码时,绑定到该事件上的方法根本就不会执行!不知这是VFP的一个BUG,还是有特殊用意。我后来又尝试绑事实上到表单的WM_DESTROY消息,不过也无济于事,表单需要先把所有控件清理掉,才会接收到WM_DESTROY消息消息。后来的解决方法是不把对象直接放入Collection中,而是把对象的全名放进去,然后需要引用的时候再用EVALUATE()函数得到对象。这样虽然麻烦一些,不过再也没有烦人的引用问题了。还有其他解决方案,比如用数组保存对象,而不是Collection。



  上面这张图就是我做的自定义控件,花了我很长的时间。