Delphi中八个易混淆的概念 ● Owner VS Parent Parent属性是指构件的包容器，构件只能在此范围内显示和移动。举例子如下： (1)在Form1的窗体上，放一个Panel1，并将Panel1拉大； (2)在Panel1上放一Button1；
(3)在Form1上放一Button2。
现在如果移动Panel1，则Button1随着Panel1移动。这是因为Button1的Parent是Panel1。现在将Button2移到Panel1上，再次移动Panel1，Button2并不跟着移动，这是因为Button2的Parent是Form1。除在窗体设计中，应注意构件的Parent是谁外，在动态创建构件时，也应指出构件的Parent，如在上例中继续操作：
Procedure Tform1.Button2click(Sender:Tobjet);
Var
Button:Tbutton;
Begin
Button:Tbutton.cerate(self);
Button.parent=panel1;
Button.lleft=0;
Button.top=0;
Button.caption:='OK';
End；
当按Button2时，将在Panel1上创建一个Button，而如果把Button.parent=panel1; 改为Button.parent:=self；按Button2时，将在Form1上创建一个Button了。如果将该句删除，按Button2时，什么都不会发生，这是因为创建方法无法知道应在哪里显示构件。
Owner属性是指控件的所有者，它负责构件的创建和释放。如在上例中，系统默认Form上所有控件的所有者是窗体，而窗体的所有者是Application。顺便指出，create方法应带有表示控件所有者的参数，如在上例中，控件所有者是窗体，即self。
Parent属性和Owner属性是运行阶段的属性，只能在运行阶段，通过代码设置。

● Self VS Sender

在事件处理程序参数表中，至少含有一个参数Sender，它代表触发事件处理程序的构件，如在上例中，Sender就指Button2，有了Sender参数，可以使多个控件共用相同的事件处理程序，如下例：

Procedure Tform1.Buttonclick(Sender:Tobject);
Begin
If sender=button1 then
Label1.caption:='天龙盖地虎'
Else Label2.caption:='宝塔镇河妖'
End；
在此例中，Button1，Button2共用了Buttonclick事件处理程序。
Self是指所编的程序范围是在哪一个类中，Delphi中大都在窗体范围内编程，因此，Self即指窗体。如果编写一个类或是一个组件，则Self指该类或组件。我们在函数或过程的声明中可看出Self是代表哪个组件，即Self代表"."号之前的组件，如在第一个例子中，Self代表Tform1。另外应注意，Self只能用在类方法中，而不能用在过程或函数中，如下例用法是错的:
Function a1(B:Integer):Integer;
Begin
……
Button:=tbutton.create(self)；……
End；

● Clientheight和Height、Clientwidth和Width的区别：

对于一般的控件而言，Height就是Clientheight，Width就是Clientwidth，而对于Form而言，Height是包括标题条在内的高度，而Clientheight是指窗体工作区的高度。同理，Clientwidth是指定窗体工作区的宽度。

(陈盛陆)