Windows – 如何使用Delphi从文件扩展名获取图标和描述?
发布时间:2020-12-13 20:07:47 所属栏目:Windows 来源:网络整理
导读:基本上我有一个TcxGrid,它将列出各种文件名,我想根据文件扩展名进一步提供详细信息,特别是描述(例如.PDF是“Adobe Acrobat Document”),它是相关图标. 我注意到有一个very similar question already,但它是C#相关,我想要一些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,因为我有黑色边框出现在图标上的问题,因为它是一个快速的修复. unit FileAssociationDetails; { Created : 2009-05-07 Description : Class to get file type description and icons. * Extensions and Descriptions are held in a TStringLists. * Icons are stored in a TImageList. Assumption is all lists are in same order. } interface uses Classes,Controls; type TFileAssociationDetails = class(TObject) private FImages : TImageList; FExtensions : TStringList; FDescriptions : TStringList; public constructor Create; destructor Destroy; override; procedure AddFile(FileName : string); procedure AddExtension(Extension : string); procedure Clear; procedure GetFileIconsAndDescriptions; property Images : TImageList read FImages; property Extensions : TStringList read FExtensions; property Descriptions : TStringList read FDescriptions; end; implementation uses SysUtils,ShellAPI,Graphics,Windows; { TFileAssociationDetails } constructor TFileAssociationDetails.Create; begin try inherited; FExtensions := TStringList.Create; FExtensions.Sorted := true; FDescriptions := TStringList.Create; FImages := TImageList.Create(nil); except end; end; destructor TFileAssociationDetails.Destroy; begin try FExtensions.Free; FDescriptions.Free; FImages.Free; finally inherited; end; end; procedure TFileAssociationDetails.AddFile(FileName: string); begin AddExtension(ExtractFileExt(FileName)); end; procedure TFileAssociationDetails.AddExtension(Extension : string); begin Extension := UpperCase(Extension); if (Trim(Extension) <> '') and (FExtensions.IndexOf(Extension) = -1) then FExtensions.Add(Extension); end; procedure TFileAssociationDetails.Clear; begin FExtensions.Clear; end; procedure TFileAssociationDetails.GetFileIconsAndDescriptions; var Icon: TIcon; iCount : integer; Extension : string; FileInfo : SHFILEINFO; begin FImages.Clear; FDescriptions.Clear; Icon := TIcon.Create; try // Loop through all stored extensions and retrieve relevant info for iCount := 0 to FExtensions.Count - 1 do begin Extension := '*' + FExtensions.Strings[iCount]; // Get description type SHGetFileInfo(PChar(Extension),FILE_ATTRIBUTE_NORMAL,FileInfo,SizeOf(FileInfo),SHGFI_TYPENAME or SHGFI_USEFILEATTRIBUTES ); FDescriptions.Add(FileInfo.szTypeName); // Get icon and copy into ImageList SHGetFileInfo(PChar(Extension),SHGFI_ICON or SHGFI_SMALLICON or SHGFI_SYSICONINDEX or SHGFI_USEFILEATTRIBUTES ); Icon.Handle := FileInfo.hIcon; FImages.AddIcon(Icon); end; finally Icon.Free; end; end; end. 这里也是一个使用它的示例测试应用程序,它非常简单,只是一个带有TPageControl的表单.我的实际使用不是为了这一点,而是使用TcxGrid中的Developer Express TcxImageComboxBox. unit Main; { Created : 2009-05-07 Description : Test app for TFileAssociationDetails. } interface uses Windows,Forms,FileAssociationDetails,Classes,Controls,ComCtrls; type TfmTest = class(TForm) PageControl1: TPageControl; procedure FormShow(Sender: TObject); procedure FormClose(Sender: TObject; var Action: TCloseAction); private { Private declarations } FFileDetails : TFileAssociationDetails; public { Public declarations } end; var fmTest: TfmTest; implementation {$R *.dfm} procedure TfmTest.FormShow(Sender: TObject); var iCount : integer; NewTab : TTabSheet; begin FFileDetails := TFileAssociationDetails.Create; FFileDetails.AddFile('C:Documents and Settings...Test.XLS'); FFileDetails.AddExtension('.zip'); FFileDetails.AddExtension('.pdf'); FFileDetails.AddExtension('.pas'); FFileDetails.AddExtension('.XML'); FFileDetails.AddExtension('.poo'); FFileDetails.GetFileIconsAndDescriptions; PageControl1.Images := FFileDetails.Images; for iCount := 0 to FFileDetails.Descriptions.Count - 1 do begin NewTab := TTabSheet.Create(PageControl1); NewTab.PageControl := PageControl1; NewTab.Caption := FFileDetails.Descriptions.Strings[iCount]; NewTab.ImageIndex := iCount; end; end; procedure TfmTest.FormClose(Sender: TObject; var Action: TCloseAction); begin PageControl1.Images := nil; FFileDetails.Free; end; end. 感谢大家的答案! (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- 无法将证书添加到Windows 7中的受信任的根证书颁发机构
- 使用语义记录Windows Azure配置PartitionKey
- windows – 使用WinDbg进一步自动化
- 记 Win10 - Archlinux - Archlinux(Emergency) 三系统安装/
- windows-server-2012 – 有没有理由让电源选项保持默认“平
- windows – 如何使用简单的批处理文件解压缩和覆盖现有文件
- 在Mono上用F#签署DLL的问题
- windows+msys2编译android版ijkplayer
- Microsoft如何决定在C#中使用static / member?
- 闪存驱动器 – 应该格式化NTFS?