unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls;
type
TForm1 = class(TForm)
btn2: TButton;
pnl1: TPanel;
procedure btn2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.btn2Click(Sender: TObject);
var
Mybutton: TButton;
begin
with Mybutton do
begin
TButton.Create(Self); //系统默认窗体上所有控件的所有者都是窗体。
//TButton.Create(form1); //意义与Self一样。
//TButton.Create(nil); //不指出所有者
Parent := pnl1; //Parent属性是指构件的包容器,构件只能在此范围内显示和移动
Caption := 'Test';
Left := 0;
Top := 0;
end;
end;
end.
Parent属性是指构件的包容器,构件只能在此范围内显示和移动。在窗体设计中,应注意构件的 Parent是谁外,在动态创建构件时,也应指出构件的Parent:
1)Procedure Tform1.Button2click(Sender:Tobjet);
2)Var
3) Button:Tbutton;
4) Begin
5) Button:Tbutton.cerate(self);
6) Button.parent=panel1;
7) Button.lleft=0;
8) Button.top=0;
9) Button.caption:='OK';
10) End;
当按Button2时,将在Panel1上创建一个Button,而如果把第6句改为Button.parent:=self;按Button2时,将在Form1上创建一个Button了。如果将第6句删除,按Button2时,什么都不会发生,这是因为创建方法无法知道应在哪里显示构件。
Owner属性是指构件的所有者,它负责构件的创建和释放。如在上例中,系统默认窗体上所有构件的所有者是窗体,而窗体的所有者是Application。顺便指出,create方法应带有表示构件所有者的参数,如在上例中,构件所有者是窗体,即self。
Parent属性和Owner属性是运行阶段的属性,只能在运行阶段,通过代码设置。
//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是一样的
三、Clientheight和Height,Clientwidth和Width的区别:
对于一般的构件而言,Height就是Clientheight,Width就是Clientwidth,而对于窗体而言,Height是包括标题条在内的高度,而Clientheight是指窗体工作区的高度。同理,Clientwidth是指定窗体工作区的宽度。