Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2005.07.31;
Скачать: [xml.tar.bz2];

Вниз

Освобождение ресурсов после 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.46 MB
Время: 0.032 c
4-1117809351
iskatel
2005-06-03 18:35
2005.07.31
пульт avermedia


14-1120857704
Ihor Osov'yak
2005-07-09 01:21
2005.07.31
Предложение ударить по разжигателям междунациональной вражды..


5-1090854143
sirin
2004-07-26 19:02
2005.07.31
ActiveX Control


3-1119440610
stelius
2005-06-22 15:43
2005.07.31
регулярные выражения в oracle


9-1113506171
BREVIS
2005-04-14 23:16
2005.07.31
Проблема с проверкой столкновений в GLScene.





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский