下面是将文件名及其相关图标添加到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对象时,添加图标失败!有人给我解释一下这段代码出了什么问题吗?
提前感谢你的帮助...
发布于 2012-06-23 23:23:39
首先,您必须停止在OnGetImageIndex中调用ImageList.AddIcon。我不会重复详细的建议,只是简单地向您推荐your previous question。
至于这里正在发生的事情,这是正在发生的事情:
TIcon实例。OnGetImageIndex时,图标句柄vFileIcon将引用一个已被销毁的句柄,因此您尝试使用该图标自然会失败。H215G216将此图标添加到图像列表的最简单方法实际上是使用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;https://stackoverflow.com/questions/11170316
复制相似问题