반응형
확장자별로 ListView에 아이콘을 넣는 방법입니다.
SHGetFileInfo 함수를 이용하면 확장자 정보를 가져 와서 이미지 아이콘을 가져올 수 있지만, 반드시 파일이 로컬에 존재해야만 확장자 아이콘을 가져올 수 있습니다.
그래서, 생각해 낸 것이 이 방법입니다. 임시로 파일을 생성한 후에 임시파일을 ReName시켜 사용합니다.
ListView에서 넣고자 하는 확장자 정보가 실제 파일이 없더라도 해당 확장자 아이콘을 넣고자 할 때 유용하게 쓰일 수 있을 겁니다.(사실은 임시파일을 생성하니깐 있는 건가? ^^;)
Constructor TEdmListView.Create(AOwner:TComponent);
var
i: Integer;
Path: array [0..260] of Char;
Stream: TFileStream;
begin
inherited Create(AOwner);
// 확장자 이미지를 저장할 ImageList 객체 생성
FIList := TImageList.Create(Self);
FIBigList := TImageList.Create(Self);
// 확장자별 아이콘 저장
InitDirImages;
// 빈 파일 생성
// 여기가 중요한데요~ 임시로 파일을 생성하는 겁니다. 예제는 Widnows 임시디렉토리에 생성합니다.
// 로컬에 파일이 있어야 가져온다니깐여~ ^^*
GetTempPath(Sizeof(Path), Path);
FPath := Path + 'edmssample.dat';
Stream := TFileStream.Create(FPath, fmCreate);
Stream.Free;
end;
// 확장자별 아이콘 ImageList에 저장하기
procedure TEdmListView.InitDirImages;
var
fWinDir: String;
sfi : TSHFileInfo;
begin
SetLength ( fWinDir , MAX_PATH );
SetLength ( fWinDir , GetWindowsDirectory(PChar ( fWinDir ),MAX_PATH));
AddBSlash(fWinDir);
FIList.Handle :=
SHGetFileInfo(PChar ( fWinDir ),0,sfi,SizeOf(TSHFileInfo),
SHGFI_SYSICONINDEX or SHGFI_SMALLICON);
fIList.ShareImages := True;
fIFolN := sfi.iIcon;
SHGetFileInfo(PChar ( fWinDir ),0,sfi,SizeOf(TSHFileInfo), SHGFI_OPENICON or
SHGFI_SYSICONINDEX or SHGFI_SMALLICON);
fIFolS := sfi.iIcon;
FIBigList.Handle :=
SHGetFileInfo(PChar ( fWinDir ),0,sfi,SizeOf(TSHFileInfo),
SHGFI_SYSICONINDEX or SHGFI_LARGEICON);
fIBigList.ShareImages := True;
fIBigList.ShareImages := True;
fIBigFolN := sfi.iIcon;
SHGetFileInfo(PChar ( fWinDir ),0,sfi,SizeOf(TSHFileInfo), SHGFI_OPENICON or
SHGFI_SYSICONINDEX or SHGFI_LARGEICON);
fIBigFolS := sfi.iIcon;
end;
// ListView에 뿌려 줄 확장자별 이미지 아이콘 인덱스 가져오기
function TEdmListView.GetIndexOfImage(BigIcon : boolean; strFileExt: String) : integer;
var
sfi : TSHFileInfo;
flags : integer;
strFileName: String;
f: File;
begin
// 임시파일 ReName
strFileName := Copy(FPath,1,Pos('.', FPath)-1);
AssignFile(f, FPath);
FPath := strFileName + '.' + strFileExt;
if FileExists(FPath) then DeleteFile(FPath);
ReName(f, FPath);
// 현재 ReName된 파일명 저장, 왜냐구여? 다음 번 추가확장자는 이걸루 참조해야 하거덩여~
FPath := strFileName + '.' + strFileExt;
if BigIcon then
flags := SHGFI_ICON or SHGFI_LARGEICON
else
flags := SHGFI_ICON or SHGFI_SMALLICON;
SHGetFileInfo(PChar(FPath),0,sfi,SizeOf(TSHFileInfo), flags); // get the shell's image list's handle
result := sfi.iIcon;
end;
// ListView에 Item 추가
function TEdmListView.AddItem: TListItem;
var
Item: TListItem;
begin
중간 생략...
Item := Items.Add;
Item.Caption := 'ppt';
Item.ImageIndex := GetIndexOfImage(False, Item.Caption);
중간 생략...
result := Item;
end;
반응형