Delphi. Трюки и эффекты. Александр Чиртик. Читать онлайн. Newlib. NEWLIB.NET

Автор: Александр Чиртик
Издательство:
Серия:
Жанр произведения: Программы
Год издания: 0
isbn: 978-5-911-80219-6
Скачать книгу
файла

      Чтобы воспользоваться возможностями окна открытия файла, достаточно задействовать листинг 2.23.

Листинг 2.23. Окно открытия файла

      function ShowOpen(strFilter: string; nFilterIndex: Integer = 0;

      strInitFileName: string = '';

      var

      ofn: OPENFILENAME;

      begin

      ZeroMemory(Addr(ofn), SizeOf(ofn));

      //Формирование буфера (260 символов)

      SetLength(strInitFileName, MAX_PATH);

      PrepareFilterString(strFilter);

      //Заполнение структуры для диалога

      ofn.lStructSize := SizeOf(ofn);

      ofn.hWndOwner := hParentWnd;

      ofn.hInstance := hAppInst;

      ofn.lpstrFilter := PAnsiChar(strFilter);

      ofn.nFilterIndex := nFilterIndex;

      ofn.lpstrFile := PAnsiChar(strInitFileName);

      ofn.nMaxFile := MAX_PATH;

      ofn.lpstrTitle := pAnsiChar(strTitle);

      ofn.Flags := OFN_FILEMUSTEXIST or OFN_PATHMUSTEXIST or

      OFN_HIDEREADONLY;

      //Отображение окна диалога и обработка результата

      if (GetOpenFileName(ofn) = True) then

      ShowOpen := ofn.lpstrFile;

      end;

      Приведенная в листинге 2.23 функция возвращает не пустую строку – полный путь файла в случае, если пользователь выбрал или ввел имя файла. Здесь главной трудностью является заполнение довольно большой структуры OPENFILENAME. В данном примере используются только базовые возможности диалога открытия файла и лишь некоторые из поддерживаемых им флагов (поле Flags):

      • OFN_FILEMUSTEXIST – при успешном завершении работы диалогового окна можно быть уверенным, что результирующий путь является путем существующего файла;

      • OFN_PATHMUSTEXI ST – не дает ввести имя файла в несуществующей папке (например, при вводе с:\docs\mydocl.doc, если папки docs не существует, будет выдано соответствующее сообщение);

      • OFNHIDEREADONLY – не показывать флажок Только для чтения.

      Отдельно рассмотрим, зачем в приведенном примере вызывается дополнительная функция PrepareFilterString (листинг 2.24).

Листинг 2.24. Преобразование строки фильтра

      procedure PrepareFilterString(var strFilter: string);

      var

      i: Integer;

      begin

      for i := 1 to length(strFilter) do

      if (strFilter[i] = '|') then strFilter[i] := #0;

      end;

      Дело в том, что при задании фильтров (поле IpstrFile) требуется, чтобы каждое их название и обозначение были отделены символом #0, а за последним фильтром шла последовательность из двух нулевых символов. На практике задавать строку из нескольких фильтров в следующем виде не особо удобно:

      'Текстовые файлы' + #0 + '*.txt' + #0 + 'Все файлы' + '*.*' + #0 + #0

      Поэтому часто применяются другие разделители, которые впоследствии преобразуются в символы #0. В нашем случае в качестве разделителя используется символ |, поэтому приведенная выше строка фильтра может быть записана так:

      'Текстовые файлы|*.txt|Все файлы|*.*||'

      Согласитесь, что получилось более кратко и понятно.

      Теперь обратимся к диалоговому окну сохранения файла. Для его вызова достаточно переделать пример из листинга 2.23 следующим образом (листинг 2.25).

Листинг 2.25. Окно сохранения файла

      function ShowSave(strFilter: string; nFilterIndex: Integer = 0;

      strInitFileName: string = '';

      strTitle: string = 'Сохранение файла'):string;

      var

      ofn: OPENFILENAME;

      begin

      ZeroMemory(Addr(ofn), SizeOf(ofn));

      //Формирование буфера (260 символов)

      SetLength(strInitFileName, MAX_PATH);

      PrepareFilterString(strFilter);

      //Заполнение структуры для диалога

      ofn.lStructSize := SizeOf(ofn);

      ofn.hWndOwner :=