Пропустить навигацию.
Главная

Выбор файла в режиме диалога

Несмотря на то, что за диалоговым окном по выбору файла закреплено название OpenDialog, оно предназначено только для того, чтобы облегчить пользователю выбор нужного файла. А открывать его в том смысле, как это принято делать в программах, должны операторы соответствующего алгоритмического языка — OPEN, _rtl_open, fopen, assign и т.п.

Приложения 6_09, 6_10 (VB).

В системе Visual Basic окно OpenDialog появляется в результате вызова метода ShowOpen для объекта CommonDialog. Окно это, по сути дела, объединяет три несколько устаревших системных списка — DriveListBox, DirListBox и FileListBox. По умолчанию на экране возникает системный каталог (рис. 6.9), с которым интересы приложения могут и не совпадать. Поэтому в программе перед вызовом метода ShowOpen можно изменить свойство InitDir, задав в нем нужное оглавление:

CommonDialog1.InitDir = "E:\BXV_BOOK2\"

Тогда в диалоговом окне появится заказанный каталог, что может ускорить процесс путешествия по дискам и папкам (рис. 6.10).

Стандартные диалоговые объекты

Рис. 6.9. Стандартное окно OpenDialog

Стандартные диалоговые объекты

Рис. 6.10. Выбор начального каталога в окне OpenDialog

Чтобы не загромождать окно списком всех файлов, перед обращением к методу ShowOpen целесообразно установить набор нужных шаблонов в свойстве Filter:

CommonDialog1.Filter = "Текстовые файлы (*.txt)|*.txt|"&_

"Модули VB (*.bas)|*.bas"

Такая установка может быть выполнена и на стадии проектирования в окне Properties. Если вы задаете несколько шаблонов для фильтрации имен, то среди них можно выделить одно, которое появится первым в окне Тип файлов:

CommonDialog1.FilterIndex = 2

В данном примере в момент появления диалогового окна будут отображены модули VB с расширением bas (цепочка шаблонов нумеруется от 1). Дополнительным условием отбора может послужить свойство Flags, в котором можно задать такие атрибуты файлов как ReadOnly, Archive и т.п.:

CommonDialog1.Flags = CdlOFNHideReadOnly

На самом деле, свойство Flags имеет более широкое назначение. Со всеми его возможностями и наборами соответствующих констант вы можете познакомиться, заглянув в файле помощи в раздел Flags Property (Open, Save As Dialogs).

Заголовок «Открытие файла» можно заменить более содержательной фразой, задав ее в свойстве DialogTitle:

CommonDialog1.Title = "Задайте цифровую базу"

После нажатия клавиши <Открыть> и удаления диалогового окна имя файла, выделенного пользователем, можно извлечь из свойства CommonDialog1.Filename:

OPEN CommonDialog1.Filename FOR INPUT As #1

Окно диалога позволяет пользователю отказаться от предложенного выбора — например, он может нажать на клавишу <Отмена>. В этом случае в программе должна быть предусмотрена соответствующая ветка:

CommonDialog1.CancelError = True

On Error GoTo qq

qq:

‘Какие-то действия в случае ошибки

Exit Sub

End Sub

Если такая возможность в программе не предусмотрена, то отказ пользователя от выбора файла (нажатие клавиши <Esc> или кнопки <Отмена>) приведет к возникновению аварийной ситуации с выдачей сообщения «Path/File access error» и прекращению работы приложения.

На рис. 6.11 приводится программа заполнения списка ListBox1 строками из файла, выбранного пользователем и результат ее работы — в окне OpenDialog выбран текст модуля приложения.

Стандартные диалоговые объекты

Рис. 6.11. Формирование списка List1 по содержимому файла

Приложение 6_11 (BCB).

В системах BCB и Delphi выбор файла осуществляется с помощью объекта OpenDialog, расположенного в палитре компонентов на закладке Dialogs. Во время работы приложения диалоговое окно по выбору файла появляется в результате вызова метода Execute:

void __fastcall TForm1::FormCreate(TObject *Sender)

{

if(OpenDialog1->Execute())

Memo1->Lines->LoadFromFile(OpenDialog1->FileName);

}

Приложение 6_12 (Delphi).

Аналогичный фрагмент в системе Delphi выглядел бы следующим образом:

procedure TForm1.FormCreate(Sender: TObject);

begin

if OpenDialog1.Execute then

Memo1.Lines.LoadFromFile(OpenDialog1.FileName);

end;

Для загрузки содержимого выбранного файла в объект, обслуживаемый методом LoadFromFile, открывать файл не нужно. Но если мы собираемся обмениваться данными с файлом с помощью обычных операторов чтения (_rtl_read или read, _rtl_write или write), то выбранный файл должен открываться стандартным образом. Ряд из упоминавшихся выше свойств окна OpenDialog повторяются и здесь, разве что с небольшим изменением обозначений — FileName, Filter, FilterIndex, Title, InitialDir. Никаких проблем в связи с отказом от выбора файла в BCB и Delphi не возникает. Роль параметра Flags здесь выполняют два десятка подсвойств, скрывающихся за составным свойством Options.