StreamSize: Int64;
StreamBytesTransferred: Int64;
dwStreamNumber: DWORD;
dwCallbackReason: DWORD;
hSourceFile: THandle;
hDestinationFile: THandle;
lpData: Pointer): DWORD; stdcall;
begin
progress.Position := 100 * TotalBytesTransferred div
TotalFileSize;
Application.ProcessMessages; //Чтобы не «зависал»
//интерфейс приложения
CopyProgressFunc := PROGRESS_CONTINUE;
end;
Пусть вас не смущает большое количество параметров функцииСоруРгодгеззЕипс. Применять их все далеко не обязательно (но они должны быть объявлены), хотя ничего сложного здесь нет. В листинге 4.33 использование параметров реализовано наиболее простым (на наш взгляд) и очевидным образом: значения параметров TotalBytesTransferred и TotalFileSize применяются для определения доли скопированной информации.
В листинге 4.33 вызов метода ProcessMessages объекта Application используется потому, что функция CopyFileEx возвращает управление программе только после завершения (или прерывания) копирования. Иначе пришлось бы создавать для копирования отдельный поток, усложняя листинг и отвлекая вас от главной цели этого примера.
Теперь несколько слов о возвращаемых функцией CopyProgressFunc значениях (в нашем примере используется только одно из четырех доступных значений). Список целочисленных констант, значения которых может возвращать функция CopyProgressFunc, таков:
• PROGRESS_CONTINUE – продолжать процесс копирования;
• PROGRESS_CANCEL – отмена копирования;
• PROGRESS_STOP – остановка копирования (можно возобновить);
• PROGRESS_QUIET – при возврате этого значения система перестает вызывать функцию CopyProgressFunc.
Внешний вид формы при копировании большого файла приводится на рис. 4.9.
Рис. 4.9. Копирование большого файла
Только не нужно забывать останавливать копирование при закрытии приложения или в прочих экстренных ситуациях. Так, если не предусмотреть обработку события CloseQuery для формы (рис. 4.9), то закрыть ее в ходе копирования обычным способом не удастся. Зато после завершения копирования (или при нажатии кнопки Отмена)форма тут же исчезнет. Странное поведение, не правда ли? Вариант более-менее адекватной реакции на закрытие формы приводится в листинге 4.34.
...
Листинг 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. Определение значка, ассоциированного с файлом
Читать дальше
Конец ознакомительного отрывка
Купить книгу