Использование стандартных диалогов Windows
При необходимости открывать, закрывать или печатать на принтер файлы в разрабатываемом приложении наиболее простой и эффективный путь – использование стандартных диалогов открытия, закрытия файлов.
Рассмотрим использования диалогов открытия и сохранения файлов в случае необходимости сохранения текста в окошке Memo в файле.
Для этого необходимо переместить на форму две компоненты из закладки Dialogs: OpenDialog для открытия файла и SaveDialog для сохранения файла.
Для этих диалогов необходимо настроить свойство Filter. Для этого надо выделить компоненту диалога мышью и в инспекторе объектов щёлкнуть на многоточии напротив свойства Filter. В появившемся диалоговом окне необходимо ввести название фильтра (например “текстовый файл”) и сам фильтр *.txt, поскольку это подходящий формат для сохранения текста.
Для вызова диалога сохранения необходимо перенести на форму компоненту Button со свойством Caption “сохранить в файл” и в обработчике события OnClick записать код:
SaveDialog1->Execute();
Memo1->Lines->SaveToFile(SaveDialog1->FileName);
Метод Execute вызывает диалог сохранения файла, после выполнения которого свойство FileName компоненты SaveDialog становится имени выбранного пользователем в результате выполнения диалога файла.
|
Рис. 7
Аналогично осуществляется открытие сохранённого файла. Отличие будет состоять в надписи на компоненте Button (“Сохранить файл”) и функции обработчика события OnClick:
OpenDialog1->Execute();
Memo1->Lines->LoadFromFile(OpenDialog1->FileName);
Стандартные диалоги 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
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(), выполняющей операцию конкатенации. Ради простоты в программе не предусмотрено ни какого-либо форматирования выводимых строк, ни даже анализа числа реально содержащихся в массиве записей.
Стандартные диалоги 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
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(), выполняющей операцию конкатенации. Ради простоты в программе не предусмотрено ни какого-либо форматирования выводимых строк, ни даже анализа числа реально содержащихся в массиве записей.
Стандартные диалоги 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
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(), выполняющей операцию конкатенации. Ради простоты в программе не предусмотрено ни какого-либо форматирования выводимых строк, ни даже анализа числа реально содержащихся в массиве записей.