如何访问 TabItem 中的框架并将其删除
How to access a Frame inside TabItem and delete it
我有一个带有一些 TabItem 的 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
列表中删除,即从 拥有的组件列表 中删除。 它没有从子列表中删除,因此它在 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
。
我有一个带有一些 TabItem 的 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
列表中删除,即从 拥有的组件列表 中删除。 它没有从子列表中删除,因此它在 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
。