19.3. СОЗДАНИЕ И ИСПОЛЬЗОВАНИЕ ФОРМ
Для подключения новой формы к проекту достаточно обратиться к репозиторию и выбрать нужную разновидность формы. Менеджер проекта автоматически подключает новую форму к списку используемых форм и обеспечивает все необходимые действия по ее инициации. Самая первая подключенная к проекту форма (стандартное имя формы - Form1) становится главным окном программы. Окно этой формы автоматически появляется на экране в момент старта программы. Впрочем, программист может указать любую форму, окно которой станет главным. Для этого нужно обратиться к опции
Project | Options И, раскрыв список Main form, выбрать нужную форму (рис. 19.1).
Pис 19.1. Окно управления проектом
Каждое следующее окно становится видно только после обращения к его методу show или showModal. Чтобы обратиться к этим методам, нужно сослаться на объект-окно, который автоматически объявляется в интерфейсном разделе связанного с окном модуля. Для этого, в свою очередь, главное окно должно знать о существовании другого окна, что достигается ссылкой на модуль окна в предложении uses. Если, например, в ходе выполнения одного из методов главного окна программист захочет вызвать окно с именем fmForm, связанное с модулем Formunit, он должен сослаться на этот модуль в предложении uses главного окна:
implementation Uses FormUnit;
после чего вызвать окно на экран:
fmForm.Show;
или
fmForm.ShowModal;
Delphi автоматизирует вставку ссылки на модуль в предложение uses. Для этого на этапе конструирования нужно активизировать главное окно, щелкнув по нему мышью, после чего обратиться к опции File | uses unit. В появившемся диалоговом окне (рис. 19.2) нужно выбрать модуль и нажать ок. Вставляется ссылка в предложение, стоящее за зарезервированным словом Implementation, т. к. обычно главное окно в своей интерфейсной части не ссылается на элементы интерфейсной части второго окна. Точно так же можно при необходимости сослаться в модуле второго окна на модуль главного окна: активизируйте второе окно и вновь вызовите опцию File | uses Unit. Замечу, что, если программист забыл сослаться на модуль, который подключен к проекту, Delphi при первой же трансляции программы сообщит об этом и предложит вставить недостающую ссылку.
Рис. 19.2 . Вставка ссылки на модуль
При вызове метода show второе окно появляется на экране и работает одновременно с первым, поэтому управление сразу передается оператору, стоящему за обращением к этому методу. Такие окна называются немодальными, они всегда открываются в одном методе, а закрываются в другом. В отличие от этого обращение к show-Modal создает модальное окно, которое полностью берет на себя дальнейшее управление программой, поэтому оператор за обращением к showModal в вызывающей части программы получит управление только после закрытия модального окна.
Модальные окна всегда требуют от пользователя принятия какого-либо решения. С их помощью реализуется диалог с пользователем или создается информационное окно, которое пользователь должен закрыть после ознакомления с содержащейся в нем информацией. Если от пользователя требуется принятие решения, в модальное окно вставляются зависимые или независимые переключатели, кнопки и другие интерфейсные элементы, с помощью которых пользователь сможет сообщить программе о принятом решении. В момент закрытия диалога модальное окно должно поместить число, соответствующее решению пользователя, в свое свойство ModalResuit. Некоторые стандартные кнопки (ok, Yes, No, cancel и т. п.) автоматически выполняют эти действия: помещают нужное число в ModalResuit и закрывают окно. В других случаях об этом должен позаботиться программист. Вызывающая программа получает значение ModaiResuit как значение функции showModal и может тут же его проанализировать:
if Form2.ShowModai = mrXXX then ....
Возможен и такой вариант:
Form2.ShowModal ;
if Form2.ModaiResuit = mrXXX then .....
Для закрытия окна (модального или немодального) используются методы Hide или close. Следует учесть, что метод Close всегда помещает в ModalResult значение 2 (mrCancel), в то время как Hide неt меняет значения этого свойства, поэтому, если программист хочет передать в вызывающую программу нестандартный модальный результат, следует писать:
ModaiResuit := MyResult;
Hide; // Но ни в коем случае Close!
Примечание
Подключение нового окна к проекту приводит к тому, что менеджер; проекта размещает его имя в списке автоматически создаваемых окон на рис. 19.1 -список Auto-Create forms). В этом случае про-Дкшмист может не заботиться об инициации, соответствующего объекта окна. Однако если в программе используется множество окон, автоматическое их создание в момент старта программы может существенно затянуть во времени процесс загрузки программы; В то же Демя немедленное создание всех окон вовсе не обязательно, так как вряд ли вам понадобится одновременно показывать их на экране в немодальном режиме. Профессиональные программисты никогда не создают: все оконные объекты в момент старта программы, но используют их по мере надобности. Дчя .этого в окне менеджера проекта ссылки на эти формы переносятся в панель Available forms (рис. 19.1), а обращение к окну .
Мне известен случай, когда этот нехитрый прием позволил сократить время загрузки программы с З с лишним минут до 15 секунд.
Кстати, полезно соответствующим образом настроить среду Delphi: вызовите Tools I Environment Options и на странице Designer уберите флажок в преключателе Autоcreate forms & data modules.