Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Сборник лабораторных работ(Delphi).doc
Скачиваний:
33
Добавлен:
16.08.2019
Размер:
3.26 Mб
Скачать

Лабораторная работа №24 Работа с формами

Цель работы: освоить навыки работы с формами

Студент должен

знать:

  • что такое форма и ее виды;

  • чем главная форма отличается от прочих;

  • как можно изменить принятые по умолчанию условия относительно форм;

  • свойства, методы и события, присущие формам;

  • как сделать форму видимой и невидимой;

  • для чего предназначены события метода Close

уметь:

  • изменить принятые по умолчанию условия относительно форм;

  • сделать форму в любой момент видимой или невидимой;

  • задавать требуемые значения ModalResult в обработчик соответствующих событий;

  • всеми способами реализовывать формы-заставки и формы запроса пароля.

Примеры и задания.

I. Рассмотрите приведенные ниже примеры и выполните предложенные по ним задания.

Основным элементом любого приложения является форма - контейнер, в котором размещаются другие визуальные и невизуальные компоненты. С точки зрения пользователя, форма - это окно, в котором он работает с приложением. Каждой новой форме, вводимой в приложение, соответствует свой модуль (unit), описывающий эту форму как класс и включающий, если необходимо, какие-то дополнительные константы, переменные, функции и процедуры. Рассмотрим некоторые свойства, методы и события, присущие формам.

Обычно сколько-нибудь сложное приложение содержит несколько форм, включение в проект новой формы осуществляется командой File \New \Form или другими способами.

По умолчанию все формы создаются автоматически при запуске приложения и первая из введенных в приложение форм считается главной.

Главная форма отличается от прочих рядом свойств.

Во-первых, именно этой форме передается управление в начале выполнения приложения.

Во-вторых, закрытие пользователем главной формы означает завершение выполнения приложения.

В-третьих, главная форма так же, как и любая другая, может быть спроектирована невидимой, но если все остальные формы зарыты, то главная форма становится в любом случае видимой (иначе пользователь не смог бы продолжать работать с приложением и даже не смог бы его завершить).

Указанные выше условия, принятые по умолчанию (первая форма — главная, все формы создаются автоматически), могут быть изменены. Главной в вашем приложении может быть вовсе не та форма, которая была спроектирована первой. Не стоит также в общем случае все формы делать создаваемыми автоматически.

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

Изменить принятые по умолчанию условия относительно форм можно в окне опций проекта, которое вызывается командой Project \Options. В открывшемся окне опций проекта (Project \Options) надо выбрать страницу Forms, представленную на рисунке.

В верхнем выпадающем списке MainForm можно выбрать главную форму среди имеющихся в проекте. Пользуясь двумя нижними окнами можно установить, какие формы должны создаваться автоматически, а какие не должны. Например, если надо исключить форму Fоrm2 из списка автоматически создаваемых, то надо:

выделить ее в левом окне (Auto-Create Forms) и с помощью кнопки со стрелкой, направленной вправо, переместить в правое окно доступных форм (Available Forms). Для каждой автоматически создаваемой формы Delphi добавляет в файл программы соответствующий оператор ее создания методом CreateForm. Это можно увидеть, если выполнить команду Project \View Source и просмотреть появившийся файл проекта .dpr. Он может, например, содержать следующие выполняемые операторы:

Application.CreateForm (TFoiml, Forml);

Application.CreateForm(TAboutBox, AboutBox);

Application.Run;

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

Для форм, которые были исключены из списка автоматически создаваемых, аналогичный метод CreateForm надо выполнить в тот момент, когда форма должна быть создана.

В момент создания формы возникает событие OnCreate. Обработка этого события широко используется для настройки каких-то компонентов формы, создания списков и т.д.

В нужный момент форму можно сделать видимой методами Show или ShowModal. Последний метод открывает форму как модальную. Это означает, что управление передается этой форме и пользователь не может передать фокус другой форме данного приложения до тех пор, пока он не закроет модальную форму

Методы Show и ShowModal можно применять только к невидимой в данный момент форме. Если нет уверенности, что форма в данный момент видима, то прежде, чем применять эти методы, следует проверить свойство Visible формы. Например:

if (not Form2.Visible) then Form2.ShowModal;

При выполнении методов Show или ShowModal возникает событие формы оnShow. Это событие возникает до того момента, как форма действительно станет ви­димой. Поэтому обработку события onShow можно использовать для настройки каких-то компонентов открываемой формы. Отличие от упомянутой ранее настройки компонентов в момент события onCreate заключается в том, что событие onCreate наступает для каждой формы только один раз в момент ее создания, а события onShow наступают каждый раз, когда форма делается видимой. Так что при этом в настройке можно использовать какую-то оперативную информацию, возникающую в процессе выполнения приложения.

