Delphi 无法在运行时添加到虚拟映像列表的菜单上显示图标

Delphi 无法在运行时添加到虚拟映像列表的菜单上显示图标,delphi,Delphi,我无法在运行时添加的菜单项上显示图标。 我正在向主菜单添加一个菜单项,该菜单项的images属性链接到一个链接到TImageCollection的TVirtualImage列表。所有固定图像都保存在虚拟图像列表中,在运行时,我添加了额外的菜单项,将每个图像作为图标添加到虚拟图像列表中。主菜单有一个附加菜单附加到的虚拟菜单项 function LoadIconFromFile(FileName: String; Var Icon: TIcon): Integer; overload; var S

我无法在运行时添加的菜单项上显示图标。 我正在向主菜单添加一个菜单项,该菜单项的images属性链接到一个链接到TImageCollection的TVirtualImage列表。所有固定图像都保存在虚拟图像列表中,在运行时,我添加了额外的菜单项,将每个图像作为图标添加到虚拟图像列表中。主菜单有一个附加菜单附加到的虚拟菜单项

function LoadIconFromFile(FileName: String; Var Icon: TIcon): Integer;  overload;
var SHInfo: TSHFileInfo;
begin
  Result := -1;
  if not FileExists(FileName) then exit;
  SHGetFileInfo(PChar(FileName), 0, SHInfo, SizeOf(SHInfo), SHGFI_ICON OR SHIL_LARGE);
  Icon.Handle := SHInfo.hIcon;
  Icon.Transparent := true;
  result := $1000;
end;    

TmpIcon := TIcon.Create;
LoadIconFromFile(FileName, TmpIcon);
MenuItem.ImageIndex := vilMenues.AddIcon(TmpIcon);
image1.Picture.Graphic := TmpIcon;
TmpIcon.Free;
MainMenu.BaseMenuItem.Add(MenuItem);
为了确保我确实正确地拾取了图标,我还显示了一个TImage。添加附加菜单项,图标出现在TImage控件中,但从未出现在菜单上。我知道图像会被添加到图像列表中,因为图像计数会增加。我尝试过在更新之前从主菜单中分离图像列表,然后在更新之后重新连接,但没有任何区别。我开始怀疑TVirtualImageList是否能够处理混合图像源


有人能告诉我如何解决这个问题吗?

TImageCollection
不支持图标

使用
AddIcon
方法时,
TCustomImageList.AddIcon
调用覆盖的方法
TVirtualImageList.DoChange
,该方法从图像集合更新整个虚拟图像列表


因此,如果虚拟图像列表中有3个图像,并调用
AddIcon
,它将返回一个新的图像索引3,现在列表中有4个图像。但随后虚拟映像列表被重新创建,其计数回到3。

我让它使用以下代码:

TmpIcon := TIcon.Create;
Strm := TMemoryStream.Create;
LoadIconFromFile(FileName, TmpIcon);// get icon from file
tmpIcon.SaveToStream(Strm);
s := 'X'+IntToStr(idx);  // Add a name for new item
ImageCollection1.Add(s, strm);  // Add to collection
idy:= ImageCollection1.Count -1;  // Get the index for it
vilMenues.Add(s,idy);  // Add it to virtual image list
MenuItem.ImageIndex := vilMenues.Count -1;
Strm.Free;
TmpIcon.Free;

相当笨拙,我觉得一定有更好的方法…

在旁注中,您应该去掉
FileExists()
检查,而是检查
SHGetFileInfo()的返回值
成功/失败您是否尝试将图标添加到链接的
TImageCollection
而不是直接添加到
tVirtualImage列表中?确实是这样说的:“注意:要在TVirtualImageList中添加、插入和/或替换位图,您必须使用方法添加、插入和/或替换ImageCollection中的项。”,因此我认为这也适用于图标。感谢您确认我的怀疑。我以前曾尝试添加到图像集合中,但没有成功,但我将再次尝试,因为它更有意义。我想我需要将我的图标转换为png,这样图像集才能接受它。