10227

Работа с формами. События TForm

Лабораторная работа

Информатика, кибернетика и программирование

Лабораторная работа № 4 Работа с формами. События TForm. Цель работы: изучить события класса TForm, научиться обрабатывать события формы в windowsприложениях. Класс ТForm добавляет несколько событий к родительскому классу TWinControl. Эти события позволяют изменять поведение фор

Русский

2013-03-24

58.5 KB

4 чел.

Лабораторная работа № 4 

Работа с формами. События TForm.

Цель работы: изучить события класса TForm; научиться обрабатывать события формы  в windows-приложениях.

Класс ТForm добавляет несколько событий к родительскому классу TWinControl. Эти события позволяют изменять поведение формы путем выполнения загрузки и сохранения информации о состоянии формы или распределения и освобождения дополнительных ресурсов. Когда форма создается и отображается, происходит пять следующих событий.

1. OnCreate запускается при создании формы и позволяет распределять ресурсы и инициализировать форму. Когда форма создастся и Visible:= True, следующие события происходят в указанном порядке:

1. OnCreate

2. OnShow

3. OnActivate

4. OnPaint

2. OnShow происходит непосредственно перед выводом формы на экран. К этому времени все элементы управления и компоненты созданы и инициализированы. Хотя к тому моменту, когда происходит событие OnShow, форма еще не видна, свойство Visible установлено равным True.

3. OnResize генерируется при изменении размера формы во время выполнения приложения. Обычно здесь помещается код для изменения размера и положения на экране элементов управления, не поддерживающих свойство Align. Событие OnResize также однократно генерируется при создании формы, когда Delphi устанавливает начальные размеры формы. OnResize вызывается неоднократно в процессе изменения размеров формы.

4. OnActivate происходит при получении формой фокуса ввода. OnActivate вызывается только при переходе фокуса ввода от одной формы к другой в пределах одного приложения. При переключении между приложениями Delphi генерирует событие OnActivate глобального объекта Application.

5. OnPaint запускается, когда необходимо перерисовать форму. Это может происходить, когда форма только что стала видимой, при частичном удалении перекрывающих ее элементов или увеличении размеров. Событие полезно, если вы перерисовываете какую-то часть формы самостоятельно. Событие OnCreate происходит один раз за все время существования формы, прочие же события могут вызываться неоднократно.

 Следующие события происходят при работе пользователя с  клавиатурой:

1. OnKeyDown. Событие OnKeyDown наступает, если компонент находится в фокусе, при нажатии пользователем любой клавиши, включая функциональные и вспомогательные, такие, как Shift, Alt и Ctrl.

В обработчик события передаются, кроме обычного параметра Sender, указывающего на компонент, в котором произошло событие, также параметры Key и Shift. Параметр Key определяет нажатую клавишу клавиатуры и имеет тип Word. Для не алфавитно-цифровых клавиш используется виртуальный код API Windows. Коды не различают символы в верхнем и нижнем регистрах и не различают символы кириллицы и латинские.

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

Элемент Значение

ssShift Нажата клавиша Shift.

SsAlt Нажата клавиша Alt.

SsCtrl Нажата клавиша Ctrl.

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

2. OnKeyUp. Событие OnKeyUp наступает, если компонент находится в фокусе, при отпускании пользователем любой ранее нажатой клавиши, включая функциональные и вспомогательные, такие, как Shift, Alt и Ctrl. По структуре процедура обработки этого события аналогична процедуре обработки OnKeyDown.

3. OnKeyPress. Событие OnKeyPress наступает, если компонент находится в фокусе, при нажатии пользователем клавиши символа. Параметр Key в обработчике этого события имеет тип Char и соответствует символу нажатой клавиши. При этом различаются симолы в верхнем и нижнем регистрах и символы кириллицы и латинские. Клавиши, не отражаемые в кодах ASCII (функциональные клавиши и такие, как Shift, Alt, Ctrl), не вызывают этого события. Поэтому нажатие таких комбинаций клавиш, как, например, Shift-A, генерирует только одно событие OnKeyPress, при котором параметр Key равен "A". Для того, чтобы распознавать клавиши, не соответствующие символам, или комбинации клавиш, надо использовать обработчики событий OnKeyDown и OnKeyUp.

