代碼如下﹕
procedure TForm1.Button1Click(Sender: TObject);
var
   edit:tedit;
begin
   //edit := tedit.Create(nil);        //1
   //edit := tedit.Create(self);       //2
   //edit := tedit.Create(application);//3
   //edit := tedit.Create(form1);      //4
   edit.Parent := form1;
   edit.Visible := true;
end;
我用1﹑2﹑3﹑4中的任一一行都得到相同的結果﹐那請問一下﹐它們有什么區別。也是一個剛學D的同事問我﹐我不知道怎么回答﹐大家給我指點一下好嗎

解决方案 »

  1.   

    组件有拥有其他组件的性能。一个组件的拥有者是由它的Owner属性指定的。如果一个组件拥有其他组件,则当它被析构时,它负责释放它拥有的组件。通常,窗口拥有在它上面出现的所有组件。
    如果你在窗口设计时把组件放置在窗口上,窗口将自动成为组件的拥有者。当你在运行期间创建一个组件时,必须向组件的Create构造器传递组件的拥有关系;它被设置为新组件的Owner属性。下面一行
    语句表示了如何向TButton.Create( )构造器传递窗口隐含的参数Self。这样使窗口成为新创建组件的拥有者:
    Mybutton:=TButton.create(self);
    当窗口被析构时,与MyButton有关的TButton实例也会被析构。这是在VCL内部处理的。实质上,窗口再次通过Components数组属性遍历组件并析构它们。
    通过传递nil给组件的Create()方法,可以创建一个不具备拥有者的组件。不过,如果这样做了,编程时你需要负责组件的删除。下列代码显示了这个技术:
    Mytable:=TTable.create(nil)
    try
    ....
    finally
    Mytable.free;
    end;
    要使用这个技术,应当用一个try. . . finally块来确保出现异常时释放所分配的资源。你不应使用这个技术,除非特殊情况—不能给组件指定拥有者。
    另一个有关拥有关系的属性是Components属性。Components属性是一个数组属性,包含一个组件所拥有的全部组件的列表。例如,要遍历一个窗口的所有组件以显示它们的类名称,需要执行下列代码:
    var 
    i:integer;
    begin
    for i:=0 to ComponentCount-1 do
    showmessage(Components[i].classname);
    end;
    显然,你还可以针对这些组件执行更有意义的操作。这里只是简单地说明这一技术。
      

  2.   

    2和3基本没有区别。
    self表示创建的控件属于他所在的单元,应该是form1了
    application指的是应用程序,在你这里估计也是form1
    而nil主要是指空的,及需要付值*个人意见,仅供参考*
      

  3.   

    可以说:
       //edit := tedit.Create(nil);        //edit没有拥有者
       //edit := tedit.Create(self);       //edit的拥有者是edit所在的form
       //edit := tedit.Create(application);//edit的拥有者是application,
       //edit := tedit.Create(form1);      //edit的拥有者是form1,如果edit在form1上,和传递self是一样的。
      

  4.   

    赞同 linuxyf 观点! 楼主应该看看 DDG
      

  5.   

    Owner参数负责被创建对象的内存释放edit := tedit.Create(nil);        //不指定拥有者,但程序结束的时候进程空间都没有了,肯定这个Edit也没有了,呵呵....
    edit := tedit.Create(self);       //Self就是Edit所在窗体
    edit := tedit.Create(application);//指定有程序释放,其实不指定也一样
    edit := tedit.Create(form1);      //和2完全一样,只不过一个用了隐含参数而已
      

  6.   

    申明一下,所有者关系(Owner)和父子关系(Parent)是两个不同的概念,一个组件的父组件不一定是它的所有者,反之亦然;
      

  7.   

    to linuxyf(率人)://edit := tedit.Create(self);       //edit的拥有者是edit所在的form“拥有者”是什么意思,是不是说可以省略 edit.Parent := form1;但省略却是不行的,怎么讲
      

  8.   

    不要把父子关系与拥有关系混淆起来。组件可以是其他组件的父,但只有窗口组件(例如
    TWinControl的派生物)才能成为其他组件的父。父组件负责调用子组件的方法来绘出子组件。一个组件的父是通过它的Parent属性指定的。
    一个组件的父不必一定是这个组件的拥有者。对于组件来说,它有不同的父和拥有者是合法的。