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

Вниз

Установка иконки программы   Найти похожие ветки 

 
Yuri Btr ©   (2005-09-09 17:07) [0]

Ув. мастера, я вызываю примерно 2 раза в сек. функцию смены иконки приложения (наподобие как в The Bat! при непрочитанных сообщениях), в ней написано:

ImageList1.GetIcon(tempIconIndex,Application.Icon);
ImageList1.GetIcon(0,MainForm.Icon);

ну и затем tempIconIndex меняется на следующий в списке.
Так вот все работает, но MemProof показывает что есть ошибки именно при выполнении приведенных двух строк, как раз по ошибке
на строку.
На первой строке - "DestroyIcon - Неверный дескриптор"
На второй строке - "Atempt to free unexisting resource"
или "Unknown Win32 Error"
Вопрос, как можно без этих ошибок установить приложению и главной форме иконку в RunTime?
Заранее благодарен


 
Eraser ©   (2005-09-09 17:52) [1]

Yuri Btr ©   (09.09.05 17:07)

Смотрим реализацию метода GetIcon:
procedure TCustomImageList.GetIcon(Index: Integer; Image: TIcon);
begin
 GetIcon(Index, Image, DrawingStyle, ImageType);
end;

далее вызывется

procedure TCustomImageList.GetIcon(Index: Integer; Image: TIcon;
 ADrawingStyle: TDrawingStyle; AImageType: TImageType);
begin
 if (Image <> nil) and HandleAllocated then
   Image.Handle := ImageList_GetIcon(Handle, Index,
     DrawingStyles[ADrawingStyle] or Images[AImageType]);
end;


Обрати внимение на if (Image <> nil)...

соответственно скорее всего проблемы с tempIconIndex,Application.Icon. Необходимо сначала создать объект-иконку.


 
Yuri Btr ©   (2005-09-09 18:04) [2]

to Eraser ©
т. е. нужно сначала создать в процедуре
tempIcon:TIcon, затем засунуть этот tempIcon в GetIcon,
и присвоить получившуюся иконку Application.Icon через Assign
затем освободить tempIcon, так ?


 
Eraser ©   (2005-09-09 18:15) [3]

Yuri Btr ©   (09.09.05 18:04) [2]

Угу.


 
Yuri Btr ©   (2005-09-09 18:20) [4]

Не помогает, теперь ругается на Assign

var
tempIcon:TIcon;
begin
try
 tempIcon:=TIcon.Create;
 IL2.GetIcon(tempIconIndex,tempIcon);
 Application.Icon.Assign(tempIcon);
finally
 tempIcon.Free;
end;
end;


 
Yuri Btr ©   (2005-09-09 18:38) [5]

Привожу дословно ...

в     Application.Icon.Assign(tempIcon);
есть  FImage.Release;
в нем FreeHandle;
в нем строчка
if FHandle <> 0 then DestroyIcon(FHandle);
выдает ошибку на DestroyIcon(FHandle),
говорит "Unknown Win32 Error"

При трассировке, получается что первое присвоение проходит без ошибки, так как в FImage.Release при проверке if FRefCount = 0
значение FRefCount = 1, и идет присвоение иконки без использования FreeHandle, но все последующие вызовы проходят "нормально", при Assigne у них FRefCount = 0 и соответственно проходит далее DestroyIcon, с последующей ошибкой...

Я так понимаю, что где то ещё используется иконка Application.Icon - ведь FRefCount - это счетчик обращений?


 
Eraser ©   (2005-09-09 23:05) [6]

Yuri Btr ©   (09.09.05 18:20) [4]

Assign должен работать!
Что за ошибку пишет?



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2005.10.02;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.46 MB
Время: 0.005 c
1-1126539754
Цукор 5
2005-09-12 19:42
2005.10.02
утечка памяти


1-1126431177
The Only
2005-09-11 13:32
2005.10.02
Status Bar на меню


1-1126292256
lordalexander
2005-09-09 22:57
2005.10.02
Блок


1-1126367091
lionts
2005-09-10 19:44
2005.10.02
Импорт перемненных из внешних модулей


1-1126686308
SuperAlexey
2005-09-14 12:25
2005.10.02
runtime компоненты





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский