比如显示一个窗体
procedure TForm1.ToolButton1Click(Sender: TObject);
var
  vForm: TForm;
begin
  vForm := TForm2.Create(nil);//Create(self) 
  vForm.ShowModal;
  vForm.Free; 
end;Create(nil);要手动释放,怕忘记
Create(self)的话,要等TForm1关闭才释放
一般来说 用哪个好?

解决方案 »

  1.   

    看你具体什么情况呀,没有哪个一定好的说法。从节约系统资源的角度考虑的话,最好是Create(nil),用完了自己释放~
      

  2.   

    为什么要用TForm2.Create(nil);呢?
    默认
    procedure TForm1.ToolButton1Click(Sender: TObject);
    begin
      Form2.ShowModal;  这样也可以调用啊 为什么要TForm2.Create(nil);呢?
    end;是因为默认要把工程的自动创建窗体取消吗?
    不取消的话 这窗体是由application释放?
      

  3.   

    为什么要用TForm2.Create(nil);呢?直接Form2.ShowModal; 也可以啊
      

  4.   

    from1.create(nil) ;       //需要自己手动释放   
    from1.create(self); //由当前窗体(即Self)释放   
    from1.create(Application);    //由程序自动处理释放问题   
      

  5.   

    nil 是自己释放,self,是窗体释放,一般来说self方便,呵呵,因为你不用惦记着会出现内存泄漏的问题
      

  6.   


    引用4楼
    为什么要用TForm2.Create(nil);呢?
    直接Form2.ShowModal; 也可以啊 那是因为你的Form2是全局变量
    我正常是不用这个全局变量的,将其注释掉
    //var
    //  Form1: TForm1;用时使用局部变量
    先uses unit2;
    procedure TForm1.ToolButton1Click(Sender: TObject);
    var
      vForm: TForm2;
    begin
      vForm := TForm2.Create(nil);//或self或application;
      try  
        vForm.ShowModal;
      finally
        vForm.Free;
      end;  
    end;
      

  7.   


    1.因为你在新建窗体的时候,delphi会把该窗体加入到自动创建窗体列表里。所以你直接Form2.ShowModal也可以。这个时候窗体是有Application自动释放的,也就是程序退出的时候会自动释放资源;
    2.为什么要用TForm2.Create(nil);  因为可能会用不到该窗体!比如说一个大型的ERP系统,可能包含10几个甚至数十个窗体,如果都是自动创建的话,那就是说程序一启动就会自动创建这数十个窗体,这会影响系统启动速度,而且也没有必要,因为程序启动以后用户不一定会把这数十个窗体都打开看一下啊!这样就造成资源浪费了不是吗? 所以我们一般只需要自动创建主窗体,而其它窗体在需要的时候在创建,不需要的时候就释放掉~
      

  8.   


    创建用TForm2.Create(nil);
    但我不注释var Form2: TForm2;
    会影响效率吗?就是有全局变量var Form2: TForm2;
    会影响效率不?
      

  9.   

    效率和全部变量还是局部变量没关系,你再看看基础的书,再“深入”这个问题吧。
    总之你要效率好,你就不要让窗体自动创建,TForm2.Create(nil)用这个创建窗体,完了释放;
    你要怕忘记释放,你就让窗体自动创建,直接用就行了~
      

  10.   

    这个不是确定由谁来释放的问题,传入Self是把创建的Form2加入到Form1的管理中,这样你通过ComponentCount可以访问,加入到Application同理。另外Form1在释放的时候,如果Form2没有释放,VCL会自动帮你释放。建议参考《INSIDE VCL》的组件管理。
      

  11.   

    如果不必要,就不要SELF,还是用NIL好,这是个效率问题,传SELF,会回溯到顶层祖宗那