Методы и события
Событие OnCreate возникает в момент создания формы. Обработка этого события широко используется для настройки каких-то компонентов формы, создания списков и т.д.
Методы Show или ShowModalделают форму видимой. Последний метод открывает форму как модальную. Это означает, что управление передается этой форме и пользователь не может передать фокус другой форме данного приложения до тех пор, пока он не закроет модальную форму. МетодыShow и ShowModal можно применять только к невидимой в данный момент форме. Если нет уверенности, что форма в данный момент невидима, то прежде, чем применять эти методы, следует проверить свойствоVisible формы. Например:
if (not Form2.Visible) then Form2.ShowModal;
CобытиеonShowвозникает до того момента, как форма действительно станет видимой. Поэтому обработку событияonShow можно использовать для настройки каких-то компонентов открываемой формы. Отличие от упомянутой ранее настройки компонентов в момент событияonCreate заключается в том, что событиеonCreate наступает для каждой формы только один раз в момент ее создания, а событияonShow наступают каждый раз, когда форма делается видимой. Так что при этом в настройке можно использовать какую-то оперативную информацию, возникающую в процессе выполнения приложения.
Методом Hide форму в любой момент можно сделать невидимой. В этот момент в ней возникает событиеonHide.
Необходимо помнить, что для выполнения методов 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закрывает форму. При этом в закрывающейся форме возникает последовательность событий, которые можно обрабатывать. Их назначение — проверить возможность закрытия формы и указать, что именно подразумевается под закрытием формы. Проверка возможности закрытия формы необходима, например, для того, чтобы проанализировать, сохранил ли пользователь документ, с которым он работал в данной форме и который изменял. Если не сохранил, приложение должно спросить его о необходимости сохранения и, в зависимости от ответа пользователя, сохранить документ, закрыть приложение без сохранения или вообще отменить закрытие.
Рассмотрим последовательность событий, возникающих при выполнении метода Close.
Первым возникает событие onCloseQuery. В его обработчик передается как var (по ссылке) булева переменнаяCanClose, определяющая, должно ли продолжаться закрытие формы. По умолчаниюCanClose равноtrue, что означает продолжение закрытия. Но если из анализа текущего состояния приложения или из ответа пользователя на запрос о закрытии формы следует, что закрывать ее не надо, параметруCanClose должно быть присвоено значениеfalse. Тогда последующих событий, связанных с закрытием формы не будет.
Например, пусть в приложении имеется окно редактирования RichEditl, в котором свойствоModified указывает на то, был ли изменен пользователем текст в этом окне с момента его последнего сохранения. Тогда обработчик событияonCloseQuery может иметь вид:
procedure TForml . FormCloseQuery (Sender: TObject; var CanClose: Boolean);
begin
if RichEditl.Modified then
if (Application.MessageBox('Текст документа не сохранен.'+
' Действительно хотите закончить работу ?',
'Подтвердите завершение работы’,
MB_ICONQUESTION+MB_YESNOCANCEL) <> IDYES)
then CanClose := false;
end,
В приведенном операторе вызывается методом Application.MessageBox диалоговое окно. Первый параметр метода содержит текст сообщения пользователю. Второй параметр — текст заголовка окна. Третий параметр — набор флагов, определяющих вид окна. ФлагMB_ICONQUESTION отображает в окне пиктограмму вопросительного знака. Флаг MB_YESNOCANCEL заносит в окно кнопки Да, Нет и Отмена. В результате пользователю будет показано окно диалога. ФункцияMessageBox возвращает результат, который указывает на реакцию пользователя в диалоговом окне. ЗначениеIDYES возвращается, если пользователь нажал кнопку Да, значениеIDNO возвращается при нажатии кнопки Нет, значениеIDCANCEL — при нажатии кнопки Отмена или клавиши Esc.
В нашем примере, если пользователь в диалоговом окне с запросом о сохранении не ответит Да, то CanClose будет равноfalse и окно не закроется. Причем этот обработчик сработает при любой попытке пользователя закрыть приложение: нажатии в нем кнопки или раздела меню Выход, нажатии кнопки системного меню в полосе заголовка окна и т.п.
Если обработчик события onCloseQuery отсутствует или если в его обработчике сохранено значениеtrue параметраCanClose, то следом наступает событиеOnClose. В обработчик этого события передается какvar переменнаяAction, которой можно задавать значения:
сaNone Не закрывать форму. Это позволяет и в обработчике данного события еще отказаться от закрытия формы.
caHide При этом значении (оно принято по умолчанию для форм, не являющихся главными формами и дочерними в приложениях MDI) закрыть форму будет означать сделать ее невидимой. Для пользователя она исчезнет с экрана, однако вся хранящаяся в форме информация сохранится. Она может использоваться другими формами или той же самой формой, если она снова будет сделана видимой.
caMinimize При этом значении закрыть форму будет означать свернуть ее до пиктограммы. Как и в предыдущем случае, вся информация в форме будет сохранена
сaFree При этом значении закрыть форму будет означать уничтожение формы и освобождение занимаемой ею памяти. Вся информация, содержащаяся в форме, будет уничтожена. Если эта форма в дальнейшем потребуется еще раз, ее надо будет создавать методом CreateForm.
Например:
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Action:=caFree;
end;
Если в обработчике события OnClose задано значениеAction, равноеcaFree, то при освобождении памяти возникает еще одно последнее событие —OnDestroy.
Оно обычно используется для очистки памяти от тех объектов, которые автоматически не уничтожаются при закрытии приложения.
