Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.10.02;
Скачать: CL | DM;

Вниз

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

 
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;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.051 c
11-1107750248
http://microsoft.com
2005-02-07 07:24
2005.10.02
В MCK объявить нужные модули


5-1101217264
main
2004-11-23 16:41
2005.10.02
Перекрытие события компонента


14-1126273817
mp40
2005-09-09 17:50
2005.10.02
Правда, что Интернет был бесплатным ?


6-1117791427
Marabunt
2005-06-03 13:37
2005.10.02
FTP client ошибка команды ChangeDir для indy


14-1126064115
КаПиБаРа
2005-09-07 07:35
2005.10.02
Цивилизацию погубят США?