delphi - 如何访问 TabItem 内的 Frame 并将其删除
问题描述
我有一个带有一些 TabItems 的 TabControl。其中之一是动态填充帧。
var
item: TListBoxItem;
currentFrame: TFrame;
frameIndex: integer;
begin
if Sender is TListBoxItem then
item:= TListBoxItem(Sender)
else
Exit;
FindAndDeleteItemContext;
frameIndex:= GetFrameIndexByText(item);
{factory}
FFramesFactory:= TFramesFactory.DefaultFactory;
{new frame}
currentFrame:= FFramesFactory.GetFrame(frameIndex);
{add to layout}
currentFrame.Parent:= TabItemContent;
currentFrame.Align:= TAlignLayout.Client;
// TabItemContent.AddObject(currentFrame);
TabItemContent.InsertComponent(currentFrame);
{open tab}
ActionToContentTabExecute(Sender);
end;
在 FFramesFactory 中,帧以下列方式生成:
TFrame_Map.Create(nil)
在添加新框架之前,我想查找并删除旧框架而不将其释放到内存中。
procedure Txxx.FindAndDeleteItemContext;
var
i: Integer;
begin
for i:= 0 to Pred(TabItemContent.ComponentCount) do
begin
if TabItemContent.Components[i] is TFrame then
begin
TabItemContent.RemoveComponent(TabItemContent.Components[i]);
Exit;
end;
end;
end;
但这是行不通的。我可以找到框架,但无法删除它,并且我可以在 tabitem 中看到两个框架。
我怎样才能删除找到的框架?
先感谢您。
解决方案
当您使用 删除一个组件时TabItemContent.RemoveComponent()
,您将其从Components
列表中删除,iow从拥有的组件列表中删除。它不会从子列表中删除,因此它在 上仍然可见TabItemContent
。
由于您想将其保留在内存中并且仅将其从视觉上删除TabItemContent
,因此您需要将其父级设置为nil
:
for i:= 0 to Pred(TabItemContent.ComponentCount) do
begin
if TabItemContent.Components[i] is TFrame4 then
begin
TControl(TabItemContent.Components[i]).Parent := nil; // remove visually
// TabItemContent.RemoveComponent(TabItemContent.Components[i]); // remove from ownership
// TabItemContent.Components[i].DisposeOf;
Exit;
end;
end;
如果你想释放它,你应该调用DisposeOf
.
推荐阅读
- node.js - 我可以在 Dialogflow Node.js 中使用 SHA-224 加密吗?
- android - 如何解决以下问题?
- python - 请使用返回响应代码 503 的请求模块清除我对此 python 代码的查询
- javascript - React Native - 无法在屏幕上呈现来自 API 的数据
- java - ZoneId 欧洲/柏林 NullPointerException
- conv-neural-network - 在 resnet18 中将输入通道从 3 更改为 1
- angular - 无法以角度读取 null 的属性“valideDate”
- reactjs - 在 Web 应用程序内的 Excel 中编辑/保存和填充图表
- node.js - npm 更新和对等依赖的问题
- vb.net - 如何在 vb .NET 中获得两次之间的持续时间