Delphi:帧的TList问题

时间:2011-01-10 16:30:56

标签: delphi frames tlist

我在TScrollBox中包含多个帧(通常为25个)的接口出现问题。

有两个问题,我希望一个是另一个的结果......

背景

当应用程序启动时,我创建了25个帧,每个帧包含大约。 20个控件,然后使用默认信息填充。然后,用户可以单击控件以将搜索限制为信息的子集,此时我可以释放并重新创建我的帧(因为搜索可以返回< 25条记录)

问题:

如果我在初始搜索后退出应用程序,则需要大约5秒钟返回Delphi。在第二次搜索(并处置/重新创建框架)之后,它需要大约。 20秒)

虽然我可以将应用程序重写为仅创建一次框架,但我想了解发生了什么。

这是我的创建例程:

procedure TMF.CreateFrame(i: Integer; var FrameBottom: Integer);
var
   NewFrame: TSF;
begin
   NewFrame := TSF.Create(Self);
   NewFrame.Name := 'SF' + IntToStr(i);
   if i = 0 then
      NewSF.Top := 8
   else
      NewSF.Top := FrameBottom + 8;
   FrameBottom := NewFrame.Top + NewFrame.Height;
   NewFrame.Parent := ScrollBox1;
   FrameList.Add(NewFrame);
end;

这是我的删除程序:

procedure TMF.ClearFrames;
var
   i: Integer;
   SF: TSF;
begin
   for i := 0 to MF.FrameList.Count -1  do
   begin
      SF := FrameList[i];
      SF.Free;
   end;
   FrameList.Clear;
end;

我错过了什么?

2 个答案:

答案 0 :(得分:1)

如果您想知道为什么您的应用需要花费很长时间才能执行某些操作,请尝试对其进行分析。尝试针对您的计划运行Sampling Profiler。帮助文件说明了如何将分析限制为仅限应用程序的特定部分,您可以使用该部分仅在清算或创建部件上获取采样结果。这应该会告诉你实际花费大部分时间的地方,并从中汲取大量猜测。

答案 1 :(得分:1)

由于您正在通过释放它们来控制正在创建的帧的内存分配,因此不需要在创建构造函数中提供Self作为owner参数。传递nil以防止所有者试图释放框架。

另外,不喜欢ClearFrames例程的外观。试试这个:

while FrameList.count > 0 do
begin
    TSF(Framelist[0]).free;
    Framelist.delete(0);
end;
Framelist.clear;