Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
_Delphi_1курс лекции / Тема 14 Управление формами.doc
Скачиваний:
48
Добавлен:
23.03.2015
Размер:
121.86 Кб
Скачать

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

Типичным приложением MDI является привычный всем Word. В приложении MDI имеется родительская (первичная) форма и ряд дочерних форм (называемых также формами документов). Окна документов могут создаваться самим пользователем в процессе выполнения приложения с помощью команд типа Окно | Новое.

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

У форм есть свойство

FormStyle :TFormStyle (fsNormal, fsMDIChild, fsMDIForm, fsStayOnTop)

fsNormal– окно обычного приложения

fsMDIChild– дочерняя форма приложения MDI

fsMDIForm– родительская форма приложения MDI

fsStayOnTop– окно, остающееся всегда поверх остальных оконWindows

Для создания приложения MDI необходимо спроектировать родительскую и дочернюю формы. В родительской форме свойство FormStyleустанавливается в fsMDIForm, а в дочерней — в fsMDIChild. Поскольку дочерние окна будет создавать сам пользователь в процессе выполнения приложения, дочернюю форму необходимо исключить из числа создаваемых автоматически. Для этого в окне опций проекта (Project Options) надо выбрать страницу Forms. В верхнем выпадающем списке Main forms можно выбрать главную форму среди имеющихся в проекте. Пользуясь двумя нижними окнами можно установить, какие формы должны создаваться автоматически, а какие не должны. Например, если надо исключить форму Form2 из списка автоматически создаваемых, то надо выделить ее в левом окне (Auto-create forms) и с помощью кнопки со стрелкой, направленной вправо, переместить в правое окно доступных форм (Available forms).

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

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

begin

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

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

<имя>. Show;

end;

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

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

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

var NewF : TFDoc;

begin

NewF := TFDoc.Create(Application);

// или Application. CreateForm (TFDoc,newF);

NewF.Show;

end;

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

ActiveMDIChild – дочерняя форма, имеющая фокус в данный момент.

MDIChildCount–определяет количество открытых дочерних окон.

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

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

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

var

I: Integer;

begin

for I := MDIChildCount-1 downto 0 do

MDIChildren[I].Close;

end;

А следующий код восстанавливает все свернутые дочерние окна:

var

I: Integer;

begin

for I := 0 to MDIChildCount-1 do

MDIChildren[I].WindowState := wsNormal;

end;

ActiveMDIChild: TFormдочерняя форма, имеющая фокус в данный момент.

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

Метод Cascadeрасполагает все открытые (не свернутые) окна каскадом.

Метод Tileрасполагает окна мозаикой. При этом учитывается свойство родительской формыTileMode. Если оно равно tbVertical, то упорядочивание производится по вертикали, а если TileMode равно tbHorizotital, то упорядочивание производится по горизонтали.

Метод ArrangeIconsупорядочивает расположение пиктограмм свернутых окон.

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