1

我在使用 TScrollBox 中包含多个帧(通常为 25 个)的界面时遇到问题。

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

背景:

当应用程序启动时,我创建了 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;

我错过了什么?

4

2 回答 2

1

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

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

while FrameList.count > 0 do
begin
    TSF(Framelist[0]).free;
    Framelist.delete(0);
end;
Framelist.clear;
于 2011-01-10T18:34:34.440 回答
1

如果您想知道为什么您的应用程序要花这么长时间来做某事,请尝试对其进行分析。尝试对您的程序运行Sampling Profiler 。帮助文件解释了如何将分析限制在应用程序的特定部分,您可以使用它来仅获取清除或创建部分的采样结果。这应该向您显示您实际上大部分时间都花在了哪里,并消除了很多猜测。

于 2011-01-10T17:49:52.667 回答