这里是我的简单代码,用于将文件名及其相关图标添加到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对象添加图标失败!!任何人向我解释
这段代码怎么了?
先谢谢你的帮助......
答案 0 :(得分:1)
首先,您必须停止在ImageList.AddIcon
中呼叫OnGetImageIndex
。我不会详细重复这些建议,只是简单地引用your previous question。
至于这里发生了什么,这就是正在发生的事情:
vFileIcon
。TIcon
实例。OnGetImageIndex
时,图标句柄vFileIcon
指的是已被销毁的句柄,因此您尝试使用该图标的操作会自然失败。将此图标添加到图片列表的最简单方法是使用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;