Чтение онлайн

на главную

Жанры

Шрифт:
...

Листинг 4.34.

Остановка копирования при закрытии формы

procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose:

Boolean);

begin

//Останавливаем процесс копирования

bCancelCopy := True;

end;

Как вариант, можно запретить закрытие формы (установить CanClose в False), не останавливая копирования.

В том случае, когда копируется несколько файлов, можно ввести дополнительный элемент управления Progress Ваг, отображающий ход всего процесса копирования. Только при этом придется заранее определить общий размер копируемых файлов.

Определение значков, ассоциированных с файлами

Рассмотрим еще один интересный пример, позволяющий получить значок файла, показываемый, например, в Проводнике Windows.

Приведенная в листинге4.35 функция принимает в качестве параметра путь файла и флаг, определяющий, какой нужен значок – малый или большой. Она возвращает дескриптор экземпляра значка, ассоциированного с файлом. Реализация функции находится в модуле ShellFunctions, расположенном на диске, прилагаемом к книге, в папке с названием раздела.

...

Листинг 4.35.

Определение значка файла

function GetFileIcon(filename: String; small: Boolean = False ): HICON;

var

info: SHFILEINFO;

flags: Cardinal;

begin

flags := SHGFI_ICON;

if small then

//Получение малого значка

flags := flags or SHGFI_SMALLICON

else

//Получение большого значка

flags := flags or SHGFI_LARGEICON;

ZeroMemory(Addr(info), SizeOf(info));

//Получение значка

SHGetFileInfo(PAnsiChar(filename), 0, info, SizeOf(info), flags);

GetFileIcon := info.hIcon;

end;

Используемая в листинге 4.35 API-функция SHGetFilelnfo объявлена в модуле ShellApi. Там же объявлена структура SHFILEINFO.

В листинге 4.36 приведен пример использования функции GetFilelcon: здесь полученные значки сохраняются в элементах управления Image (по одному для большого и малого значков).

...

Листинг 4.36.

Пример получения значка заданного файла (или папки)

procedure TForm1.cmbLoadIconClick(Sender: TObject);

begin

//Определение большого и малого значков файла

imgLarge.Picture.Icon.Handle := GetFileIcon(txtFile.Text);

imgSmall.Picture.Icon.Handle := GetFileIcon(txtFile.Text, True);

end;

Пример определения значка файла приводится на рис. 4.10.

Рис. 4.10. Определение значка, ассоциированного с файлом

На самом деле функция из листинга 4.35 может определять значки не только файлов, но и каталогов, дисков и виртуальных папок ( Мой компьютер, Рабочий стол, Панель управления и т. д.). Правда, в последнем случае используемая в листинге API-функция SHGetFilelnfo требует первый параметр специального вида (не строка). Частично работа с таким представлением путей рассмотрена в подразд. «Окно выбора папки» разд. 2.4.

В заключение скажем несколько слов о прочих полезных возможностях API-функции SHGetFileInf о. Недаром она называется не SHGetFilelcon или что-то подобное: она позволяет получить гораздо больше информации, нежели просто значок файла. Эта информация зависит от набора флагов, передаваемых в функцию в качестве последнего параметра. Но сначала рассмотрим, из каких полей состоит структура SHFILEINFO, потому что результат (за редким исключением) помещается именно в ее поля:

• hIcon (типа HICON) – дескриптор значка заданного путем объекта (первый параметр функции SHGetFilelnfo);

• iIcon (типа Integer) – номер значка в системном компоненте ImageList;

• dwAttributes (типа DWORD) – атрибуты заданного путем объекта;

• szDisplayName (типа array [0. МАХ_РАТН-1] of AnsiChar) – буфер для имени заданного объекта (например, сочетание имени и метки диска, отображаемое в Проводнике Windows);

• szTypeName (типа array [0..79] of AnsiChar) – буфер для названия типа файла (например, Документ Microsoft Word).

На полях dwAttributes и ilcon подробно останавливаться не будем, зато рассмотрим, как заставить функцию SHGetFilelnfo заполнить остальные поля структуры (их проще всего использовать в Delphi). Вот используемые для этого флаги (имена целочисленных констант):

• SHGFIICON – поле hlcon заполняется дескриптором значка, ассоциированного с объектом; если при использовании дескриптор не сохраняется в каком-либо контейнере или прочем объекте, автоматически удаляющем ненужные значки (как в листинге 4.36), то после использования значок нужно удалить вручную (API-функция Destroylcon);

• SHGFI_LARGEICON, SHGFI_SMALLICON –

ОНИ применяются В комбинации с SHGFIICON для получения большого или малого значков соответственно; использование флагов вместе не имеет смысла (будет получен малый значок);

• SHGFI_DISPLAYNAME—при наличии этого флага поле szDisplayName будет содержать дружественное пользователю имя объекта (например, System (С:));

• SHGFI_EXETYPE – при наличии этого атрибута полез zTypeName будет заполнено текстовым описанием типа файла.

Значения в приведенном списке можно, если не сказано иное, комбинировать при помощи операции битового ИЛИ (or).

Извлечение значков из ЕХЕ– и DLL-файлов

