Построение проекта MDI
Для того чтобы сообщить Delphi о своем намерении построить приложение
с интерфейсом MDI, первым делом установите отвечающее за тип формы свойство FormStyle главной формы проекта в значение fsMDIForm. Тем самым вы назначите родительское окно приложения. Для всех остальных дочерних форм проекта свойство FormStyle должно соответствовать значению fsMDIChild.
Если свойство FormStyle дочернего окна по-прежнему установлено в значение fsNormal, то поведение дочернего окна будет соответствовать поведению окна приложения SDI. Вне зависимости от стиля интерфейса любое приложение обязано обладать главным окном. Все остальные окна являются дочерними. Главное окно определяется в момент разработки приложения, и по умолчанию таковым становится самое первое окно – Form1. При желании назначить главным окном другую форму проекта на-
до воспользоваться пунктом меню Project → Options.
Одновременно с изучением особенностей приложения с интерфейсом MDI
в качестве примера работы мы попробуем написать упрощенный аналог утилиты Sysedit. Для этого создадим новый проект и в инспекторе объектов изменим имя и стиль главной формы:
Имя главной формы: Name=frmMain
Стиль главной формы: FormStyle= fsMDIForm
Добавим в проект новую форму. Для того чтобы сделать ее дочерней, изменим ее стиль и заодно переименуем:
Имя дочерней формы: Name = frmChild
Стиль формы: FormStyle = fsMDIChild
Выберите пункт меню File → Save для того, чтобы сохранить проект. В ответ
на запрос мастера сохранения укажите названия исходных файлов проектов. Модуль главной формы назовите main.pas, дочерней формы – child.pas.
головной файл проекта предлагаю назвать mysysed.dpr. Теперь смело запустите проект на выполнение.
Обратите внимание на обещанную особенность приложения с интерфейсом
MDI: дочерняя форма может находиться только в пределах клиентской области родительского окна, и никакие усилия не смогут вынести ее за эти
границы. А вот еще один нюанс: попробуйте закрыть дочернюю форму. Получилось? Вместо того чтобы исчезнуть, дочерняя форма просто свернулась и «упала» вниз главной формы. Почему? Перечитайте информацию о событии OnClose(): все определяется значением переменной Action : TCloseAction. Для дочерней формы приложения MDI значение по умолчанию – caMinimize (вместо уже привычного нам caHide).
Теперь для того чтобы, например, уничтожить дочернюю форму, ее обработчик события OnClose() должен выглядеть примерно так:
procedureTfrmChild.FormClose(Sender: TObject; varAction: TCloseAction);
Begin
Action := caFree;
end;
Для того чтобы при старте приложения избежать автоматического создания дочерней формы, выберите пункт меню Project → Options и в открывшемся диалоговом окне на вкладке Forms перенесите форму frmChild из списка автоматически создаваемых форм в раздел доступных форм (рис. 9.7).
Каким образом можно создать
новую дочернюю форму? Все достаточно просто: вызываем из кода модуля главной формы конструктор дочерней формы:
unitmain;
…
Implementation
usesChild;
…
procedure…
varnewChild : TFrmChild;
Begin
newChild:=TFrmChild.Create(Application);
end;
Но не забудьте, что главная форма проекта (а точнее соответствующий ей
модуль main) нуждается в ссылке на дочернюю форму. Поэтому в начале раздела реализации модуля main.pas мы предупреждаем компилятор о том, что намерены использовать модуль child.pas. Вернемся к нашему примеру. Поместите на дочернюю форму многострочный текстовый редактор TMemo и его свойству Align присвойте значение alClient. В обработчике события OnShow главной формы проекта напишите следующие строки кода:
procedureTFrmMain.FormShow(Sender: TObject);
varnewChild : TFrmChild;
Begin
newChild:=TFrmChild.Create(Application);
NewChild.Memo1.Lines.LoadFromFile('c:\autoexec.bat');
NewChild.Caption:='Autoexec.bat';
newChild:=TFrmChild.Create(Application);
NewChild.Memo1.Lines.LoadFromFile('c:\config.sys');
NewChild.Caption:='Config.sys';
end;
Запустите проект. Мы научили приложение создавать два дочерних окна,
информирующих нас о содержимом файлов Autoexec.bat и Config.sys.
Ненадолго вернемся к теории. В классе TForm предусмотрен ряд свойств и методов, специализирующихся именно на приложениях с интерфейсом MDI.
Например, родительское окно приложения MDI всегда обладает информацией о количестве созданных дочерних окон:
propertyMDIChildCount: Integer;
Доступ ко всем созданным дочерним окнам можно получить из массива величин типа Tform:
propertyMDIChildren[I: Integer]: TForm;
Дочерние окна заносятся в массив в порядке их создания. Если какое-то
из окон в процессе работы приложения уничтожается, то массив самостоятельно упаковывается. Благодаря этим двум свойствам можно найти необходимое дочернее окно (или окна) и произвести с ним какие-то действия.
procedure…
varI : integer;
Begin
fori:=0 tofrmMain.MDIChildCount-1 do
iffrmMain.MDIChildren[i].Caption='Новый документ'
thenfrmMain.MDIChildren[i].WindowState:=wsMinimized;
end;
Код приведенного листинга позволяет среди всех дочерних окон обнаружить
формы, в заголовке которых написано «Новый документ», и свернуть их.
Для того чтобы узнать, какое из дочерних окон в настоящий момент активно, достаточно обратиться к свойству:
propertyActiveMDIChild: TForm;
Если у родительского окна в настоящий момент нет дочерних окон (свойство
MDIChildCount=0), свойство ActiveMDIChild вернет значение nil. Ряд методов главного окна решает задачи, связанные с размещением и упорядочиванием дочерних окон в своей клиентской области. Для выравнивания значков свернутых дочерних окон предназначен метод:
procedureArrangeIcons;
Эта команда разместит свернутые значки вдоль нижней рамки главной формы. Другой метод предназначен для размещения дочерних окон каскадом:
procedureCascade;
Процедура позволяет упорядочить окна таким образом, что пользователь
сможет видеть панели заголовков всех дочерних окон и быстро найти нужное окно. Операционная система также позволяет разместить дочерние окна таким образом, что они не будут перекрываться:
procedureTile;
Метод Tile сотрудничает со свойством:
propertyTileMode: TTileMode;
typeTTileMode = (tbHorizontal, tbVertical);
Код приведенного ниже примера упорядочит дочерние окна по горизонтали:
procedure…
Begin
TileMode:= tbHorizontal;
Tile;
end;
Для перемещения по дочерним формам предназначены два метода:
procedureNext; //активизировать следующую форму
procedurePrevious; //активизировать предыдущую форму
Названия процедур говорят сами за себя: процедура Next() выбирает следующее окно, а Previous() возвращается к предыдущему. Напомню, что к текущему окну можно обратиться при помощи свойства ActiveMDIChild.
Интерфейс SDI
В противостоянии двух разновидностей интерфейса к сегодняшнему дню наметился существенный перевес приложений простого интерфейса SDI.
Взгляните на внешний вид такого серьезного программного продукта, как
Delphi. Это классический пример интерфейса SDI. Корпорация Microsoft
как законодатель мод также постепенно снижает долю приложений с многодокументным интерфейсом. Например, все приложения из пакетов Microsoft Office 2000 и XP работают в режиме SDI.
С точки зрения программирования модули SDI (что вполне естественно) требуют несколько иной организации работы приложения. В приложении SDI главная форма проекта утрачивает некоторые возможности, например не
может упорядочивать свои дочерние окна на экране. Но главная отличительная черта проекта SDI в том, что все формы проекта (как главная, так и подчиненные) создаются со стилем FormStyle = fsNormal. Благодаря этому дочерние формы проекта могут свободно «бродить» за пределами клиентской области главной формы. В результате у пользователя создается впечатление, что все экранные окна приложения имеют равные права.
Выбор интерфейса будущего программного продукта – индивидуальное право программиста, определяемое его личными предпочтениями. Здесь трудно дать однозначный совет. Скажу одно: на мой взгляд, интерфейс MDI целесообразно применять в проекте, предназначенном для одновременной работы с несколькими однотипными документами. Интерфейс SDI более универсален и может использоваться во всех остальных проектах.
Дата добавления: 2016-03-15; просмотров: 860;