Главная страница
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.076 c
2-1124454491
Пантелеев Иван
2005-08-19 16:28
2005.10.02
Длина в Edit


14-1123222959
panov
2005-08-05 10:22
2005.10.02
Объявление. О хамстве и оскорблениях.


14-1126177116
Prohodil Mimo
2005-09-08 14:58
2005.10.02
Po4emu HDD razbitij na logicheskihje terjajet v skorosti v 2 raza


1-1126154546
Big Joe
2005-09-08 08:42
2005.10.02
XPManifest1 не хочет исчезать


9-1116958134
ins3rt
2005-05-24 22:08
2005.10.02
OpenGL движок