Вниз
Скачать: 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 вся ветка

Скачать: CL | DM;



Память: 0.47 MB
Время: 0.022 c
14-1121009468
NewWonder
2005-07-10 19:31
2005.07.31
Что-то с монитором :(


3-1118250522
ANB
2005-06-08 21:08
2005.07.31
Как прочитать из поля и запихать в параметр число Int64 (Oracle)?


14-1121149030
Ega23
2005-07-12 10:17
2005.07.31
Какой кошмар!!!!


3-1119714262
ali_tash
2005-06-25 19:44
2005.07.31
TDBLookupComboBoxEh


3-1119553881
chi
2005-06-23 23:11
2005.07.31
Что понимается под свойством Handle для таблицы Paradox?




   Наверх