Delphi 如何释放动态创建的帧?

Delphi 如何释放动态创建的帧?,delphi,tframe,Delphi,Tframe,在Delphi 2010中。。。我有一张表格。表单的左侧是一个树状视图。它显示了一个多级层次结构。假设5种不同类型的数据,类型A、B、C、D和E。在表单的右侧,我有一个面板,我将在其中创建一个TFrame。如果我在树视图中单击类型为“a”的数据元素,我会在表单右侧创建一个显示TFrame“a”的TFrame。基本上,我展示了我的树视图的各种层次结构的细节。5种数据类型中的每一种都使用不同类型的TFrame。虽然我可以动态创建TFrame,但我很难知道在何处以及如何删除/释放TFrame 我是否创

在Delphi 2010中。。。我有一张表格。表单的左侧是一个树状视图。它显示了一个多级层次结构。假设5种不同类型的数据,类型A、B、C、D和E。在表单的右侧,我有一个面板,我将在其中创建一个TFrame。如果我在树视图中单击类型为“a”的数据元素,我会在表单右侧创建一个显示TFrame“a”的TFrame。基本上,我展示了我的树视图的各种层次结构的细节。5种数据类型中的每一种都使用不同类型的TFrame。虽然我可以动态创建TFrame,但我很难知道在何处以及如何删除/释放TFrame

我是否创建了一个显示上一个TFrame类型的变量?删除TFrame的正确方法是什么?有TFrame吗?免费的?请记住,我可能需要像创建帧A、自由帧A、创建帧B、自由帧B、再次创建帧A之类的内容

我试过一些类似于

if Assigned (TFrameA), then TFrameA.free; 
虽然这看起来是可行的,但这会导致奇怪的行为——它导致一个按钮消失。这还意味着我需要将所有5种类型的TFrame定义为全局变量

感谢您的任何想法

谢谢


GS

根据用户界面和数据设置,您只需在表单中保留对活动框架的引用,并在创建新框架之前释放该引用


析构函数是动态的,因此在释放它之前不需要跟踪所拥有的帧的类型,尽管其他注意事项可能要求您使用is或as关键字检查类类型

根据您的UI和数据设置,您只需在表单中保留对活动框架的引用,并在创建新框架之前释放该引用

析构函数是动态的,因此在释放它之前不需要跟踪所拥有的帧的类型,尽管其他注意事项可能要求您使用is或as关键字检查类类型

保留一个TFrame变量,以便知道当前显示的帧是什么。显示其他帧时,可以先释放/缓存当前帧

如果要缓存帧,请保留五个单独的TFrame变量,每种页面类型一个。当您需要显示页面时,仅当您尚未这样做时才创建页面:

private
  CurrentFrame: TFrame;
  Frames: array[0..4] of TFrame;
保留一个TFrame变量,以便知道当前显示的帧是什么。显示其他帧时,可以先释放/缓存当前帧

如果要缓存帧,请保留五个单独的TFrame变量,每种页面类型一个。当您需要显示页面时,仅当您尚未这样做时才创建页面:

private
  CurrentFrame: TFrame;
  Frames: array[0..4] of TFrame;

如果你要测试指定的,你还必须“nil”引用。意见提醒:我强烈建议使用表单而不是框架——正是出于这个原因。表单比框架更容易控制。您可能无法使用子窗体轻松地设计主窗体,但您仍然可以在自己的窗口中设计子窗体或框架,并使业务规则更容易封装在单独的单元中,而不是一个整体。@Jerry我不明白。我看不出这两个选项在编程的容易程度上有什么不同。如果你要测试指定的,你还必须“nil”引用。意见提醒:我强烈建议使用表单而不是框架——正是出于这个原因。表单比框架更容易控制。您可能无法使用子窗体轻松地设计主窗体,但您仍然可以在自己的窗口中设计子窗体或框架,并使业务规则更容易封装在单独的单元中,而不是一个整体。@Jerry我不明白。在最后的代码块中,我看不出这两个选项+1在编程容易程度上有任何区别,if是多余的,只是在自由代码块中重复相同的测试+1,if是多余的,只是在自由代码块中重复相同的测试
private
  CurrentFrame: TFrame;
procedure TMyForm.TreeView1Change(Sender: TObject);
begin
  if CurrentFrame <> nil then
    FreeAndNil(CurrentFrame);

  CurrentFrame := TAppropriateFrameType.Create(Self);
  CurrentFrame.Parent := Panel1;
end;