unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls, ComCtrls, ImgList, ShellApi;

type
  TForm1 = class(TForm)
    Label1: TLabel;
    txtFile: TEdit;
    cmbBrowse: TButton;
    OpenDialog: TOpenDialog;
    cmbLoadIcon: TButton;
    ImageListLg: TImageList;
    lvwIconsLg: TListView;
    lvwIconsSm: TListView;
    ImageListSm: TImageList;
    procedure cmbLoadIconClick(Sender: TObject);
    procedure cmbBrowseClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

//Процкдура загружает список иконок, сохраненных в EXE- или DLL-файле
//(также из ICO-файлов)
//Заполняет список больших и малых иконок
procedure LoadIcons(filename: String; lgImages, smImages: TImageList);
var
  icon: TIcon;
  smIconHandle, lgIconHandle: HICON;
  i: Integer;
begin
  //Загрузка каждой иконки (неоптимально, но просто)
  i := 0;

  while Integer(ExtractIconEx(PAnsiChar(filename), i,
                              lgIconHandle, smIconHandle, 1)) > 0
  do begin
    Inc(i);
    //Большая иконка
    icon := TIcon.Create;
    icon.Handle := lgIconHandle;
    lgImages.AddIcon(icon);
    //Малая иконка
    icon := TIcon.Create;
    icon.Handle := smIconHandle;
    smImages.AddIcon(icon);
  end;
end;


procedure TForm1.cmbLoadIconClick(Sender: TObject);
var
  i: Integer;
  item: TListItem;
begin
  lvwIconsLg.Clear;
  lvwIconsSm.Clear;

  //Загрузка в иконок ImageList
  ImageListLg.Clear;
  ImageListSm.Clear;
  LoadIcons(txtFile.Text, ImageListLg, ImageListSm);

  //Создание элементов в ListView с большими и малыми иконками
  for i := 0 to ImageListLg.Count - 1 do
  begin
    item := lvwIconsLg.Items.Add();
    item.Caption := 'Icon' + IntToStr(i+1);
    item.ImageIndex := i;

    item := lvwIconsSm.Items.Add();
    item.Caption := 'Icon' + IntToStr(i+1);
    item.ImageIndex := i;
  end;
end;

procedure TForm1.cmbBrowseClick(Sender: TObject);
begin
  if OpenDialog.Execute then
    txtFile.Text := OpenDialog.FileName;
end;

end.
