在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
答案 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关键字检查类类型。