Стандартные диалоги Windows

Рассмотрим теперь те части примера 28-2, где вызываются стандартные диалоги Windows для откры­тия и сохранения файла. Как уже отмечалось в гл. 12, в Windows имеется группа стандартных диалогов, служащих для открытия и сохранения файлов, задания характеристик печати, поиска и замены слов и др. Все они поддерживаются соответствующими классами OWL, производными от базового для всех стан­дартных диалогов класса TCommonDialog, который, в свою очередь, выводится из класса TDialog (рис. 28.6).

Как видно из рис. 28.6, диалоги открытия и сохранения файлов реализуются с помощью классов TOpenSaveDialog, TFileOpenDialog и TFileSaveDialog. Рассмотрим их использование на примере функ­ции примера 28-2 CmOpen(), вызываемой при щелчке мышью по пункту меню "Открыть".


Диалоговые окна 263

Перед тем, как вызывать стандартный диалог Windows, необходимо создать и настроить структуру данных типа TData, которая будет определять свойства этого диалога (у нас эта структурная переменная получила имя fileData). В каждом стандартном диалоге объявлен свой встроенный класс TData, в кото­ром описаны характерные для конкретного диалога данные (в частности, для диалогов открытия или со­хранения файлов к характерным данным относится спецификация файла, а для диалога настройки прин­тера - число печатаемых копий). Вызывая конструктор класса TData для образования переменной fileData

TOpenSaveDialog::TData fileData(OFN_FILEMUSTEXIST|OFN_PATHMUSTEXIST|

OFN_HIDEREADONLY,"Базы данных (*.dbf)|*.dbf|);.

мы указываем среди его параметров те характерные значения, которые мы хотим поместить в fileData. В нашем случае задаются два параметра: комбинация флагов (проверка существования вводимых пользо­вателем каталогов и имен файлов, а также скрытие контрольной рамки "Только чтение") и тип искомых файлов.

Вызывая далее конструктор класса диалога (в одном предложении с вызовом для этого диалога функции-члена Execute(), приводящим к появлению диалогового окна на экране)

int result= new TFileOpenDialog(this,fileData)->Execute();

мы указываем среди его параметров имя нашей структурной переменной fileData. Среди защищенных данных-членов класса диалога имеется ссылочная переменная Data типа TData, в которую при выполне­нии конструктора записывается адрес созданной в программе структуры fileData, что делает ее доступ­ной программам OWL, реализующим работу диалога. После выбора пользователем в процессе работы с диалогом требуемого файла и закрытия диалога, полная спецификация выбранного файла поступает в элемент FileName переменной fileData, откуда ее можно извлечь и использовать для открытия файла и чтения из него данных.

Целочисленное значение, возвращаемое функцией Execute(), говорит о том, каким образом был за­крыт диалог. При нажатии на кнопку ОК возвращается значение IDOK, при выборе кнопки "Отмена" -значение IDCANCEL. Анализ возвращаемого значения дает возможность завершить функцию CmOpen(), если пользователь завершил диалог, не выбрав никакого файла. Если же файл выбран и диалог завершен с кодом возврата ОК, то выполняется проверка правильности расширения имени файла. Для этого сим­вольный указатель ptr устанавливается на завершающий нуль спецификации файла в переменной fileData, а затем последние три символа спецификации сравниваются с заданным расширением DBF (вы­бранным, разумеется, для наших файлов совершенно произвольно). Если расширение правильное, то файл открывается и все его содержимое читается в массивную переменную tsbArray, состоящую из запи­сей типа TSB.

После закрытия файла вызовом функции Invalidate() инициируется сообщение WM_PAINT для глав­ного окна приложения (поскольку функция CmOpen() принадлежит классу главного окна My Window), в результате чего на экран выводится содержимое выбранного файла с базой данных.

Функция CmSave(), вызываемая при выборе пункта меню "Сохранить" и активизирующая стандарт­ный диалог Windows "Сохранение", отличается от функции CmOpen() только режимом открытия файла (для записи, а не для чтения) и заменой функции fread() на fwrite().

Замещенная функция Paint() просматривает в цикле записи прочитанного файла, собирает данные каждой записи в символьную строку и функцией TextOut() выводит эти строки на экран друг под другом (рис. 28.7). При этом первое данное из каждой записи копируется в строку-приемник функцией strcpy(), очищая (в логическом плане) строку s от предыдущего содержимого, а последующие данные наращива­ют строку с помощью функции strcat(), выполняющей операцию конкатенации. Ради простоты в про­грамме не предусмотрено ни какого-либо форматирования выводимых строк, ни даже анализа числа ре­ально содержащихся в массиве записей.


264 Глава 28


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: