TComponent构造函数的问题?(70分)

  • 主题发起人 主题发起人 everhappy
  • 开始时间 开始时间
E

everhappy

Unregistered / Unconfirmed
GUEST, unregistred user!
constructor TComponent.Create(AOwner: TComponent);
begin
FComponentStyle := [csInheritable];
if AOwner <> nil then AOwner.InsertComponent(Self);
end;
照这个构造函数TComponent只是建立了一个指针变量,InsertComponent也只是将指针添加到owner的TList中.那内存块的申请又是在什么地方完成的?这样一个只有指向类的指针能用吗?
 
在正式调用Create之前,该类的NewInstance函数会首先被自动调用以为对象实例分配内
存(具体大小就是该类的InstanceSize)。

Delphi Help:
All constructors call NewInstance automatically. NewInstance calls
InstanceSize to determine how much memory to allocate from the heap to contain
a particular instance. Do not call NewInstance directly.
 
zy 真专业..呵呵.
 
Delphi 帮助:
  所有构造函数自动调用NewInstance,NewInstance调用InstanceSize来决定在堆上为对象分配多少内存,不要直接调用NewInstance
 
FComponentStyle := [csInheritable];[]是什么语法啊
 
procedure TApplication.CreateForm(InstanceClass: TComponentClass
var Reference);
var
Instance: TComponent;
begin
Instance := TComponent(InstanceClass.NewInstance);
TComponent(Reference) := Instance;
说的是在这里吗?
这么说好像从TComponent继承的类也只有通过NewInstance才能生成实例了?
这里不懂,还是请指点一下:)
 
这是工厂方法模式,目的是用指定的类模板创建一个实例,并由指定的引用保管
个人认为这两句可以用一句代替:
Reference:= InstanceClass.Create(nil);

从TComponent继承的类也通常也是通过Create函数生成实例的
如 btn1:= TButton.Create(self)
 
NewInstance在绝大多数情况下都是被编译器自动调用的,你在Create那一行设定断点,
进入汇编级跟踪看看就知道了。

更加详细的讨论,请看:
http://www.delphibbs.com/delphibbs/dispq.asp?lid=2175263
http://www.delphibbs.com/delphibbs/dispq.asp?lid=2390131
 
多人接受答案了。
 
后退
顶部