델파이를 사용하여 파일 확장에서 아이콘과 설명을 얻는 방법은 무엇입니까?
-
06-07-2019 - |
문제
기본적으로 다양한 파일 이름을 나열하는 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를 사용하는 몇 가지 좋은 예입니다.