Вопрос

У меня проблема с интерфейсом, который состоит из ряда кадров (обычно 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;

Что мне не хватает?

Это было полезно?

Решение

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

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

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

Другие советы

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top