基本上我有一个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.
感谢大家的答案!