15

基本的に、さまざまなファイル名をリストする TcxGrid があり、ファイル拡張子、具体的にはその説明 (たとえば、.PDF の場合は「Adobe Acrobat Document」) と関連するアイコンに基づいて詳細を説明したいと思います。

すでに非常によく似た質問があることに気付きましたが、それは C# 関連であり、Delphi ベースのものが欲しいです。

この種の情報をどこで探すべきかについての提案は適切であり、上記の C# の投稿 (明らかに Delphi で) に記載されているものと同様のクラスがあれば、それは素晴らしいことです。

4

7 に答える 7

19

ShGetFileInfo の方向性を教えてくれた Rob Kennedy に感謝します。それから私はそれをグーグルで検索し、これらの2つの例を見つけました- Delphi 3000Torry's。それから、必要なことを行うために次のクラスを作成しました。

また、Bill Miller の回答を書き終えようとしていたときに、必要な最後の助けが得られました。もともと、完全なファイル名を ShGetFileInfo に渡していましたが、これは理想的ではありませんでした。「*.EXT」を渡すことを提案した微調整は素晴らしかったです。

クラスはより多くの作業を行うことができますが、私が必要とすることを行います。詳細が関連付けられていないファイル拡張子も処理するようです。

最後に、私が使用しているものでは、TImageList の代わりに TcxImageList を使用するように切り替えました。これは、アイコンに黒い境界線が表示されるという問題があったためです。これは簡単な修正でした。

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.

また、これを使用したテスト アプリの例を示します。これは非常に単純で、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.

回答ありがとうございます。

于 2009-05-07T14:28:56.243 に答える
3

を呼び出しShGetFileInfoます。説明(その関数の語彙の「タイプ名」)を教えてくれ、アイコンハンドル、アイコンが存在するシステムイメージリストへのハンドル、または保持しているモジュールへのパスを教えてくれます。画像リソース。この関数はさまざまなことを実行できるため、ドキュメントを注意深く読んでください。

MSDNは ShGetFileInfo「遅いかもしれない」と言っており、IExtractIconインターフェースを「より柔軟で効率的な」代替手段と呼んでいます。ただし、推奨される順序は、インターフェイスを使用しIShellFolder、を呼び出しGetUIObjectOfてファイルのIExtractIconインターフェイスを取得し、それを呼び出しGetIconLocationExtractアイコンのハンドルを取得することです。

私が知っている限りでは、ShGetFileInfoそれはとにかく正確に行うことですが、それははるかに面倒であり、それをすべて行った後でも、ファイルのタイプの説明はありません。速度ShGetFileInfoと効率が目立つ問題になるまで続けてください。

于 2009-05-06T16:13:36.143 に答える
3
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;
于 2009-05-07T14:00:08.763 に答える
1

口下手ではありませんが、Google はあなたの味方です。「デルファイ関連アイコン」の最初の結果のいくつかを次に示します。

http://www.delphi3000.com/articles/article_453.asp?SK=

http://www.jpgriffiths.com/tutorial/Snippets%5Cgetassociatedicon.html

于 2009-05-06T14:38:21.457 に答える
0

もう 1 つの方法は、レジストリの HKEY_CLASSES_ROOT の下にある拡張機能を探し出し、デフォルト値 (利用可能な場合) のキーをたどることです。デフォルト値は説明です。この第 2 レベルでは、シェル コマンドを開いたり、ファイル タイプやデフォルト アイコンへのパスを出力したりできます。

于 2009-05-06T16:35:00.943 に答える