窗体事件驱动链分析

关于OnCreate和OnDestory事件:

  1. Form的OnCreate事件是不可靠的,并不像名字所说的当窗体一创建时就执行,而是当窗体是工程的主窗体或是一个继承其它窗体的子窗体时才执行.所以,在OnCreate()中初始化变量和创建对象是不合适的;

  2. 在有继承情况下,OnCreate事件先于构造函数发生,对应地OnDestroy事件后于析构函数发生。

  关于窗体的构造函数和析构函数

  1. 对于任何窗体,构造函数和析构函数是可靠的,因为它每一次创建和销毁窗体时都会执行。所以我们应在构造函数中进行程序的初始化操作,在析构函数中清理资源;而不要在OnCreate和OnDestory事件中进行处理;

  2. 在继承情况下BCB子窗体对象的构造过程是先构造父窗体,再构造子窗体,这点与C++完全一样,销毁过程则反之;

  3. 在有继承的情况下,父类窗体的构造函数和析构函数则会被执行多次,所以,在这两个地方不要new和delete对象,而应将这类代码放到具体的子窗体类中。如果不这样做,可能会由于多次删除同一对象而引发错误,除非将父类窗体的对象指针声明为static的,保证所有子类共享此new的唯一对象!

  4.析构函数总是最后调用的,而构造函数总是第一个调用。

  关于Owner参数:

  当Owner=Application时,先销毁new出来的窗体,再销毁主窗体;

  而当Owner=this(指主窗体)时,先销毁主窗体,再销毁子窗体;

  这个原则对于在窗体内部动态地生成VCL控件时也适用。特别地,当程序中用到了数据模块,或需要动态地生成DataSet等对象时更要注意。因为一个DataSet可能会向多个窗体提供数据(应该避免这样做,合适的方法是new TDataSet时Owner参数不设为Application)。

  其它:

  1.一个Visible=true的窗体一定要先Hide,才能被销毁。

  2.程序事件链的源头为工程中的主窗体的构造函数

  3.在有继承情况下,子类窗体实例一定要先Hide才可以被销毁。

  4.多窗体的管理BCB采用了栈的方法,按创建的次序,先创建的后销毁,千万要避免先创建的窗体含有对后创建的窗体(或其上的控件)的指针。

  5.关闭时一定会发生OnCloseQuery事件,如果是MDI,此事件还会在MDIChild窗体中传播,所以,在这个地方提示用户改变是合适的。

  6.有些事件一发生,则定然会跟着一系列的事件,这些事件发生的次序是不变的,比如,只要OnShow事件发生,则一定会接着发生以下事件:

àOnActivate()àOnCanResize()àOnConstrainedResize()àOnResize()
OnCloseQuery之后一定是OnClose() 

阅读更多
个人分类: Delphi
想对作者说点什么? 我来说一句

2018年中国区块链分析

2018年06月18日 2.18MB 下载

没有更多推荐了,返回首页

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