在程序启动时,自动创建窗体和手动创建窗体有什么不同?
我有一个窗体,如果默认的情况下,在delphi中的项目中会有:
 application.createForm(TForm2,form2);
 application.run;我不想让他自己创建窗体,于是我把 application.createForm(TForm2,form2);
给删掉了,当然from2中有大量的业务逻辑,也有调用我自己写的函数,函数中有的参数传递的是vcl的对象。
在form1的一个按钮中,我写如下代码:
 var
 obj:TForm2;
 begin
   obj:=TForm2.create(self);
  obj.show;
end;在我执行form2种的一个查询时,出现03C........地址不能读。
我有把创建窗体的代码改称了如下: var
 obj:TForm2;
 begin
  application.createForm(TForm2,obj);   
  obj.show;
end;
还是同样的问题:
请问各位师兄,自动创建窗体和手动创建窗体有什么不同?application.createForm和TForm2.create有什么不同?end;

解决方案 »

  1.   

    Form2:=TForm2.Create(NIl);
    With Form2 do
      Try
        ShowModal;
      Finally
        Free;
        Form2:=Nil;
      End;
      

  2.   

    application.createForm(TForm2,obj);   
    還是用原來的
     application.createForm(TForm2,form2);去掉
     var
     obj:TForm2;
    聲明!應該就好了!估計你的代碼中用了Form2這個變量, 但你實例化的是 obj, 所以出錯
      

  3.   

    自动创建:肯定已经耗用了一些资源,你的窗体特别多的话,系统资源耗用也很大,但好多窗体又不经常用,所以才有手动创建,手动创建是在你需要的时候才创建,如果是不经常用的窗体,还是手动创建好,但像你的form2这些经常用的窗体,最好还是自动创建。去掉
     var
     obj:TForm2;
    这句是肯定的去掉了。
      

  4.   

    应该没什么不同的.
    var
      Form1:TForm;
    begin
      Form1:=TForm.Create(Application);
      Form.Show;
    end;
      

  5.   

    同意aiirii(ari-爱的眼睛) 的说法
      

  6.   

    自动创建的话,FORM类分配了地址的;
    引用以后,可以通过变量名直接访问;
    如果手动创建的话,在你调用CREATE给FORM分配内存前,是不能调用的;
    而且你CREATE 以后,自己要FREE,不然容易内存溢出;而且如 yq3woaini(hahhajing(一星奋斗中...)) 所说,窗口多的话,最好手动创建;不然程序启动慢,而且吃内存;
      

  7.   

    obj只是一个对象名字罢了,跟自动不自动有什么关系
    去掉var那样只是选择自动创建罢了
    跟楼主的问题一点关系都没有,
    人家问的是具体的实现细节的差异
    这里还有高人马?
      

  8.   

    TForm2.create(self)指定的Owner是Form1,application.createForm后Form2的Owner是Application,差别仅此而已。但是你的错误并不是由这个差别引起的,而可能是aiirii(ari-爱的眼睛)所说的原因
      

  9.   

    自动和手动创建的的窗体区别主要只有一个就是资源的占用和释放,其他的在具体使用时还体现一个变量作用域的问题。
    一般在情况下能够使用手动创建的尽量手动创建,这样可以节省系统资源,提升系统运行效率。
    你所提的这个问题,应该是出在两个方面:
    1:你既然用
    var
     obj:TForm2;
     begin
       obj:=TForm2.create(self);
      obj.show;
    end;这段代码创建窗体,那么首先应该将DELPHI的Project-》Options->Froms对话框中将窗口Form2从自动创建列表中移掉,然后将TForm2所在单元中有个
    var
     Form2 :TForm2;这句全局变量的声明也移调,而且应该将obj改为Form2.你的这个做法在理论上其实应该是通的过的,但是VCL有他自己的一些特征,不允许你这么做,除非你明确指定
    你所创建的obj上的所有可视化空间的属主和双亲。
    还有如果你用的是show的方法将这个窗体显示出来的话,你至少应该在这个窗体的OnClose事件中将传递近来的Action参数的值赋为caFree让此窗体在关闭之后自动销毁他所使用的一切资源,否则就会内存泄露了。
      

  10.   

    补充:如果你是直接删除application.createForm(TForm2,form2);这句的话就不用设置Project->Options->Forms项了
      

  11.   

    补充:如果你传递的参数中有VCL对象,你最好将参数声名为引用类型或着const类型
      

  12.   

    不一样,主要是createform会调用createhandle
      

  13.   

    自动创建的窗体在程序启动时就加载到内存里,手动创建的窗体在创建时才分配内存,手动创建和自动创建的窗体都需要释放,但大多数情况下自动创建的窗体我们都不去释放他,这样就可以直接FORM1.show;了。
      

  14.   

    楼主做的没错,主要是 obj不用声明了,在楼主的代码中,obj的作用域只在这个过程中有用,在其它过程中当然'访问非法地址了',不用声明obj,而是在FORM1中包含FORM2,这样FORM2就是一个全局变量了,用FORM2来作为TFORM2的变量,就一切OK
      

  15.   

    1. var
     obj:TForm2;
     begin
       obj:=TForm2.create(self);
      obj.show;
    end;2. var
     obj:TForm2;
     begin
       obj:=TForm2.create(nil);
      obj.show;
    end;3. var
     obj:TForm2;
     begin
       obj:=TForm2.create(Application);
      obj.show;
    end;建议使用第3种,这样最安全
      

  16.   

    很简单的东西怎么搞得这么复杂, aiirii(ari-爱的眼睛) 得方法就行。
      

  17.   

    在form1中的implements下面用uses unit2;
    这样的话,在unit2中的var form2:tform;后面声明的变量(implements和过程中声明的变量不算)
      

  18.   

    还有一种简单的手动创建窗体方法:
    例如Form1是主窗体,要手动创建Form2的话,就在Form1的按钮中填入:
    begin
    Form2 := TForm2.Create(Form1);
    form2.show;
    end;
    即可
      

  19.   

    补充:就我所知,在DELPHI中程序启动时自动创建的窗体不能超过80个,如果你有100多个窗体,全部自动创建,不仅浪费内存,而且在生成第80个窗体时会报错。
      

  20.   

    application.createForm(TForm2,obj);
    其实就是
    obj := TForm2.Create(Application);
    他们是同一个意思!
      

  21.   

    其实,自动创建是程序创建的,手动创建也是程序创建的。他们的不同就是,一个是delphi帮你自动写句话,自己创建呢,是自己写了一句话而已了!
      

  22.   

    不管是自动创建还是手动创建,都是要释放内存的。
    而且 Close 不等同与 Free ,所以最好是需要窗体的时候才 Create ,用完了就 Free 掉。否则,全部窗体都自动创建的话,程序启动的时候会变很慢,而且内存消耗很厉害,但是大部分内存空间都是闲置的。
      

  23.   

    var
     obj:TForm2;
    begin
       obj:=TForm2.create(nil);//这样看看呢?
       obj.show;
    end;我一般是这样的