Delphi: проблемы с TList of Frames

У меня проблема с интерфейсом, состоящим из нескольких кадров (обычно 25) в TScrollBox.

Есть 2 проблемы, и я надеюсь, что одна является следствием другой...

Фон:

Когда приложение запускается, я создаю 25 кадров, каждый из которых содержит ок. 20 элементов управления, которые затем заполняются информацией по умолчанию. Затем пользователь может щелкнуть элемент управления, чтобы ограничить поиск подмножеством информации, после чего я освобождаю и воссоздаю свои кадры (так как поиск может вернуть < 25 записей)

Эта проблема:

Если я выйду из приложения после начального поиска, то это займет ок. 5 секунд, чтобы вернуться в Delphi. После 2-го поиска (и удаления / воссоздания кадров) требуется ок. 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 ответа

Решение

Поскольку вы берете на себя управление распределением памяти фреймов, которые вы создаете, Free'ing их, то нет необходимости указывать Self в качестве параметра owner в конструкторе create. Вместо этого передайте nil, чтобы владелец не попытался освободить кадр.

Кроме того, не нравится внешний вид вашей процедуры ClearFrames. Попробуйте это вместо этого:

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

Если вы хотите знать, почему ваше приложение так долго что-то делает, попробуйте его профилировать. Попробуйте запустить Sampling Profiler для вашей программы. В справочном файле объясняется, как ограничить профилирование только определенным разделом вашего приложения, которое вы можете использовать для получения результатов выборки только при очистке или создании деталей. Это должно показать вам, где вы на самом деле проводите большую часть своего времени, и избавиться от множества догадок.

Другие вопросы по тегам