::: 델파이 Tip&Trick :::

델파이 Tip&Trick 성격에 맞지 않는 광고,비방,질문의 글은 즉시 삭제하며
내용을 복사하여 사용할 경우 반드시 이곳(http://www.howto.pe.kr)을 출처로 명시하여 주세요


Category

  신훈재(2003-03-15 14:41:36, Hit : 6734, Vote : 1147
 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;


머~ 기타등등 내용이 정리를 하지 못해서 생략한 부분이 있지만, 약간의 수정만 하면 더 좋은 소스가 되겠죠? TreeView나 기타 ImageList를 사용하는 콤포넌트에서두 쓰일 수 있겠네염~
도움이 되었나 몰겠네~

담에 또 바여~~~~~ 빠~~~~~~~~~~~~!! ^^





731   [COM/OLE] 떠있는 모든 Microsoft Internet Explorer 의 html 불러오기  김영대 2003/03/30 5861 1444
730   [윈도우즈 API] IE의 "즐겨찾기 구성" 화면 띄우기  김영대 2003/03/30 5818 1887
729   [윈도우즈 API] 데스크탑의 현재 커서위치의 타이틀명과 클래스명 구하기  김영대 2003/03/29 4491 1136
728   [윈도우즈 API] 떠있는 모든 Microsoft Internet Explorer 죽이기  김영대 2003/03/29 4705 1324
727   [시스템] 윈도우즈 전체의 마우스/키보드 입력 금지  김영대 2003/03/29 5344 1350
726   [네트웍/인터넷] 인터넷에 접속되어 있는지 검사하기  김영대 2003/03/29 5363 1307
725   [일반/컴포넌트] TMemo 스크롤 다운 시키기  김영대 2003/03/29 4772 1380
724   [윈도우즈 API] 전체 화면(Full Screen) 만들기  김영대 2003/03/29 5166 1330
723   [윈도우즈 API] "시작"->"프로그램" 메뉴에 폴더 추가하기  김영대 2003/03/29 4927 1263
722   [윈도우즈 API] 폼이 Minimized 되었을때 깜박이게 하기  김영대 2003/03/29 6241 1647
721   [일반/컴포넌트] ListBox에서 마우스 이동시 아이템을 힌트로 보여주기  김영대 2003/03/27 4188 1116
720   [시스템] DOS 명령어 실행하고 결과 받아오기  김영대 2003/03/27 5238 1286
719   [윈도우즈 API] 액티브 데스크탑에 웹 컨텐트가 표시중인지 알기  김영대 2003/03/27 4290 1195
718   [윈도우즈 API] 작업표시줄의 시계 감추기/보이기  김영대 2003/03/27 7294 1993
717   [일반/컴포넌트] 커서(Cursor)의 이미지 구하기  김영대 2003/03/27 4631 1287
716   [윈도우즈 API] 스크린 세이버 On/Off  김영대 2003/03/27 4090 1038
715   [윈도우즈 API] 휴지통 비우기  김영대 2003/03/27 5269 1315
714   [일반/컴포넌트] IE Toolbar 에 버튼 올리기  김영대 2003/03/26 12416 1216
713   [일반/컴포넌트] 기본 Popup Memu 띄우지 않기  김영대 2003/03/26 3801 1021
712   [윈도우즈 API] "임시 인터넷 파일" 전부 지우기  김영대 2003/03/26 5272 1256
711   [일반/컴포넌트] 설치된 모든 프로그램 읽어오기  김영대 2003/03/26 5669 1469
710   [데이터베이스] DBGrid 의 현재 커서의 행/열 구하기  김영대 2003/03/26 5258 1275
709   [일반/컴포넌트] INF 파일 설치하기  김영대 2003/03/26 5224 1295
708   [데이터베이스] BDE Alias 없이 Database 동적으로 연결하기  신훈재 2003/03/24 12765 1131
707   [COM/OLE] Win2k, Win Xp - Active X - Dax error : Access violation해결(IE상에서)  신훈재 2003/03/20 6865 1205
706   [데이터베이스] ORA-12571: TNS:packet writer failure  김영대 2003/03/19 9638 1374
705   [데이터베이스] DBGrid 의 모든 Row 를 Select 시키기(SelectAll)  김영대 2003/03/18 4413 1047
704   [데이터베이스] index file의 갯수와 성능 문제  김영대 2003/03/17 5294 1377
  [일반/컴포넌트] ListView에 확장자별 아이콘 넣기  신훈재 2003/03/15 6734 1147
702   [일반/컴포넌트] ScrollBox 에 배경그림 넣기  김영대 2003/03/14 4004 1089
701   [시스템] '응답없음' 프로세서를 감지하는 잼나는 방법  구창민 2003/03/14 10220 1312
700   [윈도우즈 API] 입력을 기다리는 풀스크린 콘솔 윈도우 만들어 보기  구창민 2003/03/14 6506 1125
699   [일반/컴포넌트] 특정 레지스트리 키 의 모든 목록을 한방에! 읽어오기  구창민 2003/03/14 5101 972
698   [일반/컴포넌트] 트레이 아이콘에 풍선 힌트 보여주기  구창민 2003/03/14 6815 1314
697   [윈도우즈 API] 외부 프로그램의 상태표시줄의 Text 가져오기  구창민 2003/03/14 5739 1302
696   [시스템] IP Address 윈도우 폼위에 만들어보기  구창민 2003/03/14 5532 1266
695   [시스템] 특정 DLL 의 함수목록을 구해보자.  구창민 2003/03/14 5615 1184
694   [시스템] 쓰레드 내에서 폼을 생성해보자  구창민 2003/03/14 5712 1189
693   [윈도우즈 API] 외부 프로그램 모달 창처럼 띄워서 종료될때 기다리기(시점 알기)  구창민 2003/03/14 5582 1243
692   [일반/컴포넌트] 컴포넌트에 오픈다이얼로그를 띄우는 속성 만드는 방법  구창민 2003/03/14 3993 1011

[1][2][3][4][5][6] 7 [8][9][10]..[25] [다음 10개]
 

Copyright 1999-2023 Zeroboard / skin by zero