Читаем Delphi. Трюки и эффекты полностью

Примечание

В приведенных далее примерах вызова диалоговых окон можно увидеть не объявленные, но используемые в программах переменные hApplnst и hParentWnd. Подразумевается, что это глобальные переменные, которые инициализируются вне процедур и функций, приведенных в примерах. Для инициализации этих переменных можно также написать специальную процедуру, например с именем I nit, в которую и передавать значения для hParentWnd и hApplnst.

Окно открытия/сохранения файла

Чтобы воспользоваться возможностями окна открытия файла, достаточно задействовать листинг 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).

...

Перейти на страницу:

Похожие книги

1001 совет по обустройству компьютера
1001 совет по обустройству компьютера

В книге собраны и обобщены советы по решению различных проблем, которые рано или поздно возникают при эксплуатации как экономичных нетбуков, так и современных настольных моделей. Все приведенные рецепты опробованы на практике и разбиты по темам: аппаратные средства персональных компьютеров, компьютерные сети и подключение к Интернету, установка, настройка и ремонт ОС Windows, работа в Интернете, защита от вирусов. Рассмотрены не только готовые решения внезапно возникающих проблем, но и ответы на многие вопросы, которые возникают еще до покупки компьютера. Приведен необходимый минимум технических сведений, позволяющий принять осознанное решение.Компакт-диск прилагается только к печатному изданию книги.

Юрий Всеволодович Ревич

Программирование, программы, базы данных / Интернет / Компьютерное «железо» / ОС и Сети / Программное обеспечение / Книги по IT
Эффективное использование C++. 55 верных способов улучшить структуру и код ваших программ
Эффективное использование C++. 55 верных способов улучшить структуру и код ваших программ

Эта книга представляет собой перевод третьего издания американского бестселлера Effective C++ и является руководством по грамотному использованию языка C++. Она поможет сделать ваши программы более понятными, простыми в сопровождении и эффективными. Помимо материала, описывающего общую стратегию проектирования, книга включает в себя главы по программированию с применением шаблонов и по управлению ресурсами, а также множество советов, которые позволят усовершенствовать ваши программы и сделать работу более интересной и творческой. Книга также включает новый материал по принципам обработки исключений, паттернам проектирования и библиотечным средствам.Издание ориентировано на программистов, знакомых с основами C++ и имеющих навыки его практического применения.

Скотт Мейерс , Скотт Майерс

Программирование, программы, базы данных / Программирование / Книги по IT