System ICon을 ImageList에 가져오고 파일에 따라 보여주기

자신의 컴퓨터에 확장자에 맞는 아이콘을 가져 와서 ImageList에 넣어 줄때 사용하는 함수이다. Uses문에 ShellAPI, ShlObj를 추가한뒤에 사용한다. 전에 만들어 두었던것이 사라져서 다시 만들었다.

procedure GetSysstemICon(sImageList, lImageList: TImageList);
var
  sfi: TShFileInfo;
begin
  // ImageList에 파일의 내용을 넣는다.
  // get access to the shell imagelist...
  sImageList.handle := shgetfileinfo('', 0, sfi, sizeof(TShFileInfo), SHGFI_SYSICONINDEX or SHGFI_SMALLICON);
  sImageList.shareimages := true;
  sImageList.BlendColor := clHighlight;
  lImageList.handle := shgetfileinfo('', 0, sfi, sizeof(TShFileInfo), SHGFI_SYSICONINDEX or SHGFI_LARGEICON);
  lImageList.shareimages := true;
  lImageList.BlendColor := clHighlight;
end;

아래 함수는 화일의 정보를 가져온다.
뭐, 대충 파라미터를 보면 알겠지만, Full Path + 화일명을 넣어주면 확장자 정보 및 사이즈,
날짜등을 얻어온다.

procedure FileInfo( sFileName : String; var iIconIndex : Integer;
                    var lFileSize : LongInt; var sFileType : String;
                    Var dCreateDate, dUpdateDate, dLastDate : TDateTime );
var
  ShFileInfo: TShFileInfo;
  SearchRec : TSearchRec;
  FindHandle :THandle;
  function GetFileDateTime(FileDateTime: TFileTime): TDateTime;
  var
    LTime : TFileTime;
    Systemtime : TSystemtime;
  begin
    FileTimeToLocalFileTime( FileDateTime, LTime);
    FileTimeToSystemTime( LTime, SystemTime );
    Result := SystemTimeToDateTime( SystemTime );
  end;
  function GetFileSize( FS : LongInt ) : LongInt;
  begin
    Result := FS Div 1024;
    if Result <> ( Fs / 1024 ) then
      Result := Result  + 1;
  end;
begin
 
  shgetfileinfo(pChar( sFileName ),
    0,ShFileInfo,SizeOf( TShFileInfo ), SHGFI_USEFILEATTRIBUTES or 
    SHGFI_ICON or SHGFI_SYSICONINDEX or SHGFI_SMALLICON or SHGFI_EXETYPE
       or SHGFI_TYPENAME );  // <-- 화일 정보를 얻어 온다.
    // SHGFI_PIDL or SHGFI_ICON or SHGFI_ATTRIBUTES); <-- ICon그림을 직접 가져올때..

  iIconIndex := ShFileInfo.iIcon;
    
  sFileType := ShFileInfo.szTypeName; // 파일종류(Type)

  If FindFirst( sFileName, faAnyFile, SearchRec ) = 0 Then
  try
    lFileSize     := GetFileSize( SearchRec.FindData.nFileSizeHigh * MAXDWORD 
                                  + SearchRec.FindData.nFileSizeLow );
    dCreateDate   := GetFileDateTime( SearchRec.FindData.ftCreationTime );  
    dUpdateDate   := GetFileDateTime( SearchRec.FindData.ftLastWriteTime ); 
    dLastDate     := GetFileDateTime( SearchRec.FindData.ftLastAccessTime );
  finally
    FindClose( SearchRec );
  end;
end;

 

Author: yyjksw