Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
_N8_.doc
Скачиваний:
2
Добавлен:
24.04.2019
Размер:
123.39 Кб
Скачать

7 Управление формами в приложениях с интерфейсом множества документов (приложениях mdi)

Чаще всего сколько-нибудь сложное приложение не может ограничиться од­ним окном. Поэтому прежде всего вам нужно решить вопрос управления окнами. Есть две различные модели приложений: с интерфейсом одного документа (SDI) single-document interface и с интерфейсом множества документов (MDI) multiple-document interface.

В большинстве случаев следует отдавать предпочтение интерфейсу SDI. Этот интерфейс не обязательно предполагает наличие действительно только одного окна, как в приложениях Windows, типа «Калькулятор». Такое приложение, как «Проводник» Windows, также является SDI приложением, но в нужные моменты оно создает вторичные окна для поиска файлов или папок, задания параметров, просмотра свойств файлов и других целей.

С другой стороны, у приложений MDI тоже есть свои преимущества. Хороший пример такого приложения — Adobe Photoshop. В приложении MDI имеется роди­тельское (первичное) окно и ряд дочерних окон (называемых также окнами документов). Бывают ситуации, когда выгодно отображать информацию в нескольких окнах, которые совместно используют элементы интерфейса (например, меню или инструментальные линейки). Окна документов управляются и ограничиваются родительским окном. Если вы уменьшаете размер родительского окна, то дочерние окна могут исчезать из поля зрения.

Случаи, когда нужно использовать модель MDI, довольно редки. Прежде все­го, это следует делать только тогда, когда все дочерние окна будут содержать идентичные объекты — например, текстовые документы или электронные таблицы. Не применяйте MDI, если вы собираетесь работать в приложении с дочерними окнами разного типа (например, текстовыми документами и электронными таблицами одновременно). Не применяйте MDI, если вы хотите управлять тем, какое из дочерних окон должно находиться поверх других, используя свойство «всегда наверху», или если вы хотите управлять размерами окон, делать их невидимыми и т. п. Интерфейс MDI предназначен для очень узкого диапазона приложений, в которых все дочерние окна однородны. Приспособить его к чему-то другому не получится. Наконец, следует заметить, что Microsoft не поощряет разработку новых приложений MDI (в основном потому, что для предыдущих версий Windows было написано слишком много плохих программ этого типа).

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

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

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

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

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

var <имя> : <имя класса дочерней формы>;

begin <имя>:=<имя класса дочерней формы>.Create(Application);

<операторы настройки, если они нужны>

<имя>.Show;

end;

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

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

Тогда в предложении uses модуля родительской формы вы должны сослаться на модуль дочерней формы UDoc. А в обработчике события, связанного с выбором пользователем раздела меню Окно Новое, можно написать обработчик вида:

var NewF : TFDoc;

begin

NewF := TFDoc.Create(Application);

NewF.Show;

end;

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

Свойство MDIChildCount определяет количество открытых дочерних окон. Свойство MDIChildren[i:integer] дает доступ к i-му окну (окна индексируются в порядке их создания). Приведем оператор, который можно вставить в предыдущий пример для задания уникального имени вновь созданного окна NewF:

NewF.Caption := 'Окно ' + IntToStr(MDIChildCount);

Следующий пример показывает процедуру, с помощью которой из родительской формы Forml можно закрыть (свернуть) все дочерние окна, начиная с последнего:

var

I: Integer;

begin

with Form1 do

for I := MDIChildCount-1 downto 0 do

MDIChildren[I].Close;

end;

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

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

9