Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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.49 MB
Время: 0.025 c
3-1119430308
Term
2005-06-22 12:51
2005.07.31
Использование TTable, связь по нескольким полям


5-1091392355
int
2004-08-02 00:32
2005.07.31
OnPaint в наследнике


1-1121252021
ZSergey
2005-07-13 14:53
2005.07.31
почему компилятор пропускает строки?


1-1121147034
Elena_
2005-07-12 09:43
2005.07.31
Как заменить в текстовом файле 2005 на 2006


14-1120824367
Piter
2005-07-08 16:06
2005.07.31
Сохранение картинок в IE