탐색기 비슷한걸 만들고 있는 중입니다.
예전에 찾아서 이용하던 방식으로 파일 이름으로 인덱스를 가져와
각각의 이름에 맞는 아이콘을 리스브 뷰에 보여주고 있습니다.
(mpg는 윈미아이콘, mp3는 윈엠프 아이콘, txt는 메모장아이콘
처럼 각각 pc에 설정된 것에 맞는 아이콘들...)
그러다가 제가 만든 아이콘을 추가해야할 일이 생겼습니다.
상위 폴더로 이동하는 아이콘 하고 그 비슷한거 를 추가해야 했습니다.
그래서 기존에 listview의 smallImages에 그대로 연결해 쓰던
SysImageList를 따로 만든 임의의 imagelist(test2ImageList )에 복사 해넣고
(addimage로 이미지 하나하나를 넣어줬습니다.)
제가 필요한 새로운 아이콘 두개를 임시 imagelist(tmpImageList)에 넣어놓고
test2ImageList.AddImage(tmpImageList,0);
로 추가 시켜줬습니다.
그러고 실행을 해서 사용했는데...
사용하다보면 갑자기 제 pc의 아이콘들이 전부 사라져버립니다..
탐색기를 실행해보면 죄다 아이콘이 안보이고...
제가 SysImageList를 건드렸나 싶어 소스를 아무리 디비봐도
여기선 그림을 얻어와 임시 imagelist에 넣어줬을 뿐 직접 이걸로
작업한 부분은 없더군요...
도대체 뭐가 잘못된건지... T_T
한번 제 소스를 살펴보시고 잘못된게 있으면 꼭 지적해주세요.. 부탁드립니다.
procedure TBizListView.GetSystemImageList(TargetListView: TListView);
var
SysImageList :uint; // temporary handle for System ImageLists
ShFileInfo :TShFileInfo; // Shell File Info structure
testImageList, test2ImageList: TImageList;
i, j: integer;
begin
testImageList := TImageList.Create(self);
TargetListView.LargeImages := TImageList.Create(self);
SysImageList := ShGetFileInfo('',0,ShFileInfo,SizeOf(ShFileInfo), shgfi_SysIconIndex or shgfi_LargeIcon);
if SysImageList <> 0 then
begin
TargetListView.LargeImages.Handle := SysImageList;
TargetListView.LargeImages.ShareImages := true; // Avoid freeing of System Image List !
end;
TargetListView.SmallImages := TImageList.Create(self);
SysImageList := ShGetFileInfo('',0,ShFileInfo,SizeOf(ShFileInfo),shgfi_SysIconIndex or shgfi_SmallIcon);
if SysImageList <> 0 then
begin
//**********여기서부터가 sysimagelist에서 이미지를 가져와
// test2ImageList에 이미지들을 넣어주는 부분..
testImageList.Handle := SysImageList;
test2ImageList := TImageList.Create(self);
for i := 0 to testImageList.Count - 1 do
begin
j := test2ImageList.AddImage(testImageList,i);
end;
//**********임의로 추가하고 싶은 아이콘 두개를 tmpImageList에
//저장했다가 test2ImageList에 넣어주는 부분입니다.
// imgParentFolderIndex , imgtestFolderIndex 는 전역변수입니다.
imgParentFolderIndex := test2ImageList.AddImage(tmpImageList,0);
imgtestFolderIndex := test2ImageList.AddImage(tmpImageList,1);
TargetListView.SmallImages.Handle := test2ImageList.Handle;
TargetListView.SmallImages.ShareImages := true;
// Avoid freeing of System Image List !
end;
end;
function TBizListView.GetImageIndex(Filename: String): Integer;
var
Fileinfo: TSHFileInfo;
begin
if SHGetFileInfo(PChar(FileName), 0, Fileinfo, sizeof(TSHFileInfo),
SHGFI_ICON or SHGFI_SYSICONINDEX or SHGFI_USEFILEATTRIBUTES) <> 0 then
begin
Result := Fileinfo.IIcon;
end else Result := 0;
end;
시스템 이미지 리스트는 함부로 해제하면 안됩니다.
TImageList.ShareImages속성을 True로 해서 사용하세요.
^^ 항상 즐코하세요...