При работе с файлами пользователь часто должен либо указать, какой файл на диске открыть, либо ввести имя файла для сохранения информации. Нудное впечатывание полного имени файла с путем в компонент типа 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
MessageDlg('Выбрана директория '+dir, mtInformation,[mbOK],0)