本帖最后由 chenjiaye000 于 2011-07-18 19:16:51 编辑

解决方案 »

  1.   

    if assgined(form1) then
      free(form1);
    form2.show;
      

  2.   

    把form2.create从dpr里移到需要的地方就可以了,不用初始时创建的
      

  3.   

    LZ都不仔细看回答么?delphi加载的窗体创建默认是放在dpr里的,把里面的代码取出来,需要调用窗体时创建,用完释放即可保证内存占用最优另外频繁创建释放窗体根本没意义,因为这样反而会增加系统负担,也容易引起内存泄露
      

  4.   

    form2:=Tform2.Create(self);
    form2.ShowModal;按此操作。
      

  5.   

    form2:=Tform2.Create(self);
    form2.ShowModal;按此操作。
      

  6.   

    form2:=Tform2.Create(self);
    form2.ShowModal;按此操作。
      

  7.   


    楼上的答案全部都是正确的~楼主基础太差,根本没有理解意思,建议看基础书籍,或者找朋友现场讲解一下!这里只说一下,你概念理解的有问题,你把“动态窗体”和“动态创建窗体”混淆在一块了。delphi里面就没有“动态窗体”这个概念的,其它网友告诉你,是要“动态创建窗体”!这是相对于delphi默认会“自动创建窗体”来说的。
      

  8.   


    请教下改如何释放窗体比较好呢?Form2.Free?
    Form2.Destroy?或是其它呢? 我很奇怪为什么多次创建释放之后果真出现了你所说的错误。Application.Terminate;  这一句会关闭整个程序,如果要关闭单个窗体可行不?
      

  9.   

    要调用的时候:
    if not Assigned(Form2) then
    Application.CreateForm(TForm2, Form2);在Form2.OnClose事件里面:
    Action := caFree;在Form2.OnDestroy事件里面:
    Self := nil;
    Application.Terminate当然会关闭整个程序,因为这句话就是干这个的。
      

  10.   


    呵呵~我发现21楼提供的代码在释放窗体的时候不会报错,但是同时也有一个问题。比如说我现在在Form2,然后我调用Form3,我按你说的做了,一切很好很和谐。可是,但我要关闭Form3,重新显示Form2时,问题就来了。 我的代码里面有
    Form3.Hide;
    Form2.Show;
    写在FormCloseQuery里面。原本不动态创建窗体,那就在我点击关闭时会显示回Form2,可是现在则是直接关闭整个程序。我尝试添加一句Abort;,可是这样就不会执行OnClose和OnDestroy。跪求改进方法。
      

  11.   


    你的Application的dpr文件里面创建的第一个可视窗体会被认为是主窗体,例如Form1。Form1还没有被关闭掉的话,你动态创建和释放Form2,Form3...是不会关闭程序的。并且一般来说,主窗体应该是始终不会被关闭的。
      

  12.   

    程序运行时,只显示Form1,而Form2、Form3不但不显示,而且不占用内存。~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~所有窗体为非自动创建,用时才创建,用过后(关闭窗体后)马上释放窗体。如果想实现记忆上次打开的窗口上的一些控件内容,可以在关闭(释放前)窗体时保存到ini文件,下次打开(创建)窗体时再读取那个ini文件~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    1、设置非主窗体为非自动创建;2、打开窗口用如下方式:
    if not Assigned(Form1) then
      begin
        Form1:=TForm1.Create(nil);
      end;
      Form1.ShowModal;
    end;3、Form1的FormClose、FormDestroy属性设置如下:
    procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
      Action:=caFree;
    end;procedure TForm1.FormDestroy(Sender: TObject);
    begin
      Form1:=nil;
    end;
      

  13.   

    动态创建窗体,用的时候创建,用完Free
      

  14.   


    可是现在情况是特殊的……   请问能否在  动态创建的Form1关闭后,在Form2中写上:
    Form1.Action:=caFree;
    Form1:=nil;
      

  15.   

    用类引用类型写个过程 直接调用就可以了
    procedure TMainForm.ShowForm(FormClass: TFormClass);
    begin
      With FormClass.Create(Self) do
      try
        ShowModal;
      finally
        Free;
      end;
    end;