2011-01-10 50 views
1

我遇到了TScrollBox内由多个框架(通常为25)组成的界面的问题。德尔福:框架的TList的问题

有2个问题,我希望其中一个是另一个的后果......

背景:

当应用程序启动时,我创建了25帧,每片含约。 20个控件,然后填充默认信息。然后,用户可以点击一个控制来限制搜索到的在我释放这点信息的一个子集,并重新创建我的帧(如搜索可能返回< 25条记录)

问题:

如果我在初次搜索后退出了应用程序,然后大约需要。 5秒钟后返回德尔福。第二次搜索后(和处理/重新创建帧)大约需要。 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; 

我缺少什么?

+0

FrameList是什么类型的?顺便说一下,在ClearFrame中,你指的是for循环中的MF.Framelist。在这里看起来不正确。 – 2011-01-10 17:08:24

+0

Framelist是在TMF主窗体的公共部分中声明的TList。 ClearFrames中的MF是多余的,但它本身不应该引起任何问题?更多皮带和大括号... – 2011-01-10 17:12:10

回答

1

当您正在控制您通过Free'ing创建的Frame的内存分配时,所以不需要在create构造函数中提供Self作为owner参数。通过零,而不是防止所有者试图释放框架。

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

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

如果你想知道为什么你的应用需要花费这么长时间来做某些事情,请尝试分析它。针对您的程序尝试运行Sampling Profiler。该帮助文件解释了如何将分析仅限制到应用程序的特定部分,您可以使用该部分仅在清除或创建部件上获取抽样结果。这应该告诉你实际上你花费大部分时间在哪里,并从中汲取大量猜测。

+2

对于性能分析来说,一种非常快速和肮脏的选择是在调试器下运行,而长时间运行的操作正在发生,中断执行,暂停执行或任何被调用。你做了几次,就像那个穷人的取样分析器。如果没有很好的理由(甚至是出于正当的理由)出现某种令人惊讶的消耗CPU的情况,那么你通常会闯入它的中间并且意识到明白。 – 2011-01-10 18:39:50