Windows – 如何使用Delphi从文件扩展名获取图标和描述?

前端之家收集整理的这篇文章主要介绍了Windows – 如何使用Delphi从文件扩展名获取图标和描述?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
基本上我有一个TcxGrid,它将列出各种文件名,我想根据文件扩展名进一步提供详细信息,特别是描述(例如.PDF是“Adobe Acrobat Document”),它是相关图标.

我注意到有一个very similar question already,但它是C#相关,我想要一些Delphi基础.

关于在哪里寻找这种信息的建议将是好的,如果有类似于上面提到的C#文章(显然在Delphi中),那将是很棒的类.

感谢Rob Kennedy向我指出ShGetFileInfo的方向.然后我Googled,并发现这两个例子 – Delphi 3000,Torry’s.从那我写了下面的类来做我需要的.

此外,正如我完成比尔·米勒的回答给了我需要的最后一点帮助.原来我正在将完整的文件名传递给ShGetFileInfo,这不是我想要的.调整提示通过“* .EXT”是伟大的.

该课程可以做更多的工作,但它需要我做的.似乎处理没有细节关联的文件扩展名.

最后,在我正在使用的我已经把它切换到使用TcxImageList而不是TImageList,因为我有黑色边框出现在图标上的问题,因为它是一个快速的修复.

  1. unit FileAssociationDetails;
  2.  
  3. {
  4. Created : 2009-05-07
  5. Description : Class to get file type description and icons.
  6. * Extensions and Descriptions are held in a TStringLists.
  7. * Icons are stored in a TImageList.
  8.  
  9. Assumption is all lists are in same order.
  10. }
  11.  
  12. interface
  13.  
  14. uses Classes,Controls;
  15.  
  16. type
  17. TFileAssociationDetails = class(TObject)
  18. private
  19. FImages : TImageList;
  20. FExtensions : TStringList;
  21. FDescriptions : TStringList;
  22. public
  23. constructor Create;
  24. destructor Destroy; override;
  25.  
  26. procedure AddFile(FileName : string);
  27. procedure AddExtension(Extension : string);
  28. procedure Clear;
  29. procedure GetFileIconsAndDescriptions;
  30.  
  31. property Images : TImageList read FImages;
  32. property Extensions : TStringList read FExtensions;
  33. property Descriptions : TStringList read FDescriptions;
  34. end;
  35.  
  36. implementation
  37.  
  38. uses SysUtils,ShellAPI,Graphics,Windows;
  39.  
  40. { TFileAssociationDetails }
  41.  
  42. constructor TFileAssociationDetails.Create;
  43. begin
  44. try
  45. inherited;
  46.  
  47. FExtensions := TStringList.Create;
  48. FExtensions.Sorted := true;
  49. FDescriptions := TStringList.Create;
  50. FImages := TImageList.Create(nil);
  51. except
  52. end;
  53. end;
  54.  
  55. destructor TFileAssociationDetails.Destroy;
  56. begin
  57. try
  58. FExtensions.Free;
  59. FDescriptions.Free;
  60. FImages.Free;
  61. finally
  62. inherited;
  63. end;
  64. end;
  65.  
  66. procedure TFileAssociationDetails.AddFile(FileName: string);
  67. begin
  68. AddExtension(ExtractFileExt(FileName));
  69. end;
  70.  
  71. procedure TFileAssociationDetails.AddExtension(Extension : string);
  72. begin
  73. Extension := UpperCase(Extension);
  74. if (Trim(Extension) <> '') and
  75. (FExtensions.IndexOf(Extension) = -1) then
  76. FExtensions.Add(Extension);
  77. end;
  78.  
  79. procedure TFileAssociationDetails.Clear;
  80. begin
  81. FExtensions.Clear;
  82. end;
  83.  
  84. procedure TFileAssociationDetails.GetFileIconsAndDescriptions;
  85. var
  86. Icon: TIcon;
  87. iCount : integer;
  88. Extension : string;
  89. FileInfo : SHFILEINFO;
  90. begin
  91. FImages.Clear;
  92. FDescriptions.Clear;
  93.  
  94. Icon := TIcon.Create;
  95. try
  96. // Loop through all stored extensions and retrieve relevant info
  97. for iCount := 0 to FExtensions.Count - 1 do
  98. begin
  99. Extension := '*' + FExtensions.Strings[iCount];
  100.  
  101. // Get description type
  102. SHGetFileInfo(PChar(Extension),FILE_ATTRIBUTE_NORMAL,FileInfo,SizeOf(FileInfo),SHGFI_TYPENAME or SHGFI_USEFILEATTRIBUTES
  103. );
  104. FDescriptions.Add(FileInfo.szTypeName);
  105.  
  106. // Get icon and copy into ImageList
  107. SHGetFileInfo(PChar(Extension),SHGFI_ICON or SHGFI_SMALLICON or
  108. SHGFI_SYSICONINDEX or SHGFI_USEFILEATTRIBUTES
  109. );
  110. Icon.Handle := FileInfo.hIcon;
  111. FImages.AddIcon(Icon);
  112. end;
  113. finally
  114. Icon.Free;
  115. end;
  116. end;
  117.  
  118. end.

这里也是一个使用它的示例测试应用程序,它非常简单,只是一个带有TPageControl的表单.我的实际使用不是为了这一点,而是使用TcxGrid中的Developer Express TcxImageComBoxBox.

  1. unit Main;
  2.  
  3. {
  4. Created : 2009-05-07
  5. Description : Test app for TFileAssociationDetails.
  6. }
  7.  
  8. interface
  9.  
  10. uses
  11. Windows,Forms,FileAssociationDetails,Classes,Controls,ComCtrls;
  12.  
  13. type
  14. TfmTest = class(TForm)
  15. PageControl1: TPageControl;
  16. procedure FormShow(Sender: TObject);
  17. procedure FormClose(Sender: TObject; var Action: TCloseAction);
  18. private
  19. { Private declarations }
  20. FFileDetails : TFileAssociationDetails;
  21. public
  22. { Public declarations }
  23. end;
  24.  
  25. var
  26. fmTest: TfmTest;
  27.  
  28. implementation
  29.  
  30. {$R *.dfm}
  31.  
  32. procedure TfmTest.FormShow(Sender: TObject);
  33. var
  34. iCount : integer;
  35. NewTab : TTabSheet;
  36. begin
  37. FFileDetails := TFileAssociationDetails.Create;
  38. FFileDetails.AddFile('C:\Documents and Settings\...\Test.XLS');
  39. FFileDetails.AddExtension('.zip');
  40. FFileDetails.AddExtension('.pdf');
  41. FFileDetails.AddExtension('.pas');
  42. FFileDetails.AddExtension('.XML');
  43. FFileDetails.AddExtension('.poo');
  44.  
  45. FFileDetails.GetFileIconsAndDescriptions;
  46. PageControl1.Images := FFileDetails.Images;
  47.  
  48. for iCount := 0 to FFileDetails.Descriptions.Count - 1 do
  49. begin
  50. NewTab := TTabSheet.Create(PageControl1);
  51. NewTab.PageControl := PageControl1;
  52. NewTab.Caption := FFileDetails.Descriptions.Strings[iCount];
  53. NewTab.ImageIndex := iCount;
  54. end;
  55. end;
  56.  
  57. procedure TfmTest.FormClose(Sender: TObject; var Action: TCloseAction);
  58. begin
  59. PageControl1.Images := nil;
  60. FFileDetails.Free;
  61. end;
  62.  
  63. end.

感谢大家的答案!

猜你在找的Windows相关文章