Delphi组件拥有者和Self父对象问题

  self是对本对象的引用,和C++的this是一样的,写任何类的方法(除了class方法外)时都可以访问它来得到当前对象本身,一般情况,引发事件的对象都是传递self作为事件的Sender参数的,那么,在事件的处理过程中,访问Sender就访问了发出此事件的那个对象。

  组件有拥有其他组件的性能。一个组件的拥有者是由它的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;  
  显然,你还可以针对这些组件执行更有意义的操作。这里只是简单地说明这一技术。 
  可以说:  
        //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是一样的。

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