Методом Hide форму в любой момент можно сделать невидимой. В этот момент в ней возникает событие onHide.

Необходимо помнить, что для выполнения методов CreateForm, Show, ShowModal, Hide и вообще для обмена любой информацией между формами модули соответствующих форм должны использовать друг друга.

Например, если форма в модуле Unitl должна управлять формой в модуле Unit2, то в оператор uses модуля Unit1 должно быть включено имя второго модуля Unit2. А если к тому же форма в модуле Unit2 должна пользоваться какой-то информацией, содержащей в модуле Unitl, то в операторе uses модуля Unit2 должно быть включено имя первого модуля Unitl.

Впрочем, проще не включать имена модулей приложения в операторы uses вручную, а использовать команду File \Use Unit, которая автоматизирует этот процесс.

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

Рассмотрим последовательность событий, возникающих при выполнении метода Close.

Первым возникает событие onCloseQuery. В его обработчик передается var (по ссылке) булева переменная CanClose, определяющая, должно ли продолжаться закрытие формы. По умолчанию CanClose равно true, что означает продолжение закрытия. Но если из анализа текущего состояния приложения или из ответа пользователя на запрос о закрытии формы следует, что закрывать ее не надо, параметру CanClose должно быть присвоено значение false. Тогда последующих событий, связанных с закрытием формы не будет.

Модальные формы.

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

Модальной может быть сделана любая форма, если она делается видимой методом ShowModal. Если та же самая форма делается видимой методом Show, то она не будет модальной.

Поведение модальной формы определяется ее основным свойством ModalResuit. Это свойство доступно только во время выполнения приложения. При открытии формы методом ShowModal сначала свойство ModalResult равно нулю. Как только при обработке каких-то событий на форме свойству ModalResult будет присвоено положительное значение, модальная форма закроется. А значение ее свойства ModalResult можно будет прочитать как результат, возвращаемый методом ShowModal. Таким образом, программа, вызвавшая модальную форму, может узнать, что сделал пользователь, работая с этой формой, например, на какой кнопке он щелкнул.

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

Численное значение ModalResult

Константа

Пояснение

0

mrNone

1

mrOk или idOK

Закрытие модальной формы нажатием кнопки ОK

2

mrCancel или idCancel

Закрытие модальной формы нажатием кнопки Cancel, или методом Close, или нажатием системного меню в полосе заголовка окна

3.

mrAbort или idAbort

Закрытие модальной формы нажатием кнопки Abort

4.

mrRetry или idRetry

Закрытие модальной формы нажатием кнопки Retry

5.

mrlgnore или idIgnore

Закрытие модальной формы нажатием кнопки Ignore

6.

mrYes или idYes

Закрытие модальной формы нажатием кнопки Yes

7.

mrNo или idNo

Закрытие модальной формы нажатием кнопки No

8.

mrAll

Закрытие модальной формы нажатием кнопки All

9.

mrNoToAll

Закрытие модальной формы нажатием кнопки No To Alk

10.

mrYesToAll

Закрытие модальной формы нажатием кнопки Yes To All

Все приведенные выше пояснения значений ModalResult (кроме значений О и 2) носят чисто условный характер. В своем приложении вы вольны трактовать ту или иную величину ModalResult и соответствующие константы как вам угодно.

Требуемые значения ModalResult можно задавать в обработчиках соответству­ющих событий в компонентах модальной формы. Однако при использовании кнопок можно обойтись и без подобных обработчиков. Дело в том, что кнопки типа TButton и TBitBtn имеют свойство ModalResult, по умолчанию равное mrNone. Для кнопок, расположенных на модальной форме, значение этого свойства можно изменить и тогда не потребуется вводить каких-либо обработчиков событий при щелчке на них. В кнопках BitBtn при свойстве Kind, не равном bkCustom, заложе­ны по умолчанию значения ModalResult, соответствующие назначению той или иной кнопки.

Пример приложения с модальными формами заставки и запроса пароля

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

Помимо формы-заставки нередко в приложениях, особенно в тех, которые работают с базами данных, в начале работы приложения появляется форма с запросом пароля. При неверном пароле приложение закрывается, не позволяя пользователю работать с ним.

Формы-заставки и формы запроса пароля могут быть реализованы множеством различных способов. Рассмотрим один из них.

