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 для вашей программы. В справочном файле объясняется, как ограничить профилирование только определенным разделом вашего приложения, которое вы можете использовать для получения результатов выборки только при очистке или создании деталей. Это должно показать вам, где вы на самом деле проводите большую часть своего времени, и избавиться от множества догадок.