我在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;
我错过了什么?
答案 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;