You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过编程将Delphi的TImageList转换为TImageCollection?

将TImageList句柄内容复制到TImageCollection配合TVirtualImageList使用

要把通过句柄关联的TImageList内容复制到TImageCollection,进而配合TVirtualImageList使用,你需要逐个提取原ImageList中的图片并添加到ImageCollection——因为两者的存储结构不同,无法直接通过句柄赋值。以下是修正后的实现代码:

var
  Images: TImageList;
  ImCol: TImageCollection;
  I: Integer;
  TempBmp: TBitmap;
  ImgItem: TImageCollectionItem;
begin
  Images := TImageList.Create(nil);
  ImCol := TImageCollection.Create(nil);
  try
    // 关联到现有ImageList句柄
    Images.Handle := FormSet.SmallImageListHandle;
    Images.ShareImages := True;

    // 同步ImageCollection的图片尺寸与原ImageList一致
    ImCol.ImageSize := Images.Size;

    // 遍历原ImageList的所有图片,逐个添加到ImageCollection
    for I := 0 to Images.Count - 1 do
    begin
      TempBmp := TBitmap.Create;
      try
        // 从原ImageList中提取对应索引的图片
        Images.GetBitmap(I, TempBmp);
        // 创建新的ImageCollection项并赋值图片
        ImgItem := ImCol.Add;
        ImgItem.Image.Assign(TempBmp);
        // 可选:为图片项设置名称(方便后续引用)
        ImgItem.Name := Format('Icon_%d', [I]);
      finally
        TempBmp.Free;
      end;
    end;

    // 将ImageCollection关联到TVirtualImageList
    FormIconsImageList.ImageCollection := ImCol;
    // 刷新VirtualImageList确保图片生效
    FormIconsImageList.Refresh;
  finally
    // 注意:若ImCol的Owner已设为Form或其他持久对象,此处无需手动释放
    // 仅当Owner为nil时,需在合适时机释放(比如Form销毁时)
    Images.Free;
  end;
end;

关键说明:

  • 无法直接句柄赋值:TImageCollection是基于TBitmap的集合存储,而TImageList是基于系统ImageList句柄的轻量级封装,两者没有直接的句柄映射接口,必须通过图片复制完成转换。
  • 同步尺寸:设置ImCol.ImageSize与原ImageList一致,避免图片缩放变形。
  • 生命周期管理:若将ImCol的Owner设为Form(比如TImageCollection.Create(Form)),则无需手动释放,由Form自动管理;若Owner为nil,需在Form销毁时手动释放ImCol,避免内存泄漏。
  • ShareImages的作用:设置为True后,释放Images对象不会影响原句柄对应的图片资源,符合你“不修改FormSet.SmallImageListHandle深层代码”的要求。

内容的提问来源于stack exchange,提问作者V J

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 19:51:53