Как получить значок и описание от расширения файла с помощью Delphi?

Чтобы перечислить все дизайны сайтов, используйте:

Get-SPOSiteDesign | select Id, Title, Description

Чтобы удалить дизайн сайтов, используйте:

Remove-SPOSiteDesign -Identity "site-design-id"

Не забудьте также очистить сценарии сайтов, используемые в удаленных дизайнах сайтов. [118 ]

Get-SPOSiteScript | select Id, Title, Description
Remove-SPOSiteScript -Identity "site-script-id"

Если вы хотите удалить все дизайны сайтов и сценарии сайтов за один раз, вы можете использовать каналы PowerShell:

Get-SPOSiteDesign | Remove-SPOSiteDesign
Get-SPOSiteScript | Remove-SPOSiteScript

Ссылка:
https : //docs.microsoft.com/en-us/sharepoint/dev/declarative-customization/site-design-powershell

blockquote>

13
задан Community 23 May 2017 в 11:45
поделиться

7 ответов

Спасибо Робу Кеннеди за то, что он указал мне в направлении ShGetFileInfo. Затем я гуглил и нашел эти два примера - 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),
                    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 на нем. Мое реальное использование было не для этого, а для Developer TcxImageComboxBox в TcxGrid.

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.

Спасибо всем за ваши ответы!

17
ответ дан 1 December 2019 в 21:38
поделиться
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;
3
ответ дан 1 December 2019 в 21:38
поделиться
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;
2
ответ дан 1 December 2019 в 21:38
поделиться

Не звучит беспечно, но Google - ваш друг. Вот несколько первых результатов для «значка, ассоциированного с delphi»:

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

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

1
ответ дан 1 December 2019 в 21:38
поделиться

Вот несколько хороших примеров использования ShGetFileInfo из bitwisemag.com :

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

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

0
ответ дан 1 December 2019 в 21:38
поделиться

Вызвать ShGetFileInfo . Он может рассказать вам описание («имя типа» в словаре этой функции) и может дать вам дескриптор значка или дескриптор списка системных изображений, где находится значок, или путь к модулю, который содержит ресурс изображения. Эта функция может делать много разных вещей, поэтому обязательно внимательно прочитайте документацию.

MSDN говорит ShGetFileInfo «может быть медленным» и называет интерфейс IExtractIcon «более гибким». и эффективная альтернатива. Но рекомендуемая последовательность состоит в том, чтобы использовать интерфейс IShellFolder , а затем вызвать GetUIObjectOf , чтобы получить интерфейс файла IExtractIcon , и затем вызовите GetIconLocation и Extract на нем, чтобы получить дескриптор значка.

Насколько я знаю, это именно то, что ShGetFileInfo делает в любом случае, но это очень более громоздким, и после того, как вы все это сделали, у вас все равно не будет описания типа файла. Придерживайтесь ShGetFileInfo , пока скорость и эффективность не станут заметной проблемой.

2
ответ дан 1 December 2019 в 21:38
поделиться

Другой метод - найти расширение в реестре в HKEY_CLASSES_ROOT, а затем следовать ключу в значении по умолчанию (если доступно), по умолчанию - описание. На этом втором уровне вы также можете получить команды оболочки для открытия или распечатать тип файла, а также путь к значку по умолчанию.

0
ответ дан 1 December 2019 в 21:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: