Delphi - объектно-ориентированный язык программирования, разработанный компанией Borland в 1995 году. Он основан на языке программирования Pascal, но имеет более расширенные возможности и добавлены новые функции.
Delphi является интегрированной средой разработки (IDE), которая позволяет разрабатывать программное обеспечение для различных платформ, включая Windows, macOS, Android и iOS. Delphi достигает многоплатформенности с помощью...
{How to get icon from a shortcut file ? I have found that if you use a ListView component, to show a list of files in any folder that contains shortcuts, then the shortcut icons do not appear correctly - they do not show the true icon of the application to which they relate. However, there is a a very useful feature of SHGetFileInfo, which is SHGFI_LINKOVERLAY. This adds the shortcut "arrow", which is shown in the bottom left corner of any shortcut icon. The demo code below shows the basic use of the SHGFI_LINKOVERLAY feature. I have added code to this demo, to distingiush between shortcut and non-shortcut files - without this code, it will overlay the shortcut "arrow" irrespective of the file type. To show the icon of a shortcut, the following code can be used as a demo: 1. Add the following components to a new project, and adjust their properties according to the code below: } // Code for DFM file: objectForm1: TForm1 Left = 379 Top = 355 Width = 479 Height = 382 Caption = 'Get Icon from Shortcut File' Color = clBtnFace Font.Charset = DEFAULT_CHARSET Font.Color = clWindowText Font.Height = -11 Font.Name = 'MS Sans Serif' Font.Style = [] OldCreateOrder = False PixelsPerInch = 96 TextHeight = 13 object
ListView: TListView Left = 0 Top = 73 Width = 471 Height = 275 Align = alClient Columns = < item Width = 100 end
item Width = 100 end
> SmallImages = imgList TabOrder = 0 ViewStyle = vsReport end
object
Panel: TPanel Left = 0 Top = 0 Width = 471 Height = 73 Align = alTop TabOrder = 1 object
btnGetFile: TButton Left = 16 Top = 8 Width = 75 Height = 25 Caption = 'Get file' TabOrder = 0 OnClick = btnGetFileClick end
object
btnGetIcon: TButton Left = 104 Top = 8 Width = 75 Height = 25 Caption = 'Get icon' TabOrder = 1 OnClick = btnGetIconClick end
object
edFileName: TEdit Left = 16 Top = 40 Width = 441 Height = 21 TabOrder = 2 end
end
object
dlgOpen: TOpenDialog Filter = 'Shortcut files|*.lnk|All files|*.*' Options = [ofHideReadOnly, ofNoDereferenceLinks, ofEnableSizing] // - this is important ! Left = 248 Top = 8 end
object
imgList: TImageList BlendColor = clWhite BkColor = clWhite Masked = False ShareImages = True Left = 216 Top = 8 end
end
// 2. Add the code to the PAS file below: unit
cdShortCutIcon; interface
uses
Windows, Messages, SysUtils, Variants, Graphics, Controls, Forms, Dialogs, Buttons, ExtCtrls, StdCtrls, StrUtils, ShellAPI, CommCtrl, ImgList, ComCtrls, Classes; type
TForm1 = class
(TForm) dlgOpen: TOpenDialog; ListView: TListView; imgList: TImageList; Panel: TPanel; btnGetFile: TButton; btnGetIcon: TButton; edFileName: TEdit; procedure
btnGetFileClick(Sender: TObject); procedure
btnGetIconClick(Sender: TObject); private
{ Private declarations } public
{ Public declarations } end
; var
Form1: TForm1; implementation
{$R *.dfm} procedure
TForm1.btnGetFileClick(Sender: TObject); begin
{ choose file to get icon from } if
dlgOpen.Execute then
edFileName.Text := dlgOpen.FileName; end
; procedure
TForm1.btnGetIconClick(Sender: TObject); var
Icon : TIcon; ListItem : TListItem; shInfo : TSHFileInfo; sFileType : string
; begin
{ initialise ListView and Icon } ListView.SmallImages := imgList; Icon := TIcon.Create; try
ListView.Items.BeginUpdate; ListItem := listview.items.add;{ Initialise ListView.Item.Add } { get details about file type from SHGetFileInfo } SHGetFileInfo(PChar(edFileName.Text), 0, shInfo, SizeOf(shInfo), SHGFI_TYPENAME); sFileType := shInfo.szTypeName; { is this a shortcut file ? } if
shInfo.szTypeName = 'Shortcut' then
SHGetFileInfo(PChar(edFileName.Text), 0, shInfo, SizeOf(shInfo), SHGFI_LINKOVERLAY or
SHGFI_ICON or
SHGFI_SMALLICON or
SHGFI_SYSICONINDEX) else
{ ...otherwise treat it as a normal file} SHGetFileInfo(PChar(edFileName.Text), 0, shInfo, SizeOf(shInfo), SHGFI_ICON or
SHGFI_SMALLICON or
SHGFI_SYSICONINDEX); { assign icon } Icon.Handle := shInfo.hIcon; { List File name, Icon and FileType in ListView} ListItem.Caption := ExtractFileName(edFileName.Text); //...add filename ListItem.SubItems.Add(sFileType); //...and filetype.. ListItem.ImageIndex := imgList.AddIcon(Icon); //...and icon. finally
ListView.Items.EndUpdate; //..free memory on icon and clean up. sFileType := ''; Icon.Free; end
; end
; end
.