안녕하세요.
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;
위의 예제는 제가 간단하게 폴더만 빼려고 해본 것입니다.
꼭좀 부탁 드리겠습니다.
올려진 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하지 마십시오. 시스템 이미지이기 때문에 문제가 발생될 수 있습니다.
도움이 되셨길 바랍니다.
그럼 즐푸 하세요...