Всем привет. Что-то в последнее время я начал все больше работать с изображениями и компонентом TStringGrid. На этот раз, я захотел попробовать сделать фотогалерею из TStringGrid, используя иконки: bmp, ico (и их названиями), но для начала, я напишу о том, как можно эти иконки получить из EXE или же DLL-файлов.
Поэтому в данной статье мы рассмотрим, как их можно получить, а в следующей, как можно совместить нашу фотогалерею на TStringGrid с данной статьей. Для осуществления такой идеи нам понадобиться сам файл, из которого мы будем извлекать иконки, а также компонент, в котором мы будем их отображать. При этом, иконки мы сможем получать абсолютно любых размеров, но для начала все по порядку.
Нам необходим компонент, в котором мы будем хранить полученные иконки, а также нам необходим компонент, в котором мы будем отображать их. Для этих целей нам подойдет TImageList и TListView, соответсвенно. Поэтому, давайте создадим проект в Delphi и установим на форму следующие компоненты:
- TImageList
- TListView
- TButton – 2 шт
- TEdit
- TOpenDialog
С компонентами TImageList и TListView, мы разобрались, для чего они нам нужны. Один компонент TButton нам необходим для того, чтобы по нажатию мы указывали путь к файлу, с которого нам необходимо получить иконки, а второй, по нажатию на который мы будем, соответственно, получать иконки. TEdit – для отображения пути к файлу, TOpenDialog – для вызова диалога выбора файла. У меня проект выглядит следующим образом:
Поэтому, на событие Onclick кнопки «Выбор», мы напишем следующий код:
procedure TForm1.Button2Click(Sender: TObject);
begin
if OpenDialog1.Execute then
begin
Edit1.Text:=OpenDialog1.FileName;
end;
end;
Тут все понятно и комментировать особого нечего. Для того, чтобы получить список иконок из EXE-файла, нам необходимо в каком-нибудь спецификаторе доступа объявить следующую процедуру:
procedure GetIcons(FileName:String; Image32: TImageList);
Первый параметр процедуры FileName – будет отвечать за сам файл, с которого мы будем получать иконки, а второй параметр Image32, будет отвечать за то, где мы будем хранить иконки. Поэтому ставим курсор на данную процедуру и нажимаем сочетание клавиш Ctrl+Shift+C и заполняем нашу процедуру:
procedure TForm1.GetIcons(FileName: String; Image32: TImageList);
var
icon:TIcon;
Icon32,Icon16:HICON;
i:integer;
begin
try
i:=0;
while Integer(ExtractIconEx(PAnsiChar(FileName),i,Icon16,Icon32,1))>0 do
begin
inc(i);
icon:=TIcon.Create;
icon.Handle:=Icon16;
Image32.AddIcon(icon);
end;
except
on e:Exception do
end;
end;
Тут особого сложного также ничего нет. Здесь нас интересует функция ExtractIconEx, которая имеет следующие параметры:
Function ExtractIconEx(lpszFile:PChar; nIconIndex:Integer; var phiconLarge, phiconSmall:HICON; nIcons:UINT):UINT
- lpszFile – данный параметр содержит путь файла, из которого будут извлекаться значки
- nIconIndex – этот параметр содержит номер значка (иконки), с которого будет извлекаться они. Если данный параметр равен -1, а параметры phiconLarge и phiconSmall равны нулю, то функция возвратит количество значков, которое можно извлечь
- phiconLarge, phiconSmall – в эти параметры помещается дескриптор значков (больших и малых)
- nIcons – этот параметр для указания количества извлекаемых значков из файла
Чуть не забыл, для того, чтобы данная функция работала, необходимо наличие, в проекте, модуля Shallapi. Поэтому в uses следует подключить данный модуль.
Дальше нам остается написать код, который поможет получить и отобразить наши иконки файла. Поэтому, на событие Onclick кнопки «Получить» мы напишем следующий код:
procedure TForm1.Button1Click(Sender: TObject);
var
i:integer;
lItem:TListItem;
begin
try
ListView1.Clear;
ImageList1.Clear;
GetIcons(Edit1.Text,ImageList1);
for i:=0 to ImageList1.Count-1 do
begin
lItem:=ListView1.Items.Add();
lItem.ImageIndex:=i;
end;
except
on e:Exception do
end;
end;
Тут все понятно. Просто заполняем наш компонент TImageList, полученнымb иконками (а получаем мы их, при помощи нашей процедуры GetIcons) и дальше их отображаем в компоненте TListView, присваивая номер иконки.
Сейчас стоит быть немного внимательным, для того, чтобы работало все, необходимо связать эти компоненты между собой. Все зависит от того, какие Вы хотите отображать иконки. Но мы разберем два варианта.
Отображаем маленькие иконки (16 на 16 пикселей).
Например, мы хотим мелкие иконки, например 16 на 16 пикселей. Поэтому, выделяем компонент TImageList и в свойствах Height и Width, выставляем 16. Затем выделяем компонент TListView и в свойстве ViewStyle выбираем vsSmallIcon и в свойстве SmallImages необходимо выбрать тот ImageList, в котором хранятся маленькие иконки, в моем случае TImageList1. В итоге, когда мы скомпилируем проект и укажем путь, к какому-нибудь файлу, у нас должно получиться, что-то похожее:
Отображаем маленькие иконки (32 на 32 пикселей).
Для этого, в свойствах Height и Width, компонента TImageList необходимо выставить 32. Затем выделить компонент TListView и в свойстве ViewStyle выбрать vsIcon, а свойство SmallImages оставить пустым, а LargeImages выбрать тот TImageList, где хранятся большие иконки. В итоге, у нас получиться следующее:
Как видите все просто, в эту статью прикладываю исходные коды, и ждем следующую, где мы совместим все.