본문 바로가기

카테고리 없음

[일반/컴포넌트] ListView에 확장자별 아이콘 넣기

반응형
확장자별로 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;
반응형