Delphi:框架列表的问题

Delphi:框架列表的问题,delphi,frames,tlist,Delphi,Frames,Tlist,我遇到了一个界面问题,这个界面在一个TScrollBox中由许多帧(通常是25帧)组成 有两个问题,我希望其中一个是另一个的结果 背景: 当应用程序启动时,我创建了25个帧,每个帧包含大约20个控件,然后用默认信息填充这些控件。然后,用户可以单击一个控件,将搜索限制在信息的子集上,此时我可以释放并重新创建帧(因为搜索可能返回

我遇到了一个界面问题,这个界面在一个TScrollBox中由许多帧(通常是25帧)组成

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

背景:

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

问题:

如果在初始搜索后退出应用程序,则返回Delphi大约需要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;
下面是我的删除例程:

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;

我遗漏了什么?

如果你想知道为什么你的应用程序要花这么长时间才能完成某件事,试着分析一下。试着违背你的计划。帮助文件解释了如何将分析限制在应用程序的特定部分,您可以使用该部分仅获取清除或创建部件的采样结果。这应该会告诉你你实际上在哪里花费了大部分的时间,并减少很多猜测。

因为你通过释放帧来控制正在创建的帧的内存分配,所以不需要在create构造函数中提供Self作为所有者参数。而是传递nil,以防止所有者尝试释放框架

另外,不喜欢ClearFrames例程的外观。请尝试以下方法:

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

框架列表是什么类型的?顺便说一句,在ClearFrames中,您指的是for循环中的MF.Framelist。框架列表是在TMF主窗体的公共部分声明的TList。ClearFrames中的MF是无关的,但它本身不应该引起任何问题,是吗?更多的皮带和支架…一个非常快速和肮脏的替代评测的方法是在调试器下运行,在长时间运行的操作发生时,中断执行、暂停执行或其他任何调用的操作。你这样做了几次,就像穷人的取样分析器。如果没有充分的理由(甚至是充分的理由!)而有什么惊人的事情消耗CPU,那么你通常会在它中间破门而入,然后开始实现。@David:是的,但是由于采样分析器是免费的,并且易于学习和使用,所以没有太多的理由选择“调试器暂停评测”在我看来,当我尝试它的时候,我无法让它工作,但我想我并没有太努力。我同意适当的工具是值得拥有的,但“调试器暂停评测”方法通常可以在几秒钟内工作。无论如何,这只是另一种选择。我似乎无法让采样分析器工作-我在尝试开始分析时遇到(法语)访问冲突…谢谢你的建议。切换到Owner(nil)及以上,在运行一次或两次后退出之间仍有10秒的差异…您是否使用FastMM完全调试模式检查内存泄漏?这可能指向一个问题,而这个问题又可能是后续某个问题的根本原因。您可以告诉我这件事发生在我身上,它导致退出调试会话时延迟约10秒。