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

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



Память: 0.46 MB
Время: 0.025 c
14-1126027226
GosuWC3
2005-09-06 21:20
2005.10.02
Sozdanie testov i provedenie testirovanija (programma)


1-1126423471
vasyaaaaaaa
2005-09-11 11:24
2005.10.02
Memo1.Lines.Add() - every line Color


14-1125990160
КаПиБаРа
2005-09-06 11:02
2005.10.02
Какую реакцию вызвал у вас ураган, набедокуривший в США?


9-1116236051
WondeRu
2005-05-16 13:34
2005.10.02
OpenGL. проблемы c SelectBuffer


14-1126254393
Maverick
2005-09-09 12:26
2005.10.02
На чем пишут софт для PDA?




   Наверх