Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Windows 如何使用Delphi从文件扩展名中获取图标和描述?_Windows_Delphi_Icons_File Association - Fatal编程技术网

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

Windows 如何使用Delphi从文件扩展名中获取图标和描述?,windows,delphi,icons,file-association,Windows,Delphi,Icons,File Association,基本上,我有一个TcxGrid,它将列出各种文件名,我想根据文件扩展名提供更多详细信息,特别是它的描述(例如,对于.PDF,它是“Adobe Acrobat文档”)及其相关图标 我注意到有一个,但它与C#相关,我想要一些基于Delphi的东西 关于在哪里查找此类信息的建议很好,如果有一个类与上面C#post(显然是Delphi)中提到的类相似,那就太好了。听起来不油嘴滑舌,但谷歌是你的朋友。以下是“delphi关联图标”的几个初步结果: 打电话。它可以告诉您描述(该函数词汇表中的“类型名称”)

基本上,我有一个TcxGrid,它将列出各种文件名,我想根据文件扩展名提供更多详细信息,特别是它的描述(例如,对于.PDF,它是“Adobe Acrobat文档”)及其相关图标

我注意到有一个,但它与C#相关,我想要一些基于Delphi的东西


关于在哪里查找此类信息的建议很好,如果有一个类与上面C#post(显然是Delphi)中提到的类相似,那就太好了。

听起来不油嘴滑舌,但谷歌是你的朋友。以下是“delphi关联图标”的几个初步结果:

打电话。它可以告诉您描述(该函数词汇表中的“类型名称”),还可以给您一个图标句柄,或系统映像列表的句柄,图标所在的位置,或包含映像资源的模块的路径。这个函数可以做很多不同的事情,所以一定要仔细阅读文档

ShGetFileInfo
“可能很慢”,并将该接口称为“更灵活、更高效”的替代方案。但它建议的顺序是使用一个接口,然后调用获取文件的
iextractcon
接口,然后调用并在其上检索图标的句柄


据我所知,这正是
ShGetFileInfo
所做的,但它要麻烦得多,而且在完成所有这些之后,仍然不会有文件的类型描述。坚持使用
ShGetFileInfo
,直到速度和效率成为一个明显的问题。

另一种方法是在注册表中的HKEY_CLASSES_ROOT下查找扩展名,然后按照默认值(如果可用)中的键进行操作,默认值是描述。在第二级中,您还可以获取要打开的shell命令,或打印文件类型以及默认图标的路径。

以下是使用bitwisemag.com上的ShGetFileInfo的几个好例子:

使用ShellAPI;
变量
AExtension:字符串;
文件类型:字符串;
AListItem:TListItem;
AFileInfo:TSHFileInfo;
开始
//获取扩展文件图标
AExtension:=ExtractFileExt(文件名);
如果SHGetFileInfo(PChar('*'+AExtension),文件属性正常,AFileInfo,SizeOf
(AFileInfo)、SHGFI_SYSICONINDEX或SHGFI_SMALLICON或SHGFI_USEFILEATTRIBUTES)0,然后
AIndex:=AFileInfo.iIcon
其他的
AIndex:=-1;
AListItem.ImageIndex:=AIndex;
//获取扩展名文件信息
如果SHGetFileInfo(PChar('*'+AExtension)、文件属性(NORMAL)、信息、大小(Info),
SHGFI_TYPENAME或SHGFI_USEFILEATTRIBUTES)然后
AFileType:=AFileInfo.szTypeName;
结束;
函数GetGenericFileType(AExtension:string):字符串;
{获取扩展名的文件类型}
变量
AInfo:TSHFileInfo;
开始
SHGetFileInfo(PChar(AExtension)、文件属性正常、AInfo、SizeOf(AInfo),
SHGFI_类型名称或SHGFI_使用文件属性);
结果:=AInfo.szTypeName;
结束;
函数getGenericConIndex(AExtension:string):整数;
{获取扩展类型的图标索引}
变量
AInfo:TSHFileInfo;
开始
如果SHGetFileInfo(PChar(AExtension)、文件属性正常、AInfo、SizeOf(AInfo),
SHGFI_SYSICONINDEX或SHGFI_SMALLICON或SHGFI_USEFILEATTRIBUTES)0,然后
结果:=AInfo.iIcon
其他的
结果:=-1;
结束;
函数GetGenericFileIcon(AExtension:string):TIcon;
{获取扩展的图标}
变量
AInfo:TSHFileInfo;
爱康:提康;
开始
如果SHGetFileInfo(PChar(AExtension)、文件属性正常、AInfo、SizeOf(AInfo),
SHGFI_SYSICONINDEX或SHGFI_SMALLICON或SHGFI_USEFILEATTRIBUTES)0,然后
开始
AIcon:=TIcon.Create;
尝试
AIcon.Handle:=AInfo.hIcon;
结果:=AIcon;
除了
爱康免费;
提高;
结束;
结束
其他的
结果:=无;
结束;

