解决方案 »

  1.   

    你按一个按钮,按钮里是不是有代码
    Form1:=TForm1.create(self);//这里是分配内存
    Form1.showmodal();
    Form1.free;  //这里是释放内存,如果是Form1.close就不会释放了,等到主窗体关闭才会释放。
      

  2.   

    你应该明白:程序自动创建的窗体资源是静态的资源,需要分配内存是理所当然的,但是当你打开FORM时候,与FORM应用程序一起交互时,还需要占用内存资源的。举例来说:你在FORM上的一个按钮事件里,定义了局部变量等等,另外和操作系统的内存分配策略有关系
      

  3.   

    你在创建窗体时,你就给这个窗体分配一块内存,而你在关闭窗体时并没有释放掉该内存块!关闭只是关闭嘛!要free的!不释放,内存当然会增加啊!自己创建的当然不会在关闭的时候释放,手动的在关闭时会自动释放!
      

  4.   

    窗体create的时候就向内存空的地方申请内存控件去创建窗体!如果是系统自动创建的话,它的create是在项目文件里面create的!当你要显示的时候只是普通的show出来而已!当点击了关闭按钮!其实它是hide了而不是真的释放了那个窗体的资源!在java中你是不用释放对象的资源的,当系统不够内存的时候它有个垃圾收集器去把不用的对象自动释放掉!采用这种方式的目的是在于你再次使用这个对象的时候就不用再次去创建它了!这样能把速度提高25%.运行某个窗体里面的过程或者函数当然要动态分配内存空间去处理啦!内存使用增加是理所当然的事情啊!
      

  5.   

    各位朋友,可否给我推荐几本讲解内存方面的书呢?
    另外我还有个问题:当我自己创建了一个窗体Fomr1,在其中的一些edit中输入一些参数,当我把Form1关闭释放后,如果再想读取先前输入的那些参数,该去哪里读呢?因为此时Form1已经释放了啊。而且每次输入参数后都要关闭窗体、释放窗体的阿
      

  6.   

    另外我还有个问题:当我自己创建了一个窗体Fomr1,在其中的一些edit中输入一些参数,当我把Form1关闭释放后,如果再想读取先前输入的那些参数,该去哪里读呢?因为此时Form1已经释放了啊。而且每次输入参数后都要关闭窗体、释放窗体的阿你的话有点矛盾,如果数据是有用的,你为什么不保存?如果是无用的,那你还读他干什么?
      

  7.   

    怎样建立的窗体在窗体的关闭事件中可以自动释放内存?
    Form1:=TForm1.create(self) 这样建立的可以么?
      

  8.   

    if not assigned(FormX) then   //FormX is the Form you want to create
       FormX:=TFormX.create(self);
       try
        FormX.showmodal;
       finally
        FreeAndNil(Formx)
       end;
    上面的是模式化显示窗体下面的是非模式化显示窗体:
    if not assigned(FormX) then   //FormX is the Form you want to create
       FormX:=TFormX.create(self);
       FormX.show;然后在FormX的onclose事件中加入: action:=cafree;
                 ondestroy事件中加入:FormX:=nil;
      

  9.   

    Form1.free,释放内存,CLOSE不释放内存。只知道这一点.
      

  10.   

    其实,你就是在每关闭一个窗体事件中加上formx.free就是了~
      

  11.   

    那我关闭每个窗体的时候是用close,还是用free好呢?
      

  12.   

    看你以后用不用了,不用了就free掉呗
      

  13.   

    是用free好,还是release 好呢?
    何时使用他们两个?
    那个更好点呢?
      

  14.   

    在你自己定义的窗体的OnClose事件里写这句话action:=cafree,另外如果需要保存数据的话则应该把保存数据的代码写在这句话之前。
      

  15.   

    答楼上:
    Use Release to destroy the form and free its associated memory.Release does not destroy the form until all event handlers of the form and event handlers of components on the form have finished executing. Release also guarantees that all messages in the form's event queue are processed before the form is released. Any event handlers for the form or its children should use Release instead of Free (Delphi) or delete (C++). Failing to do so can cause a memory access error.所以对于窗体尤其是非模式化的子窗体用release好一点。
      

  16.   

    ⑴,close只是关闭窗口并没有释放占用的内存空间,用free才可以释放窗体占用的内存;
    ⑵,另外想要edit中的参数就只有将参数存到一个全局变量中了,因为你的窗口已经关闭并释放了 ,所以参数是找不到的了。
      

  17.   

    关于 wujunwei(wujun) 所说的:
    ----------------------------------
    if not assigned(FormX) then   //FormX is the Form you want to create
       FormX:=TFormX.create(self);
       try
        FormX.showmodal;
       finally
        FreeAndNil(Formx)
       end;
    上面的是模式化显示窗体下面的是非模式化显示窗体:
    if not assigned(FormX) then   //FormX is the Form you want to create
       FormX:=TFormX.create(self);
       FormX.show;然后在FormX的onclose事件中加入: action:=cafree;
                 ondestroy事件中加入:FormX:=nil;----------------------------------
    建议改为:
       with TFormX.create(nil) do
       begin
         try
           showmodal;
         finally
           release;
       end;
       end;
    模式窗体闪现后就要销毁,何必再用一个指针来存储它呢?
      

  18.   

    楼上的回答好像都只是回答了释放掉窗体所占用的内存,但是并没有回答:
    =================================================================================
       "我建的一个应用程序大概有15个窗口左右,全部是Delphi自己创建的,没有手动创建。也就是说,当程序一运行,系统就为这些Form分配内存了。但不明白的是地方是,比如在主窗口中用一个按钮事件调用其他Form时,系统使用的内存还要增加" ==================================================================================
    希望对这个问题做个解释???
      

  19.   

    他说的内存增加肯定是堆里的内存增加了,与窗口没有关系,你肯定在新窗口的create,很有可能是在formshow函数中, 有分配内存的地方
      

  20.   

    我试了一下,并没有楼主说的情况,刚开始显示另一个窗口的时候,内存是增加了一点。
    但把它关掉再打开,内存一点儿也没有变化,如是反复的做,内存也没有变化
    由此可以推断。楼主肯定是在你调用的窗口的onshow中创建了什么,又没有在窗口关闭的事件中释放掉内存,所以会造成这种情况。
    请楼主再检查一下代码。或者你自己再建一工程,什么都不要做,就只调出加一个窗口试试看。
      

  21.   

    显示中的窗口 占用的内存 比隐藏的窗口 多的多!因为Windows内部还要处理很多数据,自然需要内存。
    正常现象。
      

  22.   

    如果是窗体的说,还是建议用
    退出按钮中用:
    close在释放事件里用
    from1.release;
    from1:=nil;这样close时自动就释放了
      

  23.   

    from1.release;
    from1:=nil;
    这两句的效果不一样么??
    大家把你们建立窗体并释放的方法都写出来比较一下吧
      

  24.   

    建议你最好不要让delphi自动创建窗体,而改为手动创建。否则内存释放不干净的。
      

  25.   

    我得观点是这样的,的确,delphi为你分配了内存,但是当你的窗体onactive时才真正调用form的onpaint事件进行重画,不会因为你已经创建就画好。如果你试过C#,这个现象就更加明显。
      

  26.   

    我来总结一下DELPHI中所有的FORM和DM(数据)都可以自动或手工创建(例外 主FORM应该让他自动CREATE)
    在开发程序中 主FORM一般情况有两种选择:SDI MDI, 主要区别是SID的各个FORM位置是可任意的,MDI的子FORM的位置只能在主FORM的框架之内.
    除主FORM外,其它的FORM一般用两种方式CREATE和SHOW
    先说CREATE打开PROJECT SOURCE可以看到,所有由系统CREATE的FORM全在里面,而由用户CREATE的不在,
    所有由系统CREATE创建的FORM,如果是MDI,在关闭时是不会FREE的,只是最小化到MDI的框架下,
    在下次要用时用SHOW方法即可,要FREE的话用楼上一位和方法,用action:=cafree,就可以,不用自己用FREE的;.如果是SID,在关闭(指得是用户按下系统X)只是HIDE了,下次要用的话如果再自己用CREATE就多了,造成MEM泄漏,并且是无法修复的.要再用用就用SHOW/SHOWMODAL方法显示
    在用DELPHI设计程序时,建议数据模板(DM)让系统自动CREATE,什么原因不用说了吧.除主FORM外全自己CREATE和FREE;
    在这里,如果是自己创建,根据使用的显示方式不同,FREE的方式也不同
    如果是SHOWMODAL则如下form1 := Tform1.Create(Application);
    form1.ShowModal();
    form1.Free();//在此可直接FREE
    如果是SHOW方式
    则如下
    显示
    if (form1 = NIL) then //一般用ASSIGNED
       begin
        form1 := Tform1.Create(Application);
        form1.Show();    
       end
    else
        form1.Show();    
    //不能在创建的事件中FREE释放
    释放要在FORM的OnClose
    action:=cafree;其实如果要SHOW每个FORM前先检测FORM是否已CREATE则不管怎样也不会用MEM泄漏
      

  27.   

    楼上仁兄总结得不错,不过还有一点
    if not assigned(FormX) then   
       begin
       FormX:=TFormX.create(self);
       FormX.show;
       end;
    if (form1 = NIL) then //一般用ASSIGNED
       begin
        form1 := Tform1.Create(Application);
        form1.Show();
       end;
    第2种方式要比第1种好么?
      

  28.   

    当然不是好,因为FORM变量在没有CREATE始,有可能是不确定的,
    建议用assigned
      

  29.   

    补充,我说的不确定 是指可能不是NIL但肯定不是指向有用的FORM