1. Откройте в Delphi новое приложение (File \ New \ Application). Пусть открывшаяся форма будет главной в нашем приложении (вместо такой пустой формы вы можете взять любое разработанное вами ранее приложение и добавлять форму-заставку и форму запроса пароля в него). Назовите для определенности - главную форму приложения Fmain.

2. Добавьте в приложение новую форму (File \New \Form). Пусть это будет ваша форма-заставка. Назовите ее FLog. Ее свойство BorderStyle надо сделать равным bsNone, чтобы в окне этой формы отсутствовала полоса заголовка. Вы можете поместить на форме какой-то рисунок (разместить компонент Image и вставить в его свойство Picture желаемый рисунок), надписи и т.п. В простейшем случае поместите в центре формы метку Label и напишите в ней какой-то текст. Размер формы-заставки задайте небольшим, меньшим, чем обычные окна приложения. Свойство Position следует сделать рав­ным poScreenCenter, чтобы форма появлялась в центре экрана.

3. Теперь напишите обработчики событий, которые при любом действии пользо­вателя закрывали бы форму. Щелкните на форме, чтобы в Инспекторе Объектов открылись относящиеся к ней страницы (если у вас форма накрыта панелями или рисунками, то, щелкнув на них, нажимайте клавишу Esc до тех пор, пока в Инспекторе Объектов не откроются страницы, относящиеся к форме). Перейдите в Инспекторе Объектов на страницы событий, выберите событие onKeyDown и напишите для него обработчик, состоящий из одного операторов — Close. Аналогичный обработчик напишите для события onMouseDown. Если на форме у вас имеются метки, компоненты Image и др., то выделите их все, задайте в событии onMouseDown ссылку на тот же обработчик, что вы сделали для формы, а в форме поставьте свойство KeyPreview в true, чтобы форма перехватывала все связанные с нажатием клавиш события компонентов.

Теперь форма будет закрываться при нажатии пользователем любой клавиши или кнопки мыши. Давайте сделаем так, чтобы и при отсутствии каких-то действий со стороны пользователя форма закрывалась сама, например, через 5 секунд.

4. Добавьте на форму компонент Timer со страницы System. Это невизуальный компонент, который может отсчитывать интервалы времени. Интервал задается в свойстве компонента Interval в миллисекундах. Задайте его равным 5000. Единственное событие таймера — onTimer, наступающее по истечении заданного интервала времени. Напишите в обработчике этого собы­тия все тот же единственный оператор Close.

Теперь при любом действии и даже бездействии пользователя форма-заставка будет закрываться. Но что это означает? По умолчанию закрыть форму значит сделать ее невидимой. Однако, форма-заставка не нужна после того, как она будет предъявлена пользователю в первый момент выполнения приложения. Хранить все время в памяти эту уже ненужную форму не имеет смысла. Поэтому в форме надо предусмотреть, чтобы закрытие формы означало ее удаление из памяти и освобождение памяти для чего-нибудь более полезного. Для этого надо сделать следующее.

  1. В событие формы OnClose вставьте оператор:

Action:= caFree;

этот оператор приводит к уничто­жению объекта формы и освобождению занимаемой формой памяти.

Форма-заставка готова к использованию. Проверьте только, имеет ли ее свойство Visible значение false. Это важно, поскольку только невидимую форму можно открыть методом ShowModal. В главной форме свойство Visible тоже должно иметь значение false. Сохраните проект, дав файлу модуля главной формы имя Umain, а файлу модуля формы-заставки имя ULog.

Теперь можно записать в главной форме оператор ShowModal. Но чтобы это можно было сделать, необходимо сослаться в модуле Umain на модуль ULog.

  1. Добавьте в оператор uses модуля Umain имя модуля ULog, или напишите оператор uses ULog в разделе Implementation модуля Umain, или сделайте то же самое путем выполнения команды File \Use Unit.

Впрочем, если вы забудете это сделать, Delphi сама поправит вас и добавит этот оператор при попытке компиляции приложения, задав вопрос: «Form 'Fmain' preferences form 'FLog' declared in unit 'ULog' which is not in your USES list. Do you wish to add it, что означает «Форма 'Fmain' ссылается на форму 'FLog', объявленную в модуле 'ULdg', который отсутствует в вашем списке USES. Хотите ли вы добавить его в список?». При положительном ответе на этот вопрос соответствую­щий оператор будет добавлен в ваш модуль Umain.

После этого осталось написать в модуле Umain обработчик события формы OnShow.

  1. Напишите в модуле Umain обработчик события формы OnShow, состоящий из одного оператора:

