首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >virtualtreeview添加图标失败

virtualtreeview添加图标失败
EN

Stack Overflow用户
提问于 2012-06-23 22:34:21
回答 1查看 538关注 0票数 1

下面是将文件名及其相关图标添加到virtualtreeview的简单代码

代码语言:javascript
复制
  PFileInfoRec = ^TFileInfoRec;
  TFileInfoRec = record
    strict private
      vFullPath: string;
      vFileName: string;
      vFileIcon: hIcon;
    public
      constructor Create(const FullPath: string);
      property FullPath: string read vFullPath;
      property FileNam : string read vFileName;
      property FileIcon: hIcon read vFileIcon;
  end;

在我使用shGetFileInfo Api获得图标句柄后

代码语言:javascript
复制
procedure TMainFrm.VSTGetImageIndex(Sender: TBaseVirtualTree;
  Node: PVirtualNode; Kind: TVTImageKind; Column: TColumnIndex;
  var Ghosted: Boolean; var ImageIndex: Integer);
var
  FileInfo: PFileInfoRec;
  Icon: TIcon;
begin
  FileInfo := Sender.GetNodeData(Node);
  Icon := TIcon.Create;
  try
    Icon.Handle := FileInfo.FileIcon;
      if Kind in [ikNormal , ikSelected] then
      begin
        if Column = 1 then ImageIndex := ImageList.AddIcon(Icon);
      end;
  finally
    Icon.Free; //here the probelme
  end;
end;

什么让我困惑当删除Icon.Free;代码工作正常文件添加图标,但当免费的TIcon对象时,添加图标失败!有人给我解释一下这段代码出了什么问题吗?

提前感谢你的帮助...

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-06-23 23:23:39

首先,您必须停止在OnGetImageIndex中调用ImageList.AddIcon。我不会重复详细的建议,只是简单地向您推荐your previous question

至于这里正在发生的事情,这是正在发生的事情:

  1. 您创建了一个图标句柄,然后将该图标的所有权传递给TIcon实例。
  2. 您释放了该图标实例,而该实例又删除了该图标句柄。
  3. 下次调用OnGetImageIndex时,图标句柄vFileIcon将引用一个已被销毁的句柄,因此您尝试使用该图标自然会失败。H215G216

将此图标添加到图像列表的最简单方法实际上是使用ImageList_AddIcon,而不必费心创建TIcon实例。

代码语言:javascript
复制
FileInfo := Sender.GetNodeData(Node);
ImageList_AddIcon(ImageList.Handle, FileInfo.FileIcon);

在销毁TIcon实例时,可以使用TIcon而不销毁句柄。调用ReleaseHandle告诉TIcon实例它不再拥有图标句柄。

代码语言:javascript
复制
Icon := TIcon.Create;
try
  Icon.Handle := SomeIconHandle;
  SomeImageIndex := ImageList.AddIcon(Icon);
  Icon.ReleaseHandle;
finally
  //because ReleaseHandle was called, this no longer destroys the icon handle
  Icon.Free;
end;
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11170316

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档