Следует отметить, что событие OnKeyPress заведомо наступает, если нажимается только клавиша символа или клавиша символа при нажатой клавише Shift. Если же клавиша символа нажимается одновременно с какой-то из вспомогательных клавиш, то событие OnKeyPress может не наступить (произойдут только события OnKeyDown при нажатии и OnKeyUp при отпускании) или, если и наступит, то укажет на неверный символ. Например, при нажатой клавише Alt событие OnKeyPress при нажатии символьной клавиши не наступает. А при нажатой клавише Ctrl событие OnKeyPress при нажатии символьной клавиши наступает, но символ не распознается.

Поскольку параметр Key передается в обработчик как var, его можно изменять, передавая для дальненйшей стандартной обработки другой символ.

События OnKeyDown и OnKeyUp используют виртуальные коды (все они перечислены в файле WINDOWS.PAS).

Клавиша Десятичное число Шестнадцатеричное число Символическое имя

F1   112    $70   VK_F1

F2   113    $71   VK_F2

...

F10  121    $79   VK_F10

пробел  32    $20   VK_SPACE

BackSpace  8    $8   VK_BACK

Tab  9    $9   VK_TAB

Enter  13    $0D   VK_RETURN

Shift  16    $10   VK_SHIFT

Ctrl  17    $11   VK_CONTROL

Alt   18    $12   VK_MENU

CapsLock  20    $14   VK_CAPITAL

Esc   27    $1B   VK_ESCAPE

Insert  45    $2D   VK_INSERT

PageUp  33    $21   VK_PRIOR

PageDown  34    $22   VK_NEXT

End  35    $23   VK_END

Home  36    $24   VK_HOME

Стрелка влево 37    $25   VK_LEFT 

Стрелка верх  38    $26   VK_UP 

Стрелка вправо  39    $27   VK_RIGHT 

Стрелка вниз  40    $28   VK_DOWN 

Delete  46    $2E   VK_DELETE

PrintScreen 44    $2C   VK_SNAPSHOT

ScrollLock  145    $91   VK_SCROLL

Pause  19    $13   VK_PAUSE

NumLock  144    $90   VK_NUMLOCK

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

  1.  OnMouseDown.  Событие наступает в момент нажатия пользователем клавиши мыши над компонентом.
  2.  OnMouseUp. Событие наступает при отпускании нажатой кнопки мыши над объектом.

Обработка событий OnMouseDown и OnMouseUp используется для операций, требуемых при нажатии и отпускании пользователем какой-нибудь кнопки мыши. Если требуется различная обработка событий в зависимости от того, какая кнопка мыши нажата или какая нажата вспомогательная клавиша, можно анализировать параметры Button и Shift. Значения параметра Button определяют, какая кнопка мыши нажата: mbLeft - левая, mbRight - правая, mbMiddle - средняя. Параметр Shift представляет собой множество, содержащее помимо обозначения нажатой кнопки еще и обозначения нажатых одновременно с этим вспомогательных клавиш Shift, Alt, Ctrl (соответствуют элементам множества ssShift, ssAlt, ssCtrl). Параметры X и Y определяют координаты указателя мыши в клиентской области компонента. Параметр Sender используется во всех обработчиках событий и показывает, в каком компоненте произошло событие. Нередко один и тот же обработчик применяется для реакции на события различных компонентов, причем основная часть обработки не зависит от источника события, но в каких-то операторах требуется распознавать этот источник. Тогда можно обращаться к параметру Sender.

Параметр Sender имеет тип TObject. А в классе TObject не определено никаких свойств. Поэтому непосредственно можно использовать только имя класса, как в приведенных ниже операторах:

