Итак, ключевую часть в программном модуле, описывающем то или иное окно приложения, является класс, описывающий это самое окно. Для форм в VCL, подобно другим компонентам, определен специальный класс – TForm. Однако следует учитывать, что на самом деле, класс TForm никогда напрямую не используется в приложениях: вместо него мы всегда будем работать с классами, порожденными на его основе.
TObject
TPersistent
TComponent
TControl
TWidgetControl
TFrameControl
TScrollingWidgetControl
TCustomForm
TForm
Форма (в примере) описывается как класс TForm1, а кнопка (Button1) является свойством этого класса. Если добавить к кнопке обработчик события (например, для OnClick), то этот обработчик автоматически получит имя Button1Click и будет определен как метод класса TForm1.
Создаваемый класс, описывающий форму, унаследует все свойства и методы от базового класса TForm, который происходит от класса TCustomForm, добавляя к нему лишь методы, связанные с многооконным интерфейсом (MDI). Класс TCustomForm, в свою очередь, происходит от класса TScrollingWinControl, являющегося прямым потомком уже упоминавшегося ранее класса TWinControl, опять-таки, имеющего по отношению к своему родителю лишь одно глобальное отличие – возможность прокрутки содержимого
Обычно сколько-нибудь сложное приложение содержит несколько форм. Первая из введенных в приложение форм считается главной. Главная форма отличается от прочих рядом свойств. Во-первых, именно этой форме передается управление в начале выполнения приложения. Во-вторых, закрытие пользователем главной формы означает завершение выполнения приложения.
Для каждой автоматически создаваемой формы Delphi добавляет в файл программы соответствующий оператор ее создания методом CreateForm. Это можно увидеть, если выполнить команду Project | View Source и просмотреть появившийся файл проекта .dpr. Он может, например, содержать следующие выполняемые операторы:
Application.CreateForm(TForml, Forml);
Application.CreateForm(TAboutBox, AboutBox);
Application.Run;
Первый и второй из них создают соответствующие формы, а третий начинает выполнение приложения.
В нужный момент форму можно сделать видимой методами Show или Show-
Modal.Последний метод открывает форму как модальную. Это означает, что
управление передается этой форме и пользователь не может передать фокус другой форме данного приложения до тех пор, пока он не закроет модальную форму. Методы Show и ShowModalможно применять только к невидимой в данный момент форме. Если нет уверенности, что форма в данный момент видима, то прежде, чем применять эти методы, следует проверить свойство Visibleформы. Например:
if (not Form2.Visible) then Form2.ShowModal;
Методом Hideформу в любой момент можно сделать невидимой.
Необходимо помнить, что для выполнения методов CreateForm, Show, ShowModal, Hideи вообще для обмена любой информацией между формами модули соответствующих форм должны использовать друг друга. Например, если форма (Б) модуле "Unitlдолжна управлять формой (В) модуле Unit2, то в оператор usesмодуля Unitl должно быть включено имя второго модуля Unit2. А если к тому же форма в модуле Unit2 должна пользоваться какой-то информацией, содержащейся в модуле Unitl,то в оператор uses модуля Unit2 должно быть включено имя первого модуля Unitl. В этом случае, если операторы usesв обоих модулях расположены в разделах Interface,возникнут проблемы с недопустимыми круговыми ссылками (circuior unit reference) и компилятор выдаст соответствующую ошибку.
От недопустимых круговых ссылок можно избавиться; если разомкнуть их, поместив один или оба оператора usesв раздел implementation.Впрочем, проще не включать имена модулей приложения в операторы usesвручную, а использовать команду File Use Unit, которая автоматизирует этот процесс и гарантирует отсутствие круговых ссылок.
Закрыть форму можно методом Close.
Модальные формы (353)
Открытие форм как модальных используется в большинстве диалоговых окон. Модальная форма приостанавливает выполнение вызвавшей ее процедуры до тех пор, пока пользователь не закроет эту форму. Модальная форма не позволяет также пользователю переключить фокус курсором мыши на другие формы данного приложения, пока форма не будет закрыта. Т.е. пользователь должен выполнить предложенные ему действия прежде, чем продолжить работу. Модальной может быть сделана любая форма, если она делается видимой методом ShowModal.Если та же самая форма делается видимой методом Show, то она не будет модальной.
Поведение модальной формы определяется ее основным свойством ModalResult.Это свойство доступно только во время выполнения приложения. При открытии формы методом ShowModalсначала свойство ModalResultравно нулю. Как только при обработке каких-то событий на форме свойству ModalResultбудет присвоено положительное значение, модальная форма закроется. А значение ее свойства ModalResultможно будет прочитать как результат, возвращаемый методом ShowModal. Таким образом, программа, вызвавшая модальную форму, может узнать, что сделал пользователь, работая с этой формой, например, на какой кнопке он щелкнул.
В Delphi предопределены некоторые константы, облегчающие трактовку ре-
зультатов, полученных при закрытии модальной формы:
Все приведенные выше пояснения значений ModalResult (кроме значений О
и 2) носят чисто условный характер. В своем приложении можно трактовать ту или иную величину ModalResult и соответствующие константы как угодно. Требуемые значения ModalResultможно задавать в обработчиках соответствующих событий в компонентах модальной формы.
Пример приложения с модальными формами заставки и запроса пароля:
1. Создаем новое приложение. 2 формы - главная форма Form1 и форма для ввода пароля Form2.
2. В форме Form2 разместим окно редактирования Edit1, в котором пользователь будет вводить свой пароль. Задать в свойстве PasswordChar компонента Edit символ *.
В обработчике события OnKeyDown этого компонента запишите:
if Edit1.Text='password'
then ModalResult:=6
else Close
3. В главной форме напишем обработчик события формы OnShow: