首页 > 解决方案 > 如何访问 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 中看到两个框架。

我怎样才能删除找到的框架?

先感谢您。

标签: delphifiremonkeytabcontrol

解决方案


当您使用 删除一个组件时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.


推荐阅读