То, что мы узнали в предыдущей части урока, позволяет работать с
файлами по адресу, жёстко записанному в тексте программы. Мы же хотим
иметь возможность открывать любые файлы и работать с файлами по нашему
выбору. Естественно, Delphi предоставляет нам такую возможность. Рассмотрим компоненты, позволяющие в работающей программе осуществлять выбор файлов. Delphi диалоги выбора файла позволяют указать програме, с каким файлом мы хотим работать.
На вкладке палитры компонентов Dialogs находятся компонент Delphi OpenDialog и компонент Delphi SaveDialog. Все Delphi диалоги, находящиеся на этой вкладке, в том числе и Delphi диалоги
выбора файла, невизуальные, т.е. при переносе их на Форму в работающей
программе их не видно, они видны только на этапе конструирования.
Компонент Delphi OpenDialog позволяет открыть в нашей программе стандартное Windows-окно диалога открытия файла, компонент Delphi SaveDialog - окно диалога сохранения.
Delphi диалоги выбора файла сами по себе ничего не
делают, а только предоставляют настройки, сделанные пользователем при
выборе файла. Самый важный метод Delphi диалогов - Execute. Он срабатывает в момент нажатия кнопки "открыть" или "сохранить" в окне выбора файла. Для примера давайте введём в программу возможность выбора файла для загрузки в редактор Memo, и сохранения после редактирования.
Итак, кидаем на Форму оба Delphi диалога, текстовый редактор Memo, и три кнопки Button. В свойство Caption одной из них записываем "Открыть...", другой - "Сохранить", третьей - "Сохранить как..."
В обработчике OnClick кнопки "Открыть..." пишем:
if OpenDialog1.Execute then Memo1.Lines.LoadFromFile(OpenDialog1.FileName);
В результате выбора файла свойство FileName компонента OpenDialog получает значение полного адреса выбранного файла, который мы и вставляем в функцию загрузки файла компонента Memo.
Всё это хорошо, но только в данном случае, когда записанное выражение
записывается в одну строку. Если программа использует несколько раз
выражение OpenDialog1.FileName, то писать руками устанешь. В Delphi для такого случая есть так называемый "оператор присоединения" with. Он используется для любых объектов, имеющих длинный "хвост" из свойств, которые приходится записывать многократно.
Вот как он записывается:
with Объект do begin
end;
Свойства Объекта внутри логических скобок begin/end можно
записывать непосредственно. Допускается перечислять через запятую
несколько объектов. Естественно, в случае, когда внутри скобок находится
один оператор, они необязательны. Перепишем фрагмент загрузки файла с
использованием оператора присоединения:
with OpenDialog1, Memo1 do if Execute then Lines.LoadFromFile(FileName);
Запись получается более компактной.
Так как свойства компонентов OpenDialog и SaveDialog одинаковы, сохранение текста выглядит абсолютно аналогично. Создаём обработчик нажатия кнопки "Сохранить как..." и пишем:
with SaveDialog1, Memo1 do if Execute then begin Lines.SaveToFile(FileName); OpenDialog1.FileName:=FileName; // Чтобы исправленный текст не затёр источник end;
Наконец, для кнопки "Сохранить" пишем:
Memo1.Lines.SaveToFile(OpenDialog1.FileName); // Сохраняем туда, откуда считали
(В предыдущей строчке была ошибка. Как справедливо заметил в комментарияхOraculum - OpenDialog1.FileName нужно писать без кавычек.)
При работе этих фрагментов можно заметить, что выбирать приходится из
всех файлов в нужной директории. Удобнее видеть только, например,
текстовые файлы, или другой тип файлов по нашему выбору. Для этого
используются фильтры, свойство Filter в наших компонентах. Настраивается оно в Инспекторе Объектов. При выборе его можно перейти в редактор фильтров:
В колонке FilterName записываем имена фильтров, в колонке Filter - список масок файлов, разделённых точкой с запятой. Маска файла в данном случае выглядит как
* . расширение_файла ;
Звёздочка означает, что выбираются файлы с любыми именами, подходящие по расширению.
Свойство Delphi диалогов Title позволяет записать в заголовок нужную нам фразу. Если оставить его пустым, то в заголовке будут стандартные "открыть" или "сохранить"
Свойство InitialDir позволяет в момент открытия оказаться в нужной нам директории. Оно доступно как на этапе "конструирования", так и программно.