델파이를 사용하여 파일 확장에서 아이콘과 설명을 얻는 방법은 무엇입니까?

StackOverflow https://stackoverflow.com/questions/829843

문제

기본적으로 다양한 파일 이름을 나열하는 tcxgrid를 가지고 있으며 파일 확장자, 특히 설명 (예 : .pdf it it it it it it it it it it it it it it it it it it it it it it it it it it it it it it it it it it it it it it it it it it it it it it it it it it it it it it it it it it it it it it description)을 사용하고 싶습니다.

나는 이미 매우 비슷한 질문입니다 그러나 그것은 C# 관련이며 델파이 기반의 무언가를 원합니다.

이런 종류의 정보를 찾아야 할 곳에 대한 제안은 좋을 것이며 위의 C# 게시물 (델파이에서)에 언급 된 수업과 비슷한 수업이 있다면 좋을 것입니다.

도움이 되었습니까?

해결책

Shgetfileinfo의 방향을 가리킨 Rob Kennedy에게 감사드립니다. 그런 다음 그것에 대해 검색 하고이 두 가지 예를 찾았습니다. 델파이 3000, 토리. 그로부터 나는 필요한 일을하기 위해 다음 수업을 썼습니다.

또한 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의 개발자 Express TCXIMAGECOMBOX 박스와 함께했습니다.

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.

답변 해 주셔서 감사합니다!

다른 팁

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;

부르다 ShGetFileInfo. 설명 (해당 함수의 어휘에서 "유형 이름")을 알려주고 아이콘 핸들 또는 아이콘이있는 시스템 이미지 목록 또는 보유 된 모듈의 경로를 제공 할 수 있습니다. 이미지 리소스. 이 기능은 여러 가지 다른 작업을 수행 할 수 있으므로 문서를주의 깊게 읽으십시오.

MSDN은 말합니다 ShGetFileInfo "느리게 될 수있다"고 전화를한다 IExtractIcon 인터페이스 "보다 유연하고 효율적인"대안. 그러나 권장하는 순서는 An을 사용하는 것입니다 IShellFolder 인터페이스를 한 다음 호출하십시오 GetUIObjectOf 파일을 얻으려면 IExtractIcon 인터페이스를 한 다음 호출하십시오 GetIconLocation 그리고 Extract 아이콘의 손잡이를 검색합니다.

내가 아는 전부에 바로 그게 바로 무엇입니다 ShGetFileInfo 어쨌든 그렇게하지만 훨씬 더 번거롭고 모든 작업을 수행 한 후에도 여전히 파일 유형 설명이 없습니다. 고수 ShGetFileInfo 속도와 효율성이 눈에 띄는 문제가 될 때까지.

uses ShellAPI;

var
AExtension: string;
AFileType: string;    
AListItem: TListItem;
AFileInfo: TSHFileInfo;
begin
// get the extensions file icon
AExtension := ExtractFileExt( FileName );
if SHGetFileInfo( PChar( '*' + AExtension ), FILE_ATTRIBUTE_NORMAL, AFileInfo, SizeOf
  ( AFileInfo ), SHGFI_SYSICONINDEX or SHGFI_SMALLICON or SHGFI_USEFILEATTRIBUTES ) <> 0 then
  AIndex := AFileInfo.iIcon
else
  AIndex := -1;
AListItem.ImageIndex := AIndex;
// get extensions file info
if SHGetFileInfo( PChar( '*' + AExtension ), FILE_ATTRIBUTE_NORMAL, Info, SizeOf( Info ),
  SHGFI_TYPENAME or SHGFI_USEFILEATTRIBUTES ) then
    AFileType := AFileInfo.szTypeName;
end;

소리를 내지 말고 Google은 친구입니다. 다음은 "Delphi Association Icon"의 첫 번째 결과는 다음과 같습니다.

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

http://www.jpgriffiths.com/tutorial/snippets%5cgetAssociatedicon.html

다른 방법은 HKEY_CLASSES_ROOT의 레지스트리의 확장자를 찾은 다음 기본값 (사용 가능한 경우)의 키를 따르고 기본값은 설명입니다. 이 두 번째 레벨은 또한 쉘 명령을 열거나 파일 유형과 기본 아이콘으로가는 경로를 인쇄 할 수있는 곳입니다.

다음은 bitwisemag.com에서 shgetfileinfo를 사용하는 몇 가지 좋은 예입니다.

http://www.bitwisemag.com/copy/delphi/lpad1.html

http://www.bitwisemag.com/copy/delphi/prog_groups2.html

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top