第1个窗体中的button1onclick中动态创建窗体2,并显示,此时释放form1。
form2 := TForm2.Create(Application);
Free;
form2.Show;
第1个窗体中的button2onclick中动态创建窗体3,并显示,此时释放form1。
form3 := TForm3.Create(Application);
Free;
Form3.Show;
第2个窗体中的buttononclick中动态创建窗体1,并显示,此时释放form2。
form1 := TForm1.Create(Application);
Free;
Form1.Show;
第3个窗体中的buttononclick中动态创建窗体1,并显示,此时释放form3。
form1 := TForm1.Create(Application);
Free;
Form1.Show;

解决方案 »

  1.   

    你创建form2的时候把form1释放?
    form1是程序的主窗体,你把它释放之前要再指定form2为主窗体才可以吧?
    我估计是这个问题。
      

  2.   

    第1个窗体中的button1onclick中动态创建窗体2,并显示,此时释放form1。
    form2 := TForm2.Create(self);
    form2.Showmodal;
    form1.Free;
    第1个窗体中的button2onclick中动态创建窗体3,并显示,此时释放form1。
    form3 := TForm3.Create(self);
    Form3.Showmodal;
    form1.Free;
    第2个窗体中的buttononclick中动态创建窗体1,并显示,此时释放form2。
    form1 := TForm1.Create(self);
    Form1.Showmodal;
    form2.Free;
    第3个窗体中的buttononclick中动态创建窗体1,并显示,此时释放form3。
    form1 := TForm1.Create(self);
    Form1.Show;
    form3.Free;
    刚刚做了这个程序,d6通过!不需要设置任何属性!
      

  3.   

    Form1释放了,Form2,Form3怎存在?除非在:
    Application.CreateForm(TForm2,Form2);
    Form2.ShowModal;
    Form1.Free;
      

  4.   

    用隐藏不就行了嘛。
    要释放的话,须注意Create(Aowner)中的参数。
    参数如果填form1,则会随form1的释放而释放。
    填nil,则系统不进行自动释放
      

  5.   

    to : rabbit_lap
       老兄,如果不是MDI的窗体,而且form1不是主窗体的话,这样是不是可以呢?
      

  6.   

    我觉得各位说的有点问题:
    TO cuilj (往上爬) :
    我不知道你这样做的目的是什么。
    一个应用程序只能有一个主窗体,一般来说,.dpr中建立的form1就是
    主窗体,其它的窗体只能自己编写代码实现、维护。
    在DELPHI中所有的对象实际上都是指针,就象C中指针。
    而调用对象的create方法就是生成对象的实例,比如说
      formx:=tformx.create(nil);
    就象C中的int *p;
      p:=(int *)malloc(sizeof(int));
    按照你的意思:
    第1个窗体中的button1onclick中动态创建窗体2,并显示,此时释放form1。
    第1个窗体中的button2onclick中动态创建窗体3,并显示,此时释放form1。就是:
    procudure TForm1.Button1click(Sender:TObject);
    var form2:TForm2;
    begin
      form2:=TFomr2.create(self);
      form2.showmodal;
      form1.free;
    end;
    procudure TForm1.Button2click(Sender:TObject);
    var form3:TForm3;
    begin
      form3:=TFomr3.create(self);
      form3.showmodal;
      form1.free;
    end;
    那么我请问,你已经在Button1OnClick中将form1释放了,
    在Button2OnClick中你还能释放form1吗?
    而且,你自己建立的form2,form3还没释放呢,资源由谁来回收呢?
    这就跟在C中
    int function1()
    {
     int *p;
      p=(int *)malloc(sizeof(int));
    }
    int function2()
    {
     int *q;
      q=(int *)malloc(sizeof(int));
    }
    那么这些资源怎么办呢?
    所以你的做法是错误的,正确的做法应该是:
    procudure TForm1.Button1click(Sender:TObject);
    var form2:TForm2;
    begin
      form2:=TFomr2.create(self);
      form2.showmodal;
      form2.free;
    end;
    procudure TForm1.Button2click(Sender:TObject);
    var form3:TForm3;
    begin
      form3:=TFomr3.create(self);
      form3.showmodal;
      form3.free;
    end;
    或者使用全局对象,即form2,form3 不在按钮的单击事件中声明
    而是声明成全局对象,不然,我们是没办法在其它的地方访问TFomr2.create(self)和TFomr3.create(self)所建立的对象的
    **********************************************************
    to  prometheusphinx(白日梦) :
    我觉得你的做法跟上面的一样,第1个窗体中的button1onclick中动态创建窗体2,并显示,此时释放form1。
    1、form2 := TForm2.Create(Application);
       Free;
       form2.Show;第1个窗体中的button2onclick中动态创建窗体3,并显示,此时释放form1。
    2、form3 := TForm3.Create(Application);
       Free;
       Form3.Show;
    在1中已经将form1给释放了,在2中还能释放form1吗?因为这里的两次调用free
    实际上是form1.free;
    *********************************
    to qhdsfh(飞翔的鹰) :
    你这样做很不安全,也是对同一个对象form1使用了两次free方法,会没问题吗?关键是提问的那位,我不知道你到底要实现什么目的,如果我说错了,欢迎大家
    纠正!mail:[email protected]
      

  7.   

    var
      form2:tform2;
    begin
      form2:=tform2.create(application);//创建窗体form2
      try
       //dosomething
      finally
      form2.free;//为释放掉form2
    end;
    其他的类似这样的,
    具体可以参考delphi的帮助文件!!
      

  8.   

    当显示Form2时把Form2关闭,Application不会结束(MainForm还没Close),呵呵,这一下又要多写一些代码了
      

  9.   

    有好多人都这样写
    procedure form1.button1click;
    begin
    form2 := TForm2.Create(self);
    form2.Showmodal;
    form1.Free;
    end;
    我现在先讨论只有两个窗体的情况。
    现在form1是主窗体,form2是显示出来了,form1是不见了。
    但当你关闭form2的时候,应用程序是否关闭了吗?
    当你按F9运行时,关闭form2时你就可以知道程序是否还在运行。
    同时如果你用“任务管理器“查看时就知道程序并没有结束。
    可见此方法是不行的。
      

  10.   

    由于Application.CreateForm(TForm1,Form)会主窗体是否为nil,如果是的话,
    便把新创建的 Form1 作为主 Form,根据这个原理,可如下实现:
    Form1中的按钮事件
    //创建Form2,释放Form1
    If Not Assgined(Form2) Then  //或If form2=nil then
      Begin
        Application.CreateForm(TForm2,Form2);
        Self.Free;//Form1.Free;
        Form2.ShowModal;
      End;//创建Form3,释放Form1
    If Not Assgined(Form3) Then  //或If form3=nil then
      Begin
        Application.CreateForm(TForm3,Form3);
        Self.Free;//Form1.Free;
        Form3.ShowModal;
      End;
    //最好在三个窗体的Close,Destory中分别编写如下事件:
    procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
      action := cafree;
    end;procedure TForm1.FormDestroy(Sender: TObject);
    begin
      form1 :=nil;
    end;//创建Form1,释放Form2
     if Form1 = Nil then
        begin
          Application.CreateForm(TForm1,Form1);
          form2.free;
          form1.showmodal;
        End;//创建Form1,释放Form3
     if Form1 = Nil then
        begin
          Application.CreateForm(TForm1,Form1);
          form3.free;
          form1.showmodal;
        End;