ShowMessage('OnClick в компоненте класса '+Sender.ClassName);

if Sender.ClassNameIs('TButton')

 then ...

Более детальную информацию об источнике события можно получить, применяя операцию as и ссылаясь на Sender как на объект производного класса, например, класса TControl, в котором определены основные свойства компонентов. Примеры таких ссылок:

ShowMessage('OnClick в '+(Sender as TControl).Name);

if (Sender as TControl).Name = 'Button1'

 then ...

3. OnMouseMove. Событие наступает при перемещении курсора мыши над компонентом. Параметр Shift, являющийся множеством, содержит элементы, позволяющие определить, какие кнопки мыши и какие вспомогательные клавиши (Shift, Ctrl и Alt) нажаты в этот момент. Параметры X и Y определяют координаты указателя мыши в клиентской области компонента. Параметр Sender - сам компонент.

Событие OnMouseMove возникает независимо от того, нажаты ли какие-то кнопки или клавиши. Правда, хотя это и не документировано в Delphi, при нажатой правой кнопке мыши это событие, почему-то, не наблюдается.

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

1. OnCloseQuery генерируется в ответ на действия, закрывающие форму. Обработчик получает логическую переменную CanClose, определяющую, может ли форма быть закрыта. По умолчанию она имеет значение True, но если вы в обработчике установите False, форма останется открытой. Обычно это используется для сохранения не сохраненных файлов или для подтверждения закрытия формы. Вот пример такого кода.

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

CanClose:= MessageDlg('Close form?', mtConfirmation,[mbYes,mbNo],0) = mrYes;

end;

2. OnClose генерируется непосредственно перед закрытием формы. Обычно оно используется для изменения стандартного поведения формы при закрытии. Для этого Delphi передает в обработчик события переменную Action, которая может принимать одно из четырех значений: caHide, caMinimize, caNone или caFree. По умолчанию для не MDI-форм используется caHide, скрывающее форму. Для дочерних MDI-форм значение по умолчанию, сворачивающее форму, равно caMinimize. Если Action установлено равным caNone, закрытия не происходит. caFree заставляет Delphi закрыть форму и освободить всю связанную с ней память. Если после этого сослаться на объект формы, произойдет исключительная ситуация.

OnClose вызывается только при закрытии формы с помощью щелчка на кнопке закрытия или вызова функции Close. Если вы закрываете главную форму приложения, все другие открытые формы закрываются без вызова события OnClose. Событие OnCloseQuery вызывается всегда, независимо от способа закрытия формы.

3. OnDeActivate происходит при потере формой фокуса ввода. Запуск происходит по тем же правилам, что и запуск события OnActivate.

4. OnHide запускается непосредственно перед тем, как форма станет невидимой. Хотя при вызове OnHide форма еще видна, ее свойство Visible установлено равным False.

5. OnDestroy генерируется непосредственно перед уничтожением формы. Обычно оно используется для освобождения ресурсов, выделенных в OnCreate. Событие OnDestroy вызывается только один раз за все время существования формы, прочие события могут вызываться неоднократно.

Задания на разработку

1. Создайте приложение, которое при закрытии спрашивает пользователя "Вы уверены?", предлагая два варианта ответа (Да/Нет). Приложение должно быть закрыто только при положительном ответе на вопрос.

2. Создайте приложение в котором при нажатии мыши на полотне окна на экране в TMemo фиксируются координаты нажатия, а в процессе перемещения мыши отображаются ее координаты в TLabel.

3. Создайте приложение в котором при изменении размеров окна меняются размеры помещенных на него компонентов.

