Owner、Parent、Self、Sender

来源:互联网 发布:网络金融是什么 编辑:程序博客网 时间:2024/04/30 05:03

OwnerParent的区别
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,而如果把第6句改为Button.parent:=self;按Button2时,将在Form1上创建一个Button了。如果将第6句删除,按Button2时,什么都不会发生,这是因为创建方法无法知道应在哪里显示构件。 
  Owner属性是指构件的所有者,它负责构件的创建和释放。如在上例中,系统默认窗体上所有构件的所有者是窗体,而窗体的所有者是Application。顺便指出,create方法应带有表示构件所有者的参数,如在上例中,构件所有者是窗体,即self。 
  Parent属性和Owner属性是运行阶段的属性,只能在运行阶段,通过代码设置。


SelfSender的区别
  在事件处理程序参数表中,至少含有一个参数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;  

-----------------------------------------------------
Sender,Self,Owner,parent 
-----------------------------------------------------
Sender--意义:指本对象。Sender在什么对象相关代码里,那么Sender就是什么。
Self--意义:指本类,也就是Self被引用的类。比如若在类TMyClass内引用了Self,那么Self=TMyClass.
Owner--意义:哪个对象释放我的内存啊?

如:Pan:=TPanel.Create(Self);其中Create的参数是:AOwner:TComponent。Owner释放Pan的内存。因为窗口释放Pan的内存,但窗口类的对象是Self.一般给Owner传Self就可以。
比如:
代码段一:
pan:=TPanel.Create(Self);
with Pan do begin
try
Left:=20;
Top:=20;
parent:=Self; //Parent:=Form1也可以。
Visible:=true;
ShowMessage('Created');
finally
Pan.free;
end;
end;
-----------------------------------------------------
Parent--
意义:此对象包括在哪个对象里那?
说明:若组件不是从TControl继承来的,那么在创建组件后不必声明此属性。

parent 与owner的含义区别及举例


=================================================================
{ 单元文件名称: Unit1
开发人员名称: tulater
编写日期: 25-八月-2005
单元功能:
parent即 养父
是指拥有该组件的父类,即parent组件必定是一个窗口控制组件(Windowed control) 由于组件就是容纳该组件的父类,因此当父类移动时,附着其内的组件也会移动.
Object TreeVIew 里表示的就是这种关系.
修改历史:
-----------------------------------------------------------------------------}
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
TForm1 = class(TForm)
GroupBox1: TGroupBox;
Button1: TButton;
Button2: TButton;
Button3: TButton;
Button4: TButton;
Button5: TButton;
procedure Button5Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Button4Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

uses Unit2;

VAR
PB: boolean;
{$R *.dfm}

procedure TForm1.Button5Click(Sender: TObject);
begin
Form2.show
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
GroupBox1.Top := GroupBox1.Top - 10;
end;

procedure TForm1.Button4Click(Sender: TObject);
begin
if PB then
BEGIN
Button2.Parent := Form2;
PB := false;
END
else
BEGIN
Button2.Parent := Form1.GroupBox1;
PB := true;
END;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
Pb := false;
end;

end.
=================================================================
{-----------------------------------------------------------------------------
单元文件名称: Unit1
开发人员名称: tulater
编写日期: 25-八月-2005
单元功能:
Owner  生父 
何谓 Owner?就组件而言 , Owner是指作为其他组件的Owner的父组件,在负责自身 析构时,一起析构它所拥有的其下所Own 的组件,也就是于此时释放它自己与它所拥有 组件所占的内存.
修改历史:
-----------------------------------------------------------------------------}
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
TForm1 = class(TForm)
Edit1: TEdit;
Button1: TButton;
Button2: TButton;
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation
uses
unit2;
{$R *.dfm}

procedure TForm1.Button2Click(Sender: TObject);
begin
Form2.show
end;

end.
=================================================================

 

0 0