form.parent:=panel;
-----------------------------
实际上是form调用panel中的方法,将自己加到它的子控件列表中。
看看VCL源码就清楚了:
procedure TControl.SetParent(AParent: TWinControl);
begin
if FParent <> AParent then
begin
if AParent = Self then // 不允许自己成为自己的Parent
raise EInvalidOperation.CreateRes(@SControlParentSetToSelf);
// 设Parent则从FParent的列表中删除自己
if FParent <> nil then
FParent.RemoveControl(Self);
// 将自己添加到FParent的子控件列表中
if AParent <> nil then
begin
AParent.InsertControl(Self);
UpdateAnchorRules;
end;
end;
end;
// TWinControl中的过程
procedure TWinControl.InsertControl(AControl: TControl);
begin
AControl.ValidateContainer(Self);
Perform(CM_CONTROLLISTCHANGE, Integer(AControl), Integer(True));
// 加到列表中
Insert(AControl);
// 如果当前不是在“正在读取”状态
if not (csReading in AControl.ComponentState) then
begin
// 让控件重新显示
AControl.Perform(CM_PARENTCOLORCHANGED, 0, 0)
// 颜色变化
AControl.Perform(CM_PARENTFONTCHANGED, 0, 0)
// 字体变化
AControl.Perform(CM_PARENTSHOWHINTCHANGED, 0, 0)
// 提示信息变化
AControl.Perform(CM_PARENTBIDIMODECHANGED, 0, 0)
// 文字显示方式变化
// 让控件重新进行显示
if AControl is TWinControl then
begin
AControl.Perform(CM_PARENTCTL3DCHANGED, 0, 0);
UpdateControlState;
end else
if HandleAllocated then AControl.Invalidate;
// 应用子控件的Align属性
AlignControl(AControl);
end;
Perform(CM_CONTROLCHANGE, Integer(AControl), Integer(True));
end;