Текущий архив: 2005.07.31;
Скачать: CL | DM;
ВнизОсвобождение ресурсов после ExtractIcon Найти похожие ветки
← →
Yuri Btr © (2005-07-13 13:20) [0]Ув. мастера,
подскажите в нижеследующей процедуре имеет ли смысл вызывать DestroyIcon?
Я так рассуждаю, если есть ExtractIcon, то налицо резервирование ресурсов под
иконку, но затем она замещает уже существующую - надо ли старую освобождать?
И в конце при выходе из процедуры экземпляр Icon будет ли автоматически
освобожден?
Данная процедура будет вызываться несколько (2-3) раза в секунду, для
анимации статусной иконки в системном трее.procedure TMainForm.SetProgrammIcon(tempIconIndex:integer=0);
var
Icon:hIcon;
begin
if tempIconIndex=-1
then
tempIconIndex:=0;
Icon:=ExtractIcon(hInstance,PChar(Application.Exename),tempIconIndex);
if (Icon=1) or (Icon=0)
then//if icons not found or filename is not valid PE file
Exit;
try
Application.Icon.Handle:=Icon;
Icon:=ExtractIcon(hInstance,PChar(Application.Exename),0);
if (Icon=1) or (Icon=0)
then//if icons not found or filename is not valid PE file
Exit;
MainForm.Icon.Handle:=Icon;
finally
if TrayIconShowing
then
TrayIconModify;
end;
end;
← →
Юрий Зотов © (2005-07-13 13:24) [1]> Yuri Btr © (13.07.05 13:20)
> Я так рассуждаю,
В подобных случаях я даже и не рассуждаю, а просто внимательно и до конца читаю описание функции. И вижу:
Remarks
You must destroy the icon handle returned by ExtractIcon by calling the DestroyIcon function.
← →
Yuri Btr © (2005-07-13 13:32) [2]to Юрий Зотов ©
Я это тоже прочитал, потому и спрашиваю - DestroyIcon нужно вызвать один раз в разделе finally для Icon ?
Заранее спасибо за ответ
← →
BiN © (2005-07-13 13:40) [3]Юрий Зотов © (13.07.05 13:24) [1]
В подобных случаях я даже и не рассуждаю, а просто внимательно и до конца читаю описание функции.
Вообще-то, в данном случае DestroyIcon будет вызвана при уничтожении Application.
← →
Юрий Зотов © (2005-07-13 16:30) [4]> Yuri Btr © (13.07.05 13:32) [2]
> DestroyIcon нужно вызвать один раз
Сколько раз вызвана ExtractIcon - столько же раз надо вызывать и DestroyIcon, с каждым хэндлом. Иначе что ж получится - назахватывали, например, полтыщи ресурсов, а освободили только один?
> BiN © (13.07.05 13:40) [3]
> DestroyIcon будет вызвана при уничтожении Application.
При уничтожении Application автоматически будут освобождены многие ресурсы, не только иконка. Вот только, если это самое Application само не следит за своевременным освобождением уже ненужных ему ресурсов, то его уничтожение может произойти тоже автоматически. И несколько раньше, чем планировалось.
← →
BiN © (2005-07-13 17:15) [5]Юрий Зотов © (13.07.05 16:30) [4]
При уничтожении Application автоматически будут освобождены многие ресурсы, не только иконка. Вот только, если это самое Application само не следит за своевременным освобождением уже ненужных ему ресурсов, то его уничтожение может произойти тоже автоматически. И несколько раньше, чем планировалось.
Юрий, в данном случае я говорю не об автоматическом освобождении системой ресурсов процесса.
Уточню: DestroyIcon будет вызвана при каждом присвоении Application.Icon.Handle:=Icon, при Icon.Handle<>0. В этом легко убедиться, проследив цепочку вызовов методов начиная от TIcon.SetHandle и до TIconImage.FreeHandle.
Вызвав же DestroyIcon вручную, мы ошибочно освободим ресурсы, используемые свойством Application.Icon.
← →
Юрий Зотов © (2005-07-13 18:07) [6]BiN © (13.07.05 17:15) [5]
Cлова "уже ненужных" надо было выделить?
← →
BiN © (2005-07-13 18:17) [7]Юрий Зотов © (13.07.05 18:07) [6]
Cлова "уже ненужных" надо было выделить?
Тогда, может, выделить слова "в данном случае" из поста [3].
Автор ветки завел речь о поведении конкретного класса (TIcon), и согласно этому поведению будет ошибкой "вручную" вызывать DestroyIcon.
И отвечая на вопрос:
Yuri Btr © И в конце при выходе из процедуры экземпляр Icon будет ли автоматически
освобожден?,
скажу: да, будет автоматически освобожден.
Страницы: 1 вся ветка
Текущий архив: 2005.07.31;
Скачать: CL | DM;
Память: 0.46 MB
Время: 0.058 c