События, обрабатываемые формой

Так как форма (компонент типа TForm) является базовым ин­терфейсным элементом для всех программ, создаваемых в среде Delphi, уместно начать знакомство с обработчиками событий с обработчиков, имеющихся у компонента TForm. Таких обработ­чиков 20: OnActivate, OnClick, OnClose, OnCloseQuery, OnCreate, OnDblClick, OnDeactivate, OnDestroy, OnDragDrop, OnDragOver, OnHide, OnKeyDown, OnKeyPress, OnKeyUp, OnMouseDown, OnMouseMove, OnMouseUp, OnPaint, OnResize и OnShow. Боль­шинство событий и их обработчиков присущи и другим компо­нентам, поэтому они рассматриваются в следующих разделах. В этом разделе мы остановимся на событиях, характерных непо­средственно для формы. Отметим, что эти события носят в боль­шинстве своем нотификационный (уведомляющий) характер и имеют тип TNotifyEvent Type,описанный следующим образом:

TNotifyEvent = procedure (Sender: TObject) of object;

но ряд событий требует передачи дополнительной информации. К таким событиям, обрабатываемым формой, относятся события OnActivate, OnClose и OnCloseQuery. Нотификационные сообще­ния не несут в себе никакой информации о самом событии, только содержат указатель на источник события — параметр Sender.

Событие OnActivate

Форма получает событие OnActivate при ее активизации. Ак­тивизация формы может произойти при получении ею фокуса, например, когда пользователь нажал кнопку мыши в рабочей облас и формы. Для дочерних окон MDI-форм (форм, создан­ных со значением свойства FormStyle, равным fsMDIChild) со­бытие OnActivate возникает при переключении фокуса на данное окно. Если же происходит переключение фокуса с обычного до­чернего окна на MDI-дочернее окно, то это событие получает родительское MDI-okho.

Событие OnActivate имеет тип TActivateEvent,описанный сле­дующим обратом:

TActivateEvent = procedure(Sender: TObject; Activating: Boolean) of object;

Параметр Activating указывает, становится форма активной или нет.

Событие OnClose

Событие OnClose наступает при закрытии формы. Форма по­лучает это событие перед закрытием формы, которое может на­ступить либо при вызове метода Close, либо при выборе команды Close из системного меню.

Событие OnClose имеет тип TCloseEvent,описанный следую­щим образом:

TCloseEvent = procedure(Sender: TObject; var Action: TCloseAction) of object;

Параметр Action определяет тип закрытия формы и может при­нимать одно из следующих значений:

Значение Описание
caNone Форму нельзя закрыть
caHide Форма на самом деле не закрывается, а становится невидимой
caFree Форма закрывается

Ниже показано, как создать обработчик сообщения OnClose. Из следующего примера видно, как использовать параметр Ac­tion для закрытия формы:

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);

begin

{Запросить подтверждение на закрытие}

If MessageDlg(‘Close the form?’,

mtConfirmation.mbOkCancel.O) = mrOk

{Нажата кнопка Ok - закрываем форму}

Then Action := caFree

{Нажата кнопка Cancel - игнорируем закрытие}

Else Action := caNone;

end;

Событие OnCloseQuery

С помощью этого события можно разрешить или отменить закрытие формы. Это событие может наступить либо при вызове метода Close, либо при выборе команды Close из системного меню. В обработчике этого события вы изменяете значение параметра CanClose сообщения OnCloseQuery.

Пример закрытия формы с подтверждением в этом случае мо­жет выглядеть следующим образом:

procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);

begin

{Запросить подтверждение на закрытие}

If MessageDlg('Close the form?',

mtlnformatlon, [mbOk, mbNo], 0) = mrOk

{Нажата кнопка Ok - закрываем форму}

Then CanClose := True

{Нажата кнопка No - игнорируем закрытие}

Else CanClose := False;

end;

Событие OnCloseQuery имеет тип TCIoseQueryEvent,описан­ный следующим образом:

TCIoseQueryEvent = procedure(Sender: TObject; var CanClose: Boolean) of object;

Событие OnCreate

Это событие возникает при начальном создании формы. В об­работчике данного события можно, например, задавать началь­ные значения свойствам формы и предусматривать другие различные действия, которые должны происходить в момент созда­ния формы. Форма создается при запуске приложения либо при вызове метода Create.

Примечание. Не используйте имени компонента типа «форма» (например, Forml) при вызове свойств или методов компонен­тов, включенных в форму, так как компонент этого типа еще не
существует (находится в процессе создания и инициализации), и обращение к нему вызовет ошибку.

При создании формы события происходят в следующем по­рядке:

OnCreate

OnActivate

OnPaint

В приведенном ниже примере показано, как задать цвет фона формы, равный системному цвету, определенному в ядре Windows:

procedure TForm1.FormCreate(Sender: TObject);

begin

Color := clAppWorkSpace;

end;

Событие OnCreate имеет тип TNotifyEvent.

Событие OnDestroy

Событие OnDestroy возникает на финальной стадии закрытия формы и может быть вызвано с помощью методов Destroy или Free либо закрытием главной формы приложения. Это событие имеет тип TNotifyEvent.

Событие OnPaint

Событие OnPaint возникает при необходимости перерисовки содержимого формы. Например, оно может возникнуть при по­лучении формой фокуса. Обработчик этого события может ото­бражать информацию в рабочей области формы. (Более подроб­но об отображении информации и сообщении OnPaint см. в главе «Графические компоненты и использование графики».) Сооб­щение OnPaint имеет тип TNotifyEvent.

Событие OnResize

Событие OnResize возникает при изменении размеров формы во время работы приложения. Обработчик этого события необ­ходим только в том случае, если вы планируете выполнять какие-либо действия при изменении размеров формы. Например, это может быть перемещение интерфейсных элементов или какие-либо другие действия. Сообщение OnResize имеет тип TNotifyEvent.

Наши рекомендации