,  Проектирование графического интерфейса пользователя______________291

Ч

L     Свойство MDIChildren[int i] дает доступ к i-му окну (окна индексируются в
• порядке их создания, последнее созданное окно имеет индекс 0). Однако, во время
работы пользователя с окнами индексация может измениться. Поэтому можно ре-
комендовать использовать индексы только в циклах при проведении некоторых
i операций сразу со всеми дочерними окнами. Следующий пример показывает про-
цедуру, с помощью которой из родительской формы Formi можно закрыть (свер-
нуть) все дочерние окна, начиная с последнего:

for (int i = MDIChildCount-1; i >= 0; i—)
MDIChildren[i]->Close() ;

В момент создания окон документов они автоматически располагаются каска-
дом в клиентской области родительской формы. При этом, если размера клиент-
ской области не хватает для размещения дочерних окон, размеры последних авто-
матически уменьшаются. Имеется ряд методов родительской формы, упорядочи-
вающих размещение дочерних окон. Метод Cascade располагает все открытые (не
свернутые) окна каскадом. Метод Tile располагает окна мозаикой. При этом учи-
тывается свойство родительской формы TileMode. Если оно равно tb Vertical, то
упорядочивание производится по вертикали, а если TileMode равно tbHorizontal,
то упорядочивание производится по горизонтали. Метод Arrangelcons упорядочи-
вает расположение пиктограмм свернутых окон.

Отдельно надо упомянуть об объединении главных меню родительской и до-
черних форм. Обычно обе эти формы имеют главные меню, но они различны. На-
пример, родительская форма может иметь меню Окно, а дочерняя форма — меню
Файл и Правка. Меню дочерних форм не должно появляться в окнах документов, а
должно всегда встраиваться в главное меню родительской формы. Поэтому свойст-
во AutoMerge компонента типа TMainMenu на приложения MDI не влияет: встра-
ивание меню происходит независимо от значения этого свойства. А места, на кото-
рые встраиваются разделы меню дочерней формы, определяются значениями свой-
ства Grouplndex каждого раздела меню так же, как это имеет место в обычных
многооконных приложениях при задании свойства AutoMerge равным true (см.
• раздел 3.4.1 главы 3).

4.7.6 Пример приложения с интерфейсом множества
документов — простой многооконный редактор

Рассмотрим проектирование простого приложения MDI. Пусть мы хотим со-
здать многооконный редактор, в каждое окно которого можно загрузить содержи-
мое заданного входного текстового файла, что-то в нем изменить и сохранить текст
в заданном выходном файле (рис. 4.21).

Обратите внимание на следующие требования к интерфейсу MDI, проиллюст-
рированные на рис. 4.21.

Хороший стиль программирования ————————————"———————————

Если новое окно открывается без загрузки текста из файла, заголовок окна должен содер-
жать уникальное имя типа «Документ ...» или «Окно ...», где вместо многоточия должен быть
неповторяющийся номер окна. Если в окно загружается текст из файла, то заголовок окна
должен содержать имя загруженного файла.

Хороший стиль программирования ——'—~———"""•111""111 " '———————————

'      Когда окно документа развертывается, его имя должно включаться в заголовок главного
окна (рис. 4.21 в). К счастью, C++Builder производит эту операцию автоматически.