关于Delphi中构造函数的概念(50分)

Z

ZWZERO

Unregistered / Unconfirmed
GUEST, unregistred user!
Delphi中要创建一个对象要执行构造函数才行吧,那对于新建窗体时自动生成的代码,究竟哪个是构造函数呢?是Application.CreateForm(TForm1, Form1);还是双击窗体空白处弹出的procedure TForm1.FormCreate(Sender: TObject);这两句代码作用上有什么区别?
各位高手,小弟是一新手,刚刚接触Delphi与面向对象编程概念还挺摸不着头脑的,忘大家不要见笑同时不吝赐教,先谢谢了
 
建议你去delphi盒子下本<<delphi 高手突破>> 在第90页有很详细的解释.
 
Application.CreateForm是Application对象的一个函数,这个函数将调用传送进来的两个参数,实际上是在CreateForm里面调用的默认Form的构造函数.这个问题很简单的.比如,Application.CreateForm(TForm1, Form1),实际上就是在CreateForm里面调用了Tform1.Create这个构造函数.
记住,所有对象的构造函数都是TObject.Create(其中TObject表示任何对象,这里用来举例说)
 
//记住,所有对象的构造函数都是TObject.Create
呵呵,此话有失偏颇,准确的说是:
TSomeObj = class(XXX)
...
constructor ThisIsAConstructorToo(YYY);
类在声明的时候由 constructor 指示字标识出来的才是构造器。只不过一般都是用的
Create 作为构造函数的名字,这只是一个约定俗成而已,并不是只能用 Create。
回楼主:
Application.CreateForm 和 TForm1.FormCreate 都不是构造器,对于构造器调用是在
Application.CreateForm 这个方法中进行的:Instance.Create(Self);
 
bata 说的对
Tform1.formCreate 不是构造器 ,它只是OnCreate方法的实现.
在TForm的构造器继承自父类TCustomForm
以下来自Forms 单元
constructor TCustomForm.Create(AOwner: TComponent);
begin
GlobalNameSpace.begin
Write;
try
CreateNew(AOwner);//构造窗体;
if (ClassType <> TForm) and not (csDesigning in ComponentState) then
begin
Include(FFormState, fsCreating);
try
if not InitInheritedComponent(Self, TForm) then
raise EResNotFound.CreateFmt(SResNotFound, [ClassName]);
finally
Exclude(FFormState, fsCreating);
end;
if OldCreateOrder then
do
Create;//注意! 在这里调用了DoCreate 过程;
end;
finally
GlobalNameSpace.EndWrite;
end;
end;

procedure TCustomForm.DoCreate;
begin
if Assigned(FOnCreate) then
try
FOnCreate(Self);//调用了OnCreate事件;
except
if not HandleCreateException then
raise;
end;
if fsVisible in FFormState then
Visible := True;
end;

constructor TCustomForm.CreateNew(AOwner: TComponent;
Dummy: Integer);
begin
inherited Create(AOwner);
ControlStyle := [csAcceptsControls, csCaptureMouse, csClickEvents,
csSetCaption, csDoubleClicks];
Left := 0;
Top := 0;
Width := 320;
Height := 240;
FIcon := TIcon.Create;
FIcon.Width := GetSystemMetrics(SM_CXSMICON);
FIcon.Height := GetSystemMetrics(SM_CYSMICON);
FIcon.OnChange := IconChanged;
FCanvas := TControlCanvas.Create;
FCanvas.Control := Self;
FBorderIcons := [biSystemMenu, biMinimize, biMaximize];
FBorderStyle := bsSizeable;
FWindowState := wsNormal;
FDefaultMonitor := dmActiveForm;
FInCMParentBiDiModeChanged := False;
FPixelsPerInch := Screen.PixelsPerInch;
FPrintScale := poProportional;
FloatingDockSiteClass := TWinControlClass(ClassType);
FAlphaBlendValue := 255;
FTransparentColorValue := 0;
Visible := False;
ParentColor := False;
ParentFont := False;
Ctl3D := True;
Screen.AddForm(Self);
FSnapBuffer := 10;
end;
在上面的你会发现FormCreate不是构造器,但它能把你的代码加入到构造过程中而不需要你
去重载构造器
 
如楼上。
看看事件的顺序吧。
consturct
oncreate
onshow
onactive
....
TForm1.FormCreate会是构造吗?
 
在dfm文件里有 TForm1.OnCreate = FormCreate,实现了oncreate和FormCreate的关联
 
顶部