Create(AOwner: TComponent); ( 积分: 50 )

  • 主题发起人 主题发起人 siking
  • 开始时间 开始时间
S

siking

Unregistered / Unconfirmed
GUEST, unregistred user!
是不是这样子呀:
Create(AOwner: TComponent);中如果AOwner不是nil,那么AOwner释放,create出来的对象也会跟着释放,如
frm2:=Tfrm2.Create(frm1);
.....
FreeAndNil(frm1);
frm2会随frm1的释放而释放?????
 
那是个什么原理啊?
 
Delphi中 所有者(Owner)对象在释放时能自动 Free掉 其所有的 子对象...
 
constructor TComponent.Create(AOwner: TComponent);
begin
FComponentStyle := [csInheritable];
if AOwner <> nil then AOwner.InsertComponent(Self);//这里放把TComponent进去
end;

destructor TComponent.Destroy;
begin
Destroying;
if FFreeNotifies <> nil then
begin
while Assigned(FFreeNotifies) and (FFreeNotifies.Count > 0) do
TComponent(FFreeNotifies[FFreeNotifies.Count - 1]).Notification(Self, opRemove);
FreeAndNil(FFreeNotifies);
end;
DestroyComponents;//注意这里
if FOwner <> nil then FOwner.RemoveComponent(Self);
inherited Destroy;
end;
//释放被放进来的TComponent
procedure TComponent.DestroyComponents;
var
Instance: TComponent;
begin
while FComponents <> nil do
begin
Instance := FComponents.Last;
if (csFreeNotification in Instance.FComponentState)
or (FComponentState * [csDesigning, csInline] = [csDesigning, csInline]) then
RemoveComponent(Instance)
else
Remove(Instance);
Instance.Destroy;
end;
end;

//是不是这样子呀
 
procedure TForm1.Button1Click(Sender: TObject);
begin
Form2:=TForm2.Create(nil);
Form3:=TForm3.Create(Form2);//Form3的Owner是Form2
end;
procedure TForm1.Button3Click(Sender: TObject);
begin
if Assigned(Form2) then
FreeAndNil(Form2);//释放Form2,这时Form3也释放了
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
ShowMessage(Form3.Edit1.Text);//释放Form2后再访问Form3,无内容了
end;
 
顺便请教一下,如何写自己的控件,例如,从delphi的什么地方开始创建,怎么生成,怎么运行,怎么打包等,各位富翁们大体介绍一下,本人刚接触写控件的概念,还没有开始写,不知从什么地方如手。
 
后退
顶部