Delphi: проблемы с TList of Frames - PullRequest
1 голос
/ 10 января 2011

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

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

Фон:

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

Проблема:

Если я выйду из приложения после начального поиска, то это займет ок.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 ]

1 голос
/ 10 января 2011

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

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

while FrameList.count > 0 do
begin
    TSF(Framelist[0]).free;
    Framelist.delete(0);
end;
Framelist.clear;
1 голос
/ 10 января 2011

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

...