gpt4 book ai didi

Delphi 7自定义ImageList问题

转载 作者:行者123 更新时间:2023-12-02 04:10:48 29 4
gpt4 key购买 nike

我遇到了以下问题:

我的 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 程序崩溃。

关于如何解决这个问题有什么想法吗?

谢谢!

最佳答案

您可以尝试的一件事是将图标加载到单独的 tBitmap 中,然后在将其添加到图像列表之前调整其大小。

关于Delphi 7自定义ImageList问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4045884/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com