4. Создайте приложение, которое при выборе находящихся на нем компонентов, показывает имя компонента, имя класса и т.п.

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

  1.  Что такое событие? Как создается обработчик события?
  2.  Чем отличается событийное программирование от линейного (программирование  DOS - приложений)?
  3.  Какое событие следует обработать,  если Вы хотите задать начальные значения данным в программе?
  4.  Какие события происходят при создании формы?
  5.  Какие события происходят при уничтожении формы?
  6.  Как произвести обработку нажатия на кнопку мыши вместе с функциональными клавишами?
  7.  Какова структура обработчиков событий OnKeyDown, OnKeyUp и OnKeyPress?
  8.  Как можно скрыть форму?
  9.  Расскажите о событиях, генерируемых при работе с изученными Вами визуальными компонентами TPanel, TEdit, TMemo, TCheckBox, и т.д.


 

А также другие работы, которые могут Вас заинтересовать

16023. Иностранное право в судебной практике 862.5 KB
  ИНОСТРАННОЕ ПРАВО В СУДЕБНОЙ ПРАКТИКЕ Ю.А. Тимохов Волтерс Клувер 2004 Оглавление КОММЕНТАРИЙ Предисловие Глава I. ПРИМЕНЕНИЕ СУДАМИ ИНОСТРАННОГО ПРАВА 1. Российское законодательство об иностранном праве 2. Применение иностранного права в случае предусм
16024. Уголовно-исполнительная система России цифры факты и события 1.21 MB
  В.Г.Тимофеев Уголовноисполнительная система России: цифры факты и события Министерство образования Российской Федерации Чувашский государственный университет им. И. Н. Ульянова Тимофеев В. Г. Уголовноисполнительная система России: цифры факты и с
16025. История законодательства о праве поземельной собственности в России с IX по начало XX века 579 KB
  Тесля А. А. История законодательства о праве поземельной собственности в России с IX по начало XX века. Учебное пособие. 2004. Тесля Андрей Александрович преподаватель кафедры Правоведение Дальневосточного государственного университета путей сообщения. Данн
16026. Взаимодействие следователя с иными подразделениями органов внутренних дел при расследовании преступлений 316.5 KB
  Тертышник B.M. Слинько С.В. Взаимодействие следователя с иными подразделениями органов внутренних дел при расследовании преступлений. Харьков: Унт внутр. дел. 1995 . 66 с. ВВЕДЕНИЕ все действия следователя должны быть направлены к достижению цели следствия состоящей в т...
16027. Юридические основания к суждению о силе доказательств и мысли из речей Председательствующего по уголовным делам 958.5 KB
  Терновский Н.А. Юридические основания к суждению о силе доказательств и мысли из речей Председательствующего по уголовным делам Пособие для юристовпрактиков и присяжных заседателей. Тула Типография В.Н. Соколова 1901 г. Юридические основания к суждению о силе доказа...
16028. Ответственность за соучастие в преступлении 1000 KB
  п.ф.тельнов. ответственность за соучастие в преступлении. москва 1974 г. Глава 1. ПОНЯТИЕ И ПРИЗНАКИ СОУЧАСТИЯ 1. ПОНЯТИЕ И ЗНАЧЕНИЕ СОУЧАСТИЯ В советском уголовном праве определение соучастия впервые было дано Руководящими началами в ст. 21 которых говори
16029. Конституційно-правові засади становлення української державності 1.65 MB
  У монографії з урахуванням сучасного етапу державотворення в Україні аналізуються актуальні проблеми становлення українського конституціоналізму, розвитку громадянського суспільства, прав і свобод людини і громадянина, розвязання державноправових конфліктів...
16030. Адміністративно-правове регулювання міграційних процесів 1.44 MB
  Адміністративноправове регулювання міграційних процесів. ЗМІСТ Розділ 1. Міграція як соціальноправовий феномен. 1.1. Міграція як предмет наукового дослідження. Природним закономірним процесом що дозволяє збалансувати е...
16031. Ипотека. Организация ипотечного кредитования 2.45 MB
  Целью учебного пособия является ознакомление с историей становления ипотеки, основными направлениями, современным состоянием, проблемами и перспективами ее развития за рубежом, в России, в конкретном коммерческом банке, на железнодорожном транспорте, в частности, Московской железной дороге при организации жилищного ипотечного кредитования.