FLog.ShowModal;

Событие OnShow наступает перед тем, как форма становится видимой. Поэтому в момент выполнения указанного оператора она еще не видна. Оператор открывает форму FLog как модальную, передает ей управление и дальнейшее выполне­ние программы в модуле Umain останавливается до тех пор, пока модальная форма не будет закрыта. После закрытия модальной формы выполнение программы продолжится и главная форма станет видимой.

Можете сохранить проект, запустить приложение и убедиться, что все работа­ет правильно.

Теперь добавим в приложение форму запроса пароля. Реальная форма такого типа, должна предлагать пользователю ввести свое имя и пароль, сравнивать введенные Значения с образцами, хранящимися где-то в системе, при неправильном пароле давать возможность пользователю поправиться. Если пользователь так и не может ввести правильный пароль, форма должна закрыть приложение, не допустив к нему пользователя. При правильном пароле после закрытия формы запроса должна открыться главная форма приложения. Все это не трудно сделать, но мы упростим задачу, чтобы не отвлекаться от главного — взаимодействия форм в приложении. Будем использовать всего один пароль, который непосредственно укажем в соответствующем операторе программы. И не будем давать пользователю возможности исправить введенный пароль.

8. Добавьте к приложению новую форму. Назовите ее FPSW и сохраните ее мо­ дуль в файле с именем UPSW. Уменьшите размер формы до разумных пределов, поскольку она будет содержать всего одно окно редактирования. Установите свойство формы Border Style равным bsDialog, свойство Position равным poScreenCenter. В свойстве Caption напишите «Введите пароль и нажмите Enter». Эта надпись будет служить приглашением пользователю.

9. Поместите в центре формы окно редактирования Edit, в котором пользователь будет вводить пароль. Очистите его свойство Text. Задайте в свойстве PasswordChar символ «*». В обработчике события OnKeyDown этого компонента запишите оператор:

if (key = VK_RETURN) then begin

if EPSW.Text = 'a'then ModalResult:=6

else Close;

end;

Этот оператор выполняет следующее. Прежде всего он анализирует нажатую клавишу. Если нажата клавиша Enter, то введенный текст отличается с паролем. В данном операторе для упрощения непосредственно указан правильный пароль — символ 'а*. Если введен правильный пароль, то свойству ModalResult присваивается некоторое условное число — 6 (можно было бы выбрать и любое другое допустимое число, кроме 0 и 2). Если пароль неправильный, то выполняется метод Close. В обоих случаях форма закрывается, так как задание отличного от нуля положительного значения ModalResult равносильно закрытию формы. Но при правильном пароле значение ModalResult будет равно 6, а при неправильном — 2. Это значение получается при выполнении метода Close или если пользователь нажмет кнопку системного меню (кнопку с крестиком) в полосе заголовка окна.

На этом проектирование формы запроса пароля закончено. Теперь запишем в модуле главной формы Umain оператор, показывающий пользователю эту форму и анализирующий ответ пользователя. Для этого надо выполнить следующие операции.

10. В модуле Umain, надо, как и ранее, добавить в оператор uses ссылку на модуль UPSW, а в обработчике события OnShow после ранее введенного опера­тора FLog.ShowModal добавить оператор:

if (FPSW.ShowModal <> 6)

then Close

else

