Q&A

  • FTP목록을 가져와서 Listview에 출력을 할때 폴더의 아이콘
안녕하세요.
FTP목록을 가져와서 Listview에 출력을 할때 폴더의 아이콘을 찾는방법을
알고 싶습니다.

파일의 목록을 구해서 파일종류별로 아이콘을 가져오는것은 가능하지만
폴더의 아이콘을 가져오려고 하니 제가 잘못방향을 잡고 있는건지
잘 안되는군여.

ImageIndex에 등록하여 폴더만 빼려고 했으나
이 방법보다 효율적으로 생각하다보니

혹시 자세히 열려주시면 감사하겠습니다.

   if StrLen(@buf) > 1 then begin
      li := FTPList.Items.Add;
      li.Caption := '..';
      //li.ImageIndex := GetShellImage('..',false,false);
      //li.ImageIndex := GetShellImage('파일 폴더',false,false);
      li.ImageIndex := -1;
      li.SubItems.Add('');
      li.SubItems.Add('dir');
      li.SubItems.Add('');
    end;

function TMainForm.GetShellImage(Fname: String; Large, Open: Boolean): Integer;
var
  FileInfo: TSHFileInfo;
  Flags: Integer;
  pidl     : PItemIDList;
  ShellFolder: IShellfolder;
  CharParsing: ULONG;
  Attributes: Cardinal;
  wPath: WideString;
begin
  Pidl := nil;

  if not Failed(SHGetDesktopFolder(Shellfolder)) then
  begin
  wPath := Fname;
  Shellfolder.ParseDisplayName(0, nil, PWideChar(wPath), CharParsing, Pidl, Attributes);
  end;

  FillChar(FileInfo, SizeOf(FileInfo), #0);
  Flags := SHGFI_PIDL or SHGFI_SYSICONINDEX or SHGFI_ICON;
  if Open then Flags := Flags or SHGFI_OPENICON;
  if Large then Flags := Flags or SHGFI_LARGEICON
  else Flags := Flags or SHGFI_SMALLICON;
  SHGetFileInfo(PChar(PIDL),
                0,
                FileInfo,
                SizeOf(FileInfo),
                Flags);
  Result := FileInfo.iIcon;
end;


위의 예제는 제가 간단하게 폴더만 빼려고 해본 것입니다.
꼭좀 부탁 드리겠습니다.
1  COMMENTS
  • Profile
    김동원 2008.02.18 19:31
    1. Form에 TImageList VCL을 올려 놓습니다.
        올려진 TImageList VCL의 property중 ShareImages를 true로 설정합니다.

    2. uses 에 ShellApi를 추가합니다.

    3. 다음 함수를 추가합니다.
    // AIsDir : directory인지 여부
    function TForm3.GetFolderIconIndex(AFolderName: string;
      AIsDir: Boolean): Integer;
    var
      fi: SHFILEINFO;
      attrib: DWORD;
    begin
      if AIsDir then attrib := FILE_ATTRIBUTE_DIRECTORY
      else           attrib := FILE_ATTRIBUTE_NORMAL;

      SHGetFileInfo(PChar(AFolderName),
                            attrib,
                            fi,
                            sizeof(fi),
                            SHGFI_USEFILEATTRIBUTES or SHGFI_SYSICONINDEX);
      Result := fi.iIcon;
    end;


    4. FormCreate Event에 다음을 추가합니다.
    procedure TForm3.FormCreate(Sender: TObject);
    var
      fi: SHFILEINFO;
    begin
      ImageList1.Handle := SHGetFileInfo(nil,
                                                               0,
                                                               fi,
                                                               sizeof(fi),
                                                               SHGFI_SYSICONINDEX or SHGFI_SMALLICON);
                                                               // Large Icon -> SHGFI_LARGEICON
    end;

    5. 테스트 입니다. TListView VCL을 올려놓고 ViewStyle := vsReport, SmallImages:=ImageList1으로 설정합니다. 그리고 Column을 하나 추가합니다. -> 다음은 테스트 코드입니다.
      with ListView1.Items.Add do
      begin
        Caption := 'test.cpp';
        ImageIndex := GetFolderIconIndex(Caption, true);
      end;

    6. 프로그램 종료시 ImageList1의 Handle을 Free하지 마십시오. 시스템 이미지이기 때문에 문제가 발생될 수 있습니다.

    도움이 되셨길 바랍니다.
    그럼 즐푸 하세요...