1

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

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

我已经尝试过一些类似的东西......

if Assigned (TFrameA), then TFrameA.free; 

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

任何和所有的想法表示赞赏。

谢谢,

GS

4

2 回答 2

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;
于 2013-08-20T00:55:43.090 回答
2

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

析构函数是动态的,因此您不需要在释放它之前跟踪您拥有的框架类型,尽管其他考虑可能需要您使用 is 或 as 关键字检查类类型。

于 2013-08-20T00:52:55.840 回答