如何释放动态创建的帧?

时间:2013-08-20 00:46:54

标签: delphi tframe

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

我是否创建了一个显示前一个TFrame的TYPE的变量?删除TFrame的正确方法是什么?是TFrame.Free吗?请记住,我可能需要创建框架A,自由框架A,创建框架B,自由框架B,创建框架A(再次)等...

我尝试了一些......

if Assigned (TFrameA), then TFrameA.free; 

虽然这似乎有效,但这会导致奇怪的行为(导致按钮消失)。这也意味着我需要将所有5种类型的TFrame定义为全局变量。

任何和所有的想法都赞赏。

谢谢,

GS

2 个答案:

答案 0 :(得分:6)

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

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

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

procedure TMyForm.TreeView1Change(Sender: TObject);
begin
  if CurrentFrame <> nil then
  begin
    CurrentFrame.Parent := nil;
    CurrentFrame := nil;
  end;

  if Frames[OneOfTheIndexes] = nil then
    Frames[OneOfTheIndexes] := TAppropriateFrameType.Create(Self);

  Frames[OneOfTheIndexes].Parent := Panel1;
  CurrentFrame := Frames[OneOfTheIndexes];
end;

如果你想重新创建帧,那么只需删除数组并Free()当前帧,然后再显示一个:

private
  CurrentFrame: TFrame;

procedure TMyForm.TreeView1Change(Sender: TObject);
begin
  if CurrentFrame <> nil then
    FreeAndNil(CurrentFrame);

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

答案 1 :(得分:2)

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

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

相关问题