谁来解答!(100分)

  • 主题发起人 主题发起人 xzs
  • 开始时间 开始时间
X

xzs

Unregistered / Unconfirmed
GUEST, unregistred user!
本人在使用Delphi时,经常见到如下的使用,但不知何意,以TForm为例:
1、Form.Create(Self);
2、Form.Create(Application);
3、Form.Create(Nil);
4、Form.Create;
5、Form.Create(Sender);
6、Form.Create(Handle);
请问以上各句的含义、作用及功能,各参数的含义、归属。
 
Create 是构造函数,对于不同的类型有不同的参数和作用.
一般来说,对于构件,参数给的是它的Owner属性,
即该构件会随着Owner的Destroy而Destroy.
Sender一般出现在事件里,表示发生事件的对象.
 
1、Form.Create(Self);
2、Form.Create(Application);
3、Form.Create(Nil);
4、Form.Create;
5、Form.Create(Sender);
6、Form.Create(Handle);
TForm继承自TComponent,而TComponent.Create的参数是它的Owner,Owner在自身Free之前负责free掉所有它拥有的Component,这样就避免作者自己写释放代码。
所以如果Form的类型是TTForm的话,1,2,3,5都是对的,4,6是错的。
1,2,3,5区别是Owner不同,Nil表示没有Owner,这时作者要自己注意在合适的地方
Free掉此Form.
 
1、Form.Create(Self);
从一个窗体生成一个子窗体
2、Form.Create(Application);
生成从属主程序的窗体
3、Form.Create(Nil);
生成独立窗体
4、Form.Create;
错,参数不正确
5、Form.Create(Sender);
窗口从属SENDER
6、Form.Create(Handle);
错,参数不正确
 
4、6在类的使用时好象有用到的,如
TEdit.Create;
TEdit.Create(handle);
 
我说一个都不对! Form是个什么?类?还是某个类实例?
如果是TForm,则连5也是错的,Sender是TObject,如果已知Sender是
TComponent或其后代,则应写成TForm(Sender as TComponent)才对!
 
嘿!嘿!
诸位,我不是让诸位来判断语句的对错,而是问象
****.Create(Self);
....
等都是用在和处?正确的使用方法如何?(我不看书,而是听你们诸位对此的理解)
功能及作用又是何解释,请切题讨论如何!?
 
一般来说,Create后面那个东西是owner,有点像parent,但是有些区别。1,2,3属
于这类,实际上是TComponent.create(aowner).(创建控件)
case owner of
self:意为创建它的控件负责解除(destroy);
nil:没有类可以解除它,须手工free;
application:指定application解除;
end;
4为某些类(tbitmap...)的创建时不需要参数。
5中的sender一般在共用事件句柄时使用,用来区分事件触发者。
6handle就是句柄啦,没有什么好解释的。
 
一般说来,Delphi类的构造方法在TComponent前是不用重载的,而
TComponent后如果在构造时需要初始化字段就必须重载构造方法(当然参
数也不能变,固定的是AOwner:TComponent)。这是因为每一个TComponent
类中都有一个子部件表,用来当该部件有所变化时通知子部件,包括以上
各位大虾所述的与释放有关的操作。这样很多的子部件构成一棵部件树,
牵一发可动全身。
TComponent有两级祖先,TPersistent和TObject,TPersistent与字段的
存贮有关,构造方法也基本上不用重载(TPersistent的后代例外),而
TObject根本就没有构造方法,无从重载,所以可以自己定义参数或者根本
没有参用数。这便是Create的参数可以千奇百怪的原因。
举几个例子:
TList.Create;
// inherited from TObject
TException.Create(const Msg: string);//inherited from TObject
TFont.Create;
// inherited from TPersistent
TTreeNode.Create(AOwner: TTreeNodes);//inherited from TPersistent;
TListItem.Create(AOwner: TListItems);//inherited from TPersistent;
TForm.Create(AOwner: TComponent);//inherited from TWinControl;
 
var
form: tform2;
...
Form.Create(Self);
Form.Create(Nil);
//差不多没有归属,都需要程序自己释放。
Form.Create(Application);
//不会比当前窗口低级,属于应用程序直属不需要程序专门释放
Form.Create(Sender);
//Sender是谁呀?总不能让一个按钮有一个子窗口吧?:)
 
我明白你的意思,关键是你举的例子不好.
并不限于窗口,任何VCL控件的创建均适于的.
这些Self ,nil ,Sender ,Handle,Application
就是说明你的控件的父级是谁,或是说你的控件在那
一级上创建.
Application:你的控件的父级是主程序,所以他的级别最高.
Self:你的控件的父级是当前窗口,他关闭你也关闭.
Sender:你的控件的父级是当前对象.
Handle:你的控件的父级是此句柄.
Nil:无定义.
 
在,看书时有如下语句:
Application.Create(TForm1.Form1);
它等于:
Form1 := TForm1.Create(Application);
这两句的含义、其归属情况,请详细解释一下如何?!
再者,对你所言能否给出实例详细解释、说明一下?!
各位也请发表你们的见解!
 
错!
1.Application.Create的结果是TApplication部件而不是TForm部件;
2.TForm1.Form1是什么意思?
看TApplication的CreateForm方法:
procedure CreateForm(FormClass: TFormClass;
var Reference);
FormClass是一个类型参数,Reference是实例。正确的用法是:
Application.CreateForm(TForm1, Form1) //过程方法没有返回值
等于
Form1 := TForm1.Create(Application) //构造函数有返回值
第二种写法可以用于下列用途:
with TForm1.Create(Application)do
try
...
Show;
//or ShowModal;
finally
Free;
end;
 
除了
Application.CreateForm(TForm1, Form1)
是否还有Application.Create???的用法吗?请说明,并解释其作用!
 
还有一个:
Application.CreateHandle;
作用是建立一个与Application.Handle不同的名柄作为副本给其它过程或使用.
 
多人接受答案了。
 
后退
顶部