virtualtreeview添加图标失败

时间:2012-06-23 14:34:21

标签: delphi icons virtualtreeview

这里是我的简单代码,用于将文件名及其相关图标添加到virtualtreeview

  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

获取图标句柄后
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对象添加图标失败!!任何人向我解释 这段代码怎么了?

先谢谢你的帮助......

1 个答案:

答案 0 :(得分:1)

首先,您必须停止在ImageList.AddIcon中呼叫OnGetImageIndex。我不会详细重复这些建议,只是简单地引用your previous question

至于这里发生了什么,这就是正在发生的事情:

  1. 您创建了一个图标句柄vFileIcon
  2. 然后,您将该图标的所有权传递给TIcon实例。
  3. 释放图标实例,然后删除图标句柄。
  4. 下次调用OnGetImageIndex时,图标句柄vFileIcon指的是已被销毁的句柄,因此您尝试使用该图标的操作会自然失败。
  5. 将此图标添加到图片列表的最简单方法是使用ImageList_AddIcon,而不用费心创建TIcon个实例。

    FileInfo := Sender.GetNodeData(Node);
    ImageList_AddIcon(ImageList.Handle, FileInfo.FileIcon);
    

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

    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;