这样作不太合适。
我的意见是,去掉unit2和unit3中窗体对象实例定义和单元初始化部分的代码,然后在form1的button1单击事件中动态定义、创建、showmodal和释放该窗体。这样就不会有问题了。

解决方案 »

  1.   

    我还是不明白为什么在finalization里写释放代码会出错,我的一个工程也用到了这种方法,但就是在finalization释放的时候出错,后来只好不释放。不过因为程序用到的资源在程序退出的时候都会释放,我也就没有管他,但我还是想知道为什么会这样。
      

  2.   

    我已经知道你的程序为什么出错了。
    我给你列举出你所写程序运行时的事件发生次序,你就明白了:程序开始运行,Project1被装载入内存;
    Unit3 initialization部分开始运行;
    Form3对象初始化;
    Unit2 initialization部分开始运行;
    Form2对象初始化;
    Unit1 装入;
    Forms initialization部分开始运行;
    Appliacation对象初始化;
    Form1对象初始化;
    Form1 Show;

    Form1 Close;
    Forms finalization部分执行;
    Form1释放;
    Form2释放;<请注意此处>
    Form3释放;<请注意此处>
    Application释放;
    Unit1 退出;
    Unit2 finalization部分执行;<出错!>
    Unit3 finalization部分执行;<出错!>
    程序运行结束。你一定奇怪,为什么Form2和Form3在Application释放前就释放了,而不是在其所在单元的finalization部分释放。
    答案在你的 initialization 部分。
    在那里,你的Form2和Form3的Owner都是Application,根据Delphi的规定,所有的对象都将在其Owner释放之前自动释放,所以在Application对象释放前,Form2和Form3都被释放了。
    那么,finalization部分里不是判断对象是否为空指针吗?呵呵,在Delphi里,对象占用的资源释放,但它所占据的变量地址(对象变量指针)并未释放,对它的释放方法是必须将对象指针显式赋值为nil。相信你已经明白如何去作了,那就是,在单元初始化部分,将窗体对象的Owner指定为nil,这样就不会出错了。不过,我还是建议你,没有特殊原因最好不要在单元的初始化部分初始化对象变量。
    以上所述仅供参考,希望能对你有所帮助。