Наверняка вы знаете, что исполняемый файл, помимо кода программы, данных и прочей системной информации, может содержать также ресурсы. Так, из секции ресурсов берутся значки для ЕХЕ-файлов. Также в ЕХЕ– или DLL-файлах помещаются значки, используемые для ассоциированных с приложениями документов. Итак, в завершение главы рассмотрим еще один графический пример: создадим программу, способную извлекать упомянутые значки из DLL– или ЕХЕ-файлов (работает также и для ICO-файлов).

Пусть мы имеем путь файла, а также два списка (TImageList) для больших и малых значков соответственно. Тогда процедура, заполняющая списки значками, извлеченными из файла, может выглядеть следующим образом (листинг 4.37).

...

Листинг 4.37.

Составление списков значков

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;

В листинге 4.37 для извлечения значков из файла используется очередная полезная функция модуля ShellApi – Extract IconEx. Прототип функции таков:

...

function ExtractIconEx(lpszFile: PChar; nIconIndex: Integer;

var phiconLarge, phiconSmall: HICON;

nIcons: UINT): UINT;

Функция ExtractlconEx принимает следующие параметры:

• lpszFile – путь файла, из которого извлекаются значки;

• nIconlndex – номер первого извлекаемого значка; нумерация начинается с нуля (если номер равен -1 и параметры piconLarge и piconSmall нулевые, то функция возвращает количество значков в файле);

• piconLarge, piconSmall – ссылки на переменные типа HI CON (либо на первые элементы массива array. of HICON) для помещения в них дескрипторов больших и малых значков соответственно;

• nIcons – количество извлекаемых значков (по сути, может быть количество элементов в передаваемых в функцию массивах: лишние элементы не будут заполнены).

Функция возвращает количество значков, извлеченных из файла, или количество значков в файле при соответствующем значении параметра nlconlndex.

В листинге 4.36 используется не совсем оптимальный способ извлечения значков из файла – по одному. Однако он подойдет для большинства случаев. Другой (но не единственный) вариант – использование массива. Тогда функцииЕх^асИсопЕх передаются первые элементы массивов для дескрипторов значков (функции нужен адрес начала массива), а в качестве последнего параметра – количество элементов в массиве. Таким образом, если количество значков в файле превзойдет количество элементов в массиве, то вызов функции ExtractlconEx можно будет повторить, передав в качестве параметра nlconlndex значение, возвращенное функцией ExtractlconEx, умноженное на номер вызова функции (начиная с нуля).

Можно также использовать динамический массив, предварительно установив его размер, вызвав функцию ExtractlconEx с параметром nlconlndex, равным -1. Установить значения параметров piconLarge, piconSmall в ноль (не меняя объявления функции) можно, объявив указатель на HICON (AHICON), присвоив ему значение nil и передав его в качестве упомянутых параметров в функцию.

На рис. 4.11 приводится внешний вид формы приложения после извлечения значков из файла Explorer. ехе.

Обработчик нажатия кнопки Загрузить значки представленной н а рис. 4.11 формы приводится в листинге 4.38.

Поделиться:
Популярные книги

Поступь Империи

Ланцов Михаил Алексеевич
7. Сын Петра
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Поступь Империи

Мастер Разума

Кронос Александр
1. Мастер Разума
Фантастика:
героическая фантастика
попаданцы
аниме
6.20
рейтинг книги
Мастер Разума

Сиротка 4

Первухин Андрей Евгеньевич
4. Сиротка
Фантастика:
фэнтези
попаданцы
6.00
рейтинг книги
Сиротка 4

Провинциал. Книга 7

Лопарев Игорь Викторович
7. Провинциал
Фантастика:
боевая фантастика
космическая фантастика
5.00
рейтинг книги
Провинциал. Книга 7

Ненаглядная жена его светлости

Зика Натаэль
Любовные романы:
любовно-фантастические романы
6.23
рейтинг книги
Ненаглядная жена его светлости

Книга пяти колец

Зайцев Константин
1. Книга пяти колец
Фантастика:
фэнтези
6.00
рейтинг книги
Книга пяти колец

Ваше Сиятельство

Моури Эрли
1. Ваше Сиятельство
Фантастика:
фэнтези
попаданцы
5.00
рейтинг книги
Ваше Сиятельство

Болотник 3

Панченко Андрей Алексеевич
3. Болотник
Фантастика:
попаданцы
альтернативная история
6.25
рейтинг книги
Болотник 3

Темный Охотник 3

Розальев Андрей
3. КО: Темный охотник
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Темный Охотник 3

Семья. Измена. Развод

Высоцкая Мария Николаевна
2. Измены
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Семья. Измена. Развод

Восход. Солнцев. Книга X

Скабер Артемий
10. Голос Бога
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Восход. Солнцев. Книга X

По осколкам твоего сердца

Джейн Анна
2. Хулиган и новенькая
Любовные романы:
современные любовные романы
5.56
рейтинг книги
По осколкам твоего сердца

Барон диктует правила

Ренгач Евгений
4. Закон сильного
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Барон диктует правила

Неудержимый. Книга XII

Боярский Андрей
12. Неудержимый
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Неудержимый. Книга XII