Помимо собственно файловых операций, нашим программам нужно уметь совершать разнообразные действия с файловой системой компьютера. Есть ли такой файл на диске? а сколько осталось свободного места? какой размер этого файла? а когда он создан? – давайте, попробуем научиться отвечать на подобные вопросы.
При работе с файлами пользователь часто должен либо указать, какой файл на диске открыть, либо ввести имя файла для сохранения информации. Нудное впечатывание полного имени файла с путем в компонент типа TEdit – явно не лучший способ. В Delphi предусмотрен ряд средств для отображения стандартных диалогов открытия и сохранения файлов. Данные компоненты являются невизуальными и находятся на закладке Dialogs палитры компонентов (Рис. 14.1).
Рис. 18.1 Панель Dialogs палитры инструментов.
Напишем программу, загружающую выбранный пользователем текстовый файл в компонент Memo1 типа TMemo. Поместим на форму компонент TOpenDialog и настроим его свойства (Табл. 14.1):
Табл. 18.1
Свойство
Что это такое?
Значение
DefaultExt
Расширение имени файла, которое добавляется автоматически, если пользователь ввел только имя без расширения
txt
Filter
Список типов файлов и их расширений. в левой колонке – текст, отображаемый на экране, в правой – маска имени файла вида *.расширение
FilterIndex
Номер пункта в списке типов файлов, который отображается по умолчанию (нумерация с единицы)
1 в данном примере соответствует фильтру "Текстовые файлы *.txt"
Title
Текстовая строка в заголовке диалогового окна
"Выберите файл"
Options
NoChangeDir
Не менять текущую директорию, как бы пользователь не лазил по дискам
True
ofPathMustExist
Введенный путь должен существовать
True
ofFileMustExist
Выбранный файл должен существовать
True, если это диалог открытия файла, и False – если это диалог сохранения
ofCreatePrompt
Выдача подсказки при создании нового файла
False
ofAllowMultiSelect
Разрешает выбратьнесколько имен aфайлов при помощи клавиш Shift и Ctrl
False
Разместим на форме кнопку и напишем следующий обработчик:
procedure TForm1.Button1Click(Sender: TObject);
begin
WITH OpenDialog1 DO
IF Execute THEN
Memo1.Lines.LoadFromFile(FileName);
end;
Здесь вызывается метод Execute компонента TOpenDialog, который собственно и открывает окно выбора файла (Рис. 14.2).
Рис. 18.2 Диалоговое окно открытия файла.
Метод Execute возвращает логическое значение True или False в зависимости от того, выбрал ли пользователь файл или просто закрыл диалоговое окно. Если получено значение True, то в компонент Memo1 загружается файл с именем, которое хранится в свойстве OpenDialog1.FileName.
Диалог сохранения файла TSaveDialog работает аналогично. Давайте добавим его на форму (не забыв в свойстве Options установить ofPathMustExist=True, ofFileMustExist=False) и на еще одну кнопку повесим код сохранения текста из Memo1:
procedure TForm1.Button2Click(Sender: TObject);
begin
WITH SaveDialog1 DO
IF Execute THEN
Memo1.Lines.SaveToFile(FileName)
end;
Вот и получился примитивный текстовый редактор!
Компоненты TOpenPictureDialog и TsavePictureDialog отличаются наличием в них окна предварительного просмотра графических файлов, для загрузки и сохранения которых они и предназначены. В паре с компонентом Timage легко сделать простой графический редактор.
Кстати, все эти диалоги не имеют проблем с открытием файлов, у которых в имени или пути есть русские буквы или пробелы. Никаких дополнительных усилий по этому поводу (скажем, заключения имени файла в кавычки) прилагать не требуется.
Если надо сразу открыть несколько файлов, то надо установить в свойстве Options значение foAllowMultiSelect в True. В этом случае список выбранных файлов будет записан в свойство Files. Далее его можно, к примеру, показать в компоненте типа TListBox следующим образом:
ListBox1.Items.Assign(OpenDialog1.Files);
В ряде случаев необходимо, чтобы пользователь выбирал не файл, а директорию (например, надо указать программе, где хранятся временные файлы). Обычные диалоги для этого не годятся. Однако, в модуле FileCtrl, который нужно не забыть добавить в оператор Uses, имеется функция SelectDirectory(const Caption: string; const Root: WideString; out Directory: string): Boolean. Параметр Caption задает текст в заголовке диалога, параметр Root – начальную директорию, которая будет текущей в окне (можно поставить пустую строку), а в переменную Directory запишется выбранная пользователем директория. Функция возвращает логическое значение в зависимости от того, сделан выбор или нет. Чтобы выбратьдиректорию, можно использовать следующий код:
USES FileCtrl;
…
if SelectDirectory('Выберите директорию', '',dir) then