290______________________________________________Глава 4

телем в процессе выполнения приложения с помощью команд типа Окно | Новое.
Число дочерних окон заранее неизвестно — пользователь может создать их столь-
ко, сколько ему потребуется. Окна документов располагаются в клиентской облас-
ти родительской формы. Поэтому чаще всего целесообразно в родительской форме
ограничиваться только главным меню, инструментальными панелями и, если не-
обходимо, панелью состояния, оставляя все остальное место в окне для окон дочер-
них форм. При этом обычно окно родительской формы в исходном состоянии раз
ворачивают на весь экран.

Из родительской формы можно управлять дочерними формами.

Дочернюю форму нельзя уничтожить пока не уничтожена родительская фор-
ма.

Требования, которые надо учитывать при разработке приложений MDI, по- J
дробно рассмотрены в разделе 4.1.2.                                          -

Для создания приложения MDI необходимо спроектировать родительскую и
дочернюю формы. В родительской форме свойство FormStyle устанавливается в
fsMDIForm, а в дочерней — в fsMDIChild. Поскольку дочерние окна будет созда
вать сам пользователь в процессе выполнения приложения, дочернюю форму необ-
ходимо исключить из числа создаваемых автоматически (в разделе 4.7.2 рассказы
валось, как это сделать с помощью окна Опций проекта).

Рассмотрим теперь, как можно сделать обработчик команды, по которой поль
зователь задает в родительском окне создание нового окна документов — нового
экземпляра дочерней формы. Этот обработчик может иметь вид:

класс_дочерней_формы * имя = new класс дочерней формы (this) ;

if (!имя) return;

операторы настройки, если они нужны
имя->3пои();

Первый оператор процедуры создает методом new объект дочерней формы и
указатель на него с некоторым произвольным временным именем. Далее могут
следовать какие-то операторы настройки нового дочернего окна. Например, ново- ;

му окну надо присвоить какой-то уникальный заголовок (свойство Caption дочер- |
ней формы), чтобы пользователь мог отличать друг:от друга окна документов. По-
следний оператор процедуры делает видимым вновь созданное окно.

Пусть, например, вы создали в модуле UMain родительскую форму, содержа-
щую раздел меню Окно ] Новое, и создали в модуле UDoc дочернюю форму с именем
FDoc, имеющую тип TFDoc (посмотреть для контроля имя и тип дочерней формы
вы можете в верхнем выпадающем списке Инспектора Объектов, выделив интере-
сующую вас форму, или в модуле, посмотрев автоматически создаваемый C++Buil-
der оператор, объявляющий переменную формы и расположенный сразу после ди-
ректив препроцессора).

Тогда в модуле родительской формы вы должны вставить директиву препро-
цессора, подключающую заголовочный файл дочерней формы UDoc (см. разделы
4.7.2 и 4.7.4). А в обработчике события, связанного с выбором пользователем раз-
дела меню Окно | Новое, можно написать обработчик вида:

TFDoc *TF = new TFDoc(this);

if ( ! TF) return;                                                       ,

TF->Show();                                                              '

В родительской форме имеется ряд свойств, позволяющих управлять дочерни
ми окнами. Все они доступны только для чтения и только во время выполнения. •

Свойство MDIChildCount определяет количество открытых дочерних окон. ш
Приведем оператор, который можно вставить в предыдущий пример для задания |
уникального имени вновь созданного окна TF:                                Я

TF->Caption = "Документ " + IntToStr(MDIChildCount);                    •