窗体是一样的,父对象不一样,前者为application,后者Nil?我也搞不清楚有什么区别,反正能用就是了。实际上CreateForm调用的是Create方法!但是CreateForm会进行检查,如果没有主窗体,这个CreateForm的方法会把建立的这个窗体作为主窗体。

解决方案 »

  1.   

    看了这个我有点明白了....procedure TApplication.CreateForm(InstanceClass: TComponentClass; var Reference);
    var
      Instance: TComponent;
    begin
      Instance := TComponent(InstanceClass.NewInstance);
      TComponent(Reference) := Instance;
      try
        Instance.Create(Self);
      except
        TComponent(Reference) := nil;
        raise;
      end;
      if (FMainForm = nil) and (Instance is TForm) then
      begin
        TForm(Instance).HandleNeeded;
        FMainForm := TForm(Instance);
      end;
    end;
    有一点不明白,Create(nil)和Create(OtherCompenent)都能运做,在Create的时候传进去的
    参数究竟是做什么的呀?Create的时候给它Appliction 对象为参数又是什么意思呢?
      

  2.   

    constructor TComponent.Create(AOwner: TComponent);
    begin
      FComponentStyle := [csInheritable];
      if AOwner <> nil then AOwner.InsertComponent(Self);
    end;反向追踪到上面的代码,你应该知道,传入nil参数和其它的对象有什么区别了
      

  3.   

    那个参数指定要建立的Form的parent
      

  4.   

    谢谢ePing,还没有跟到这么深的地方。softdog,那运行时可以指定 .Parent := .... 又有什么区别呢?
      

  5.   

    这要弄清楚祖先窗体和父窗体的区别,当你创建一个应用程序是实际上创建了一个进程,主窗体是通过这个进程建立的。以后所有的非子窗体都是使用这个进程的,这些窗体的拥有者就是这个进程,也就是属于Application的。所以只要Application一退出,所有的后裔窗体都要关闭。同理使用同一个非子窗体A所创建的窗体B不一定是是其的子窗体,它也有可能是个非子窗体,但它的所有者是原来的非子窗体A,它是A的后裔窗体,A是它的祖先窗体,所以A关闭,B也要关闭。如果要成为A的子窗体,需要指定它的父窗体,即将它的Parent指向A,这样B就成了A的一部分。所以一般产生VCL控件时只是指明它的拥有着,即AOwner。