感谢Rob Kennedy为我指明了ShGetFileInfo的方向。然后我在谷歌上找到了这两个例子-。从那以后,我写了下面的课程来做我需要的事情

而且,就在我完成比尔·米勒的回答时,他给了我最后一点我需要的帮助。最初,我将完整的文件名传递给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),
                    FILE_ATTRIBUTE_NORMAL,
                    FileInfo,
                    SizeOf(FileInfo),
                    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.

谢谢大家的回答

谢谢比尔的两个答案。我注意到您只能够将扩展名传递给SHGetFileInfo(我使用的是完整的文件名),因此我相应地调整了代码。感谢Bruce提供的指针,不幸的是,这并不是我想要的。我也在追求描述。另外,我只是想试试StackOverflow,看看它有什么德尔福的专业知识,我不认为它做得太差!注意:当传递完整文件名时,像“%1”这样的快捷方式作为图标或位图文件的快捷方式将为每个特定文件生成正确的结果。*。ext在这种情况下只显示一个通用图标。@Martijn,使用“%1”是什么意思?你能举个例子吗?@pcunite:我现在发现我的评论不是很清楚。在某些情况下,“%1”被定义为文件类型的默认图标;这通常是
.ico
文件的情况:每个图标文件本身都包含要显示的图标。在这种情况下,使用完整文件名将生成正确的图标。仅在此处使用扩展将生成“通用”图标。
function GetGenericFileType( AExtension: string ): string;
{ Get file type for an extension }
var
  AInfo: TSHFileInfo;
begin
  SHGetFileInfo( PChar( AExtension ), FILE_ATTRIBUTE_NORMAL, AInfo, SizeOf( AInfo ),
    SHGFI_TYPENAME or SHGFI_USEFILEATTRIBUTES );
  Result := AInfo.szTypeName;
end;

function GetGenericIconIndex( AExtension: string ): integer;
{ Get icon index for an extension type }
var
  AInfo: TSHFileInfo;
begin
  if SHGetFileInfo( PChar( AExtension ), FILE_ATTRIBUTE_NORMAL, AInfo, SizeOf( AInfo ),
    SHGFI_SYSICONINDEX or SHGFI_SMALLICON or SHGFI_USEFILEATTRIBUTES ) <> 0 then
  Result := AInfo.iIcon
  else
    Result := -1;
end;

function GetGenericFileIcon( AExtension: string ): TIcon;
{ Get icon for an extension }
var
  AInfo: TSHFileInfo;
  AIcon: TIcon;
begin
  if SHGetFileInfo( PChar( AExtension ), FILE_ATTRIBUTE_NORMAL, AInfo, SizeOf( AInfo ),
    SHGFI_SYSICONINDEX or SHGFI_SMALLICON or SHGFI_USEFILEATTRIBUTES ) <> 0 then
  begin
    AIcon := TIcon.Create;
    try
      AIcon.Handle := AInfo.hIcon;
      Result := AIcon;
    except
      AIcon.Free;
      raise;
    end;
  end
  else
    Result := nil;
end;
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),
                    FILE_ATTRIBUTE_NORMAL,
                    FileInfo,
                    SizeOf(FileInfo),
                    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.
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.