Проблема Delphi7 CustomImageList
Я столкнулся со следующей проблемой:
Моя программа Delphi7 работает без проблем на большинстве компьютеров под управлением WinXP/Vista/7, НО на некоторых старых версиях Windows XP (только несколько) я получаю следующую проблему:
У меня есть список системных изображений, и я добавляю свои собственные значки в копию списка системных изображений. После добавления моих иконок я получаю "Неверный размер изображения". EInvalidOperation ошибка.
Вот код, о котором идет речь:
function GetSystemLargeIconsList: TCustomImageList;
// This gets the system image list.
var
SysIL: HImageList;
SFI: TSHFileInfo;
MyImages: TCustomImageList;
begin
SysIL := SHGetFileInfo('', 0, SFI, SizeOf(SFI),
SHGFI_SYSICONINDEX or SHGFI_LARGEICON);
if SysIL <> 0 then begin
MyImages:=TCustomImageList.Create(nil);
// Assign the system list to the component
MyImages.Handle := SysIL;
// The following prevents the image list handle from being
// destroyed when the component is.
MyImages.ShareImages := TRUE;
Result:=MyImages;
end;
end;
var
DocumentImgList: TCustomImageList;
IconToAdd: TIcon;
begin
DocumentImgList:=GetSystemLargeIconsList;
Documents.LargeImages:=DocumentImgList;
Documents.SmallImages:=DocumentImgList;
IconToAdd:=TIcon.Create;
DocumentListIcons.GetIcon(0, IconToAdd);
DocumentImgList.AddIcon(IconToAdd); ----> this is the line of the exception
Чтобы усугубить проблему, я использую компонент TPngImageList, но в соответствии с кодом он просто вызывает стандартную функцию Delphi:
if TObject(Self) is TPngImageList
then if Image = nil
...
else begin
Patch := FindMethodPatch('AddIcon');
if Patch <> nil
then begin
Patch.BeginInvokeOldMethod;
try
Result := TCustomImageList(Self).AddIcon(Image); ----> this is where the exception happens
finally
Patch.FinishInvokeOldMethod;
end;
end
else Result := -1;
end;
Недавно я обнаружил, что на одном из компьютеров, на которых возникла эта проблема, либо uxtheme.dll, либо explorer.exe был исправлен какой-то программой для создания скинов Windows.
Поэтому я предполагаю, что кто-то или программа взламывает список образов системы таким образом, что это приводит к сбою моей программы на Delphi.
Любые идеи о том, как это исправить?
Спасибо!
1 ответ
Одна вещь, которую вы можете попробовать, это загрузить ваш значок в отдельный tBitmap, а затем изменить его размер, прежде чем добавлять его в список изображений.