【发布时间】:2017-10-04 20:22:50
【问题描述】:
两天前我对这个question给出了一个接受的答案(这是最困扰我的):
newtabsheet:=ttabsheet.Create(PageControl1);
NewTabSheet.PageControl := PageControl1;
newtabsheet.Caption:='tab1';
i1:=tabs.Count;
tabs.Add(newtabsheet);
我已经尽我所能分析了这段代码,这些就是我的结果。
第 1 行:我创建了一个 ttabsheet,以 pagecontrol1 作为父/所有者(基于下面的构造函数)。
constructor TTabSheet.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
Align := alClient;
ControlStyle := ControlStyle + [csAcceptsControls, csNoDesignVisible,
csParentBackground, csPannable];
Visible := False;
FTabVisible := True;
FHighlighted := False;
end;
然后我在变量Newtabsheet 中存储了对它的引用(此评论基于@David Heffernan 对one 我的问题的回答)。
第 2 行:我使用引用将 pagecontrol1 分配给属性 .pagecontrol。
这是设置方法的代码:
procedure TTabSheet.SetPageControl(APageControl: TPageControl);
begin
if FPageControl <> APageControl then
begin
if FPageControl <> nil then
FPageControl.RemovePage(Self);
Parent := APageControl;
if APageControl <> nil then
APageControl.InsertPage(Self);
end;
end;
基于此,我认为(可能是错误的)它将现有父级与新传递的参数进行比较,如果有不同,那么如果 parent<>nil 从以前的 pagecontrol 中删除此 newtabsheet(视觉影响)并将其分配给新的父/所有者,然后如果新的parent<>nil 将其插入新的pagecontrol(视觉效果)。
所以这行是不必要的(可能是错误的),因为我已经在第一行做了。
第 3 行:我使用引用将 tabsheet 的标题分配给 'tab1'。
第 5 行:我使用 add 方法在标签列表 tabs:TList<ttabsheet>; 中存储对 tabsheet 的引用。
这就是事情开始从我头顶飞过的地方。
我认为父/所有者是tabs,但pagecontrol1 仍在显示选项卡(基于对此question 的公认答案,更改父级视觉上会从pagecontrol1 中删除tabsheet) ,但事实并非如此。
现在这可能是错误的,但如果它只是一个参考,那么为什么当我通过执行 PageControl1.ActivePage.free 从 pagecontrol1 删除 tabsheet 时,tabs.count 保持不变。
如果我从标签中删除tabsheet,则pagecontrol1 上的tabsheet 不会被删除(视觉上删除)。
从question 我了解到泛型成为父/所有者,您无需担心从pagecontrol1 中释放tabsheet,因为选项卡是父级,您只需要将其从@987654354 中释放@。
我的问题:这段代码发生了什么,为什么我会遇到这种行为?
澄清
导致问题的原因是当我删除页面控件中的 ttabsheet 时,为什么当我尝试在列表中使用对它的引用时它没有引发错误,它们是两个不同的对象。
【问题讨论】:
-
通用列表对页面控件一无所知。它不会干扰父母或所有者的关系。不确定问题到底是什么。这么多代码摘录。
-
@DavidHeffernan 我的问题是为什么当我从列表中删除标签页时它没有从 pagecontrol1 中删除,反之亦然?。
-
为什么要这样?
tabs列表只是对标签页的并行引用。所有者(= 负责生命周期管理)是PageControl。 -
Owner负责在不再需要时释放对象。Parent为视觉控件提供了一个表面来呈现自己。Owner和Parent可以相同,但不必相同。对于PageControl(这是一个Windows 控件),PageControl属性会覆盖Parent属性,因此更改TTabSheet的Parent不会影响其可见性。您指的是另一个问题(在 LB1 和 LB2 之间移动列表项)。那是一个完全不同的问题。问题是关于 Firemonkey 和列表框,而不是 Microsoft PageControls。 -
@TomBrunberg 你能否解释一下,我的意思是当我从页面控件中删除选项卡时,为什么它没有从列表中删除。或者至少在使用引用时会出现一些错误。