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

на главную - закладки

Жанры

Шрифт:

Приведенный здесь пример построения дерева может пригодиться при решении некоторых задач. Дополнительно же нужно сказать, что на вкладке Samples (Delphi 7) можно найти компоненты, прекрасно подходящие для построения пользовательского интерфейса приложений для просмотра содержимого не только физически существующих дисков: полное дерево каталогов SheLLTreeView (включая корневой элемент Рабочий стол и прочие виртуальные каталоги), список основных элементов системы каталогов (ShellComboBox), а также элемент управления для просмотра содержимого папки (SheLLListView).

4.3. Файлы

В завершение главы рассмотрим три несложных

примера работы с файлами: копирование файла (с отображением хода копирования в ProgressBar), определение значков, ассоциированных с файлами, и извлечение значков из ЕХЕ– и DLL-файлов.

Красивое копирование файла

Казалось бы, что особенного в организации копирования большого файла с отображением процесса: читай файл порциями, записывай прочитанные данные в файл назначения, попутно показывая в ProgressBar или где-то еще отношение объема переписанной информации к размеру файла. Однако зачем такие сложности? Ведь у API-функции CopyFi 1е, осуществляющей простое копирование файла, есть расширенный вариант – функция CopyFileEx, в которую встроена поддержка отображения процесса копирования (и не только это). Вот прототип функции CopyFileEx:

...

function CopyFileEx(lpExistingFileName, lpNewFileName: PChar;

lpProgressRoutine: TFNProgressRoutine; lpData: Pointer;

pbCancel: PBool; dwCopyFlags: DWORD): BOOL; stdcall;

Итак, кроме пути исходного и конечного файлов, а также флагов (последний параметр), функция принимает ряд дополнительных параметров: адрес функции обратного вызова (IpProgressRoutine), указатель на данные, передаваемые в функцию обратного вызова (lpData), а также адрес переменной типа BOOL (pbCancel), при установке значения которой в True копирование прерывается.

Пример использования функции CopyFileEx в программе приведен в листинге 4.32. Здесь подразумевается, что кнопка cmbCopy используется как для запуска, так и для остановки процесса копирования. Также на форме присутствуют следующие элементы управления:

• индикатор pbCopyProgress, диапазон значений которого от 0 до 100;

• текстовое поле txtFrom с именем копируемого файла;

• текстовое поле txtTo с именем файла назначения.

...

Листинг 4.32.

Использование функции CopyFileEx

procedure TForm1.cmbCopyClick(Sender: TObject);

begin

if cmbCopy.Caption = \'Копировать\' then

begin

//Запускаем копирование

progress := pbCopyProgress; //Настроен от 0 до 100 %

bCancelCopy := False;

cmbCopy.Caption := \'Отмена\

if CopyFileEx(PAnsiChar(txtFrom.Text), PAnsiChar(txtTo.Text),

Addr(CopyProgressFunc), nil, Addr(bCancelCopy),

COPY_FILE_FAIL_IF_EXISTS) = False

then

MessageBox(Handle, \'Не удается скопировать файл\',

\'Копирование\', MB_ICONEXCLAMATION);

end

else

begin

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

bCancelCopy := True;

cmbCopy.Caption := \'Копировать\

end;

end;

Из листинга 4.32 можно увидеть, что в качестве значения последнего параметра функции CopyFileEx можно передавать константу COPY_FILE_FAIL_IF_EXISTS (функция вернет False, если файл назначения уже существует, и не будет осуществлять копирование).

На самом деле значение параметра dwCopyFlags функции CopyFileEx может быть комбинацией значений COPY_FILE_FAIL_IF_EXISTS

И COPY_FILE_RES TARTABLE, то есть представляет собой битовый флаг. Последнее значение используется для того, чтобы в случае прерывания копирование файла можно было возобновить. Функция CopyFileEx в этом случае сохраняет в файле назначения информацию, достаточную для возобновления процесса копирования.

В листинге 4.32 изменяется переменная progress – глобальная переменная-ссылка на TProgressBar, которая используется в функции обратного вызова. Переменная bCancelCopy, адрес которой передается в функцию CopyFileEx, также объявлена глобальной (в пределах модуля).

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

...

Листинг 4.33.

Функция, показывающая ход копирования файла

function CopyProgressFunc( TotalFileSize: Int64;

TotalBytesTransferred: Int64;

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.

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

Вкус ледяного поцелуя

Полякова Татьяна Викторовна
2. Ольга Рязанцева
Детективы:
криминальные детективы
9.08
рейтинг книги
Вкус ледяного поцелуя

Проблема майора Багирова

Майер Кристина
1. Спецназ
Любовные романы:
современные любовные романы
6.60
рейтинг книги
Проблема майора Багирова

Прометей: владыка моря

Рави Ивар
5. Прометей
Фантастика:
фэнтези
5.97
рейтинг книги
Прометей: владыка моря

Попаданка в академии драконов 4

Свадьбина Любовь
4. Попаданка в академии драконов
Любовные романы:
любовно-фантастические романы
7.47
рейтинг книги
Попаданка в академии драконов 4

(Не)зачёт, Дарья Сергеевна!

Рам Янка
8. Самбисты
Любовные романы:
современные любовные романы
5.00
рейтинг книги
(Не)зачёт, Дарья Сергеевна!

Запасная дочь

Зика Натаэль
Фантастика:
фэнтези
6.40
рейтинг книги
Запасная дочь

Дракон с подарком

Суббота Светлана
3. Королевская академия Драко
Любовные романы:
любовно-фантастические романы
6.62
рейтинг книги
Дракон с подарком

Отвергнутая невеста генерала драконов

Лунёва Мария
5. Генералы драконов
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Отвергнутая невеста генерала драконов

Случайная жена для лорда Дракона

Волконская Оксана
Фантастика:
юмористическая фантастика
попаданцы
5.00
рейтинг книги
Случайная жена для лорда Дракона

Тройняшки не по плану. Идеальный генофонд

Лесневская Вероника
Роковые подмены
Любовные романы:
современные любовные романы
6.80
рейтинг книги
Тройняшки не по плану. Идеальный генофонд

Идеальный мир для Лекаря 28

Сапфир Олег
28. Лекарь
Фантастика:
юмористическое фэнтези
аниме
фэнтези
5.00
рейтинг книги
Идеальный мир для Лекаря 28

Лейтенант космического флота

Борчанинов Геннадий
1. Звезды на погонах
Фантастика:
боевая фантастика
космическая фантастика
космоопера
рпг
фэнтези
фантастика: прочее
5.00
рейтинг книги
Лейтенант космического флота

Гарем на шагоходе. Том 5

Гремлинов Гриша
5. Волк и его волчицы
Фантастика:
боевая фантастика
фэнтези
5.00
рейтинг книги
Гарем на шагоходе. Том 5

Матабар III

Клеванский Кирилл Сергеевич
3. Матабар
Фантастика:
фэнтези
5.00
рейтинг книги
Матабар III