ShowMessage('Ваш пароль '''+FPSW.EPSW.Text+''''); FPSW.Free; end;

Этот оператор анализирует значение свойства ModalResult формы запроса па­роля. Значение этого свойства возвращает функция FPSW.ShowModal. Если резу­льтат не равен 6, то был введен неправильный пароль. Тогда главная форма, а с ней вместе и приложение, закрываются методом Close. При правильном пароле можно продолжать работу приложения. Оператор ShowMessage введен просто для того, чтобы показать, как можно использовать свойство другой формы — в данном случае текст, введенный пользователем в качестве пароля. В реальном приложении по этому паролю можно было бы определить уровень доступа пользователя к конфиденциальной информации. Затем следует уничтожение формы запроса па­роля методом Free. Это необходимо сделать, чтобы освободить память. Сама по себе эта форма в момент ее закрытия не уничтожается, поскольку по умолчанию закрыть форму — значит сделать ее невидимой. Уничтожать форму до этого момента было нельзя, так как при этом уничтожилась бы содержащаяся в ней информация - введенный пароль.

На этом разработка нашего приложения закончена. Можете сохранить проект, запустить приложение и посмотреть, как оно работает.

Описанный выше способ управления формой запроса пароля не является опти­мальным. Он просто призван был показать, как можно обрабатывать величину МоdalResult, возвращаемую методом ShowModal. Но то же самое можно было бы сделать и проще. В обработчике события OnKeyDown окна редактирования на форме FPSW можно было бы написать более простой оператор:

if (key = VK_RETURN) and (EPSW.Text <> 'a') then Application.Terminate;

При неверном пароле этот оператор завершает работу всего приложения мето­дом Application.Terminate. Тогда в главной форме не надо анализировать резуль­тат работы пользователя с формой FPSW, так как если приложение не закрылось при выполнении оператора ShowModal, то значит пароль введен правильный. Поэ­тому операторы в главной форме тоже упрощаются:

FPSW.ShowModal;

ShowMessage ('Ваш пароль '''+FPSW.EPSW.Text+'''') ;

FPSW.Free;

End;

Проведите в вашем приложении соответствующие замены операторов и убедитесь, что приложение и в этом случае работает правильно.

II. Выполните предложенное ниже задание.

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

Создайте проект. Назовите форму: «Главная форма» (свойства Caption). В свойстве Name запишите: FormGlavn. Сохраните модуль под именем UnitGlavn и проект под именем ProjectGlavn.

Создайте три формы (File \New \Form). Назовите окна форм: «Первая форма», «Вторая форма», «Третья форма», дайте формам имена: Form_1, Form_2, Form_3 и сохраните модули этих форм под именами UnitForm_1, UnitForm_2, UnitForm_3. Закройте все три вновь созданные формы.

Откройте проект ProjectGlavn. В панели инструментов найдите команду Add file to project (добавить файл к проекту) (Project \Add file to project), выберите UnitForm_1, т е. мы добавили к проекту форму «Первая форма». Аналогично добавьте к проекту и остальные формы. Сохраните изменения.

На главную форму поместите компонент Tbevel (компонент для рельефного оформления интерфейса программы) со страницы Additional . В свойстве Shape (фигура) выберите: bsFrame (рамка).

Поместите на объект Bevel1 три кнопки TBitBtn со страницы Additonal. В свойстве Caption (заголовок) для кнопок запишите: «Первая форма», «Вторая форма», «Третья форма». Эти кнопки будут служить для перехода из главной формы к подчинённым. Для осуществления перехода к первой форме выделите кнопку «Первая форма» и в Инспекторе объектов на листе Events (события) в пустом окне события OnClick (щелчок) произведите двойной щелчок. Запишите следующий оператор в теле процедуры:

Form_1.Show;

Этот оператор делает видимой и доступной форму Form_1.

Аналогично опишите процедуры для двух других кнопок.

В модуле главной формы после служебного слова implementation (реализация) запишите: uses UnitForm_1, UnitForm_2, UnitForm_3. Таким образом вы связали четыре модуля. Пока модули не связаны, щелчок по кнопкам на главной форме не будет открывать подчинённые формы.

Сохраните и запустите проект.

На рис. показано, как выглядит окна программы на Рабочем столе.

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

unit Unit_FormGlavn;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, StdCtrls, ExtCtrls;

type

TFormGlavn = class(TForm)

Bevel1: TBevel;

Button1: TButton;

Button2: TButton;

Button3: TButton;

procedure Button1Click(Sender: TObject);

procedure Button2Click(Sender: TObject);

procedure Button3Click(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

var

FormGlavn: TFormGlavn;

implementation

uses Unit_Form1, Unit_Form2, Unit_Form3;

{$R *.dfm}

procedure TFormGlavn.Button1Click(Sender: TObject);

begin

Form1.Show;

end;

procedure TFormGlavn.Button2Click(Sender: TObject);

begin

Form2.Show;

end;

procedure TFormGlavn.Button3Click(Sender: TObject);

begin

Form3.Show;

end;

end.

III. Задание для самостоятельного выполнения.

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

Контрольные вопросы:

  1. Что такое форма? Какие формы вы знаете?

  2. Чем главная форма отличается от прочих?

  3. Как можно изменить принятые по умолчанию условия относительно форм?

  4. Как можно установить, какие формы должны создаваться автоматически, а какие не должны?

  5. Какое событие возникает в момент создания формы?

  6. Для чего предназначены методы Show и ShowModal?

  7. Чем отличается событие OnCreate от события OnShow?

  8. Как сделать форму видимой?

  9. Как сделать форму невидимой?

  10. Для чего предназначены события метода Close?

  11. Как сделать форму модальной?

  12. Охарактеризовать свойства модальной формы?

  13. Через какие события происходит изменение формы-заставки и формы запроса пароля?