Форум: "Основная";
Текущий архив: 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.004 c