http://seprize.narod.ru

Урок №2 (Обработка событий, убегающая кнопка)

В этом уроке я постараюсь объяснить как создается обработка событий. Начнем с того что я поясню что такое событие. Событие (английское event) - это как вы наверное догадались это такая ситуация, когда что-то происходит. Вот например вы нажали кнопку, и вот тут-то и происходит обработка этого события. В первом уроке как раз была обрабытка события нажатия на кнопку, я специально не стал вдаваться в подробности. Тем более сразу все запомнить невозможно.

Надо сделать отступление. Операционная система построена таким образом, что она постоянно обрабатывает сообщения, реагируя на действия пользователя, на его нажатия на клавиатуре и мышке. Очень часто получается так что система ждет ввода от пользователя. А после этого начинает выполнять определенные действия простые или не очень, может даже крайне сложные операции.

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

Для этого откроем Delphi с новым проектом. Уменьшим размеры главной формы. Предлагаю сделать следующие установки. Для этого в свойствах формы установим ее размеры ширина (Width) и высота (Height) )присвоим значение 300, этого вполне достаточно. У нас получилось квадратное окно. В нем мы разместим кнопку. Свойство надпись (Caption) предлагаю поменять на "выход". Еще вы освоите команду закрытия приложения. Вы можете так же поменять заголовок формы на такой какой хотите, что бы не портить вид нашего приложения. И у вас должно получится примерно то же самое, что у меня на картинке слева.

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

 

Программирование начнем с того что необходимо выделить нашу единственную кнопку далее переходим в инспектор объектов. в нем выбираем вкладку Events - это и есть список событий у кнопки, так что выбирать кнопку обязательно. Кнопку можно выбрать несколькими способами. Можно это сделать в выпадающем списке у инспектора объектов. Очень часто приходится делать именно таким образом когда компонент потерялся на форме. Причина может быть его небольшие размеры или перекрытие его другим, более большим, компонентом. Нас интересует событие OnClick. В первом примере мы уже пользовались событиями, но Вы скорее всего этого еще не знали. Необходимо Вам сделать двойной щелчок мышки на пустом поле справа от поля с надписью OnClick. Delphi сразу откроет вам окно с кодом программы, в котором уже подготовлены заголовок и окончание и Вам остается только написать тот код который Вы хотите что бы исполнялся. Обратите внимание, что на том месте в инспекторе объектов куда вы щелкнули мышкой появилась надпись Button1Click это означает что добавлено событие и ему присвоено это название. Предлагаю Вам рас кнопка называется выход, то и сделать что бы происходил выход из программы. Если вы сейчас запустите ваше приложение сделать это можно либо кнопкой ,либо просто нажав кнопку F9 на клавиатуре. После того как Delphi создаст готовый проект и запустит его, а создаст она такой простой проект моментально, вы можете убедиться что при нажатии на кнопку ничего не происходит. Закройте Вашу программу и давайте продолжим программировать. Снова посмотрите в Инспектор объектов, там вы заметите что поле где была надпись Button1Click пустое. Так происходит всегда, если вы не добавили исполняемый код, то Delphi убирает пустые подпрограммы. Ваша программа выглядела бы мало читаема, если бы в ней присутствовали все заголовки для всех событий у всех объектов.

Теперь необходимо еще раз создать обработчик событий для события OnClick, надеюсь Вы еще помните как это делается. В появившемся тексте подпрограммы :

. . .
procedure TForm1.Button1Click(Sender: TObject);
begin

end;
. . .

Между операторами begin и end записываем команду Close;

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

procedure TForm1.Button1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
if abs(Y - Button1.Height div 2) < abs(X - Button1.Width div 2) then
  if X - Button1.Width div 2 < 0 then Button1.Left := Button1.Left + X
  else Button1.Left := Button1.Left - (Button1.Width - X)
else
  if Y - Button1.Height div 2 < 0 then Button1.Top := Button1.Top + Y
  else Button1.Top := Button1.Top - (Button1.Height - Y)
end;
 

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

В данной подпрограмме очень эффективно применяется условные оператор if, о нем можно прочитать в словаре, к нему же относится else. Так же применяются свойства кнопок, а именно Button1.Width определение ширины кнопки1, и Button1.Height - определение ее высоты. Оператор div служит для деления. Координаты X и Y - это координаты мышки которые передаются в программу. abs - функция вычисляющая модуль

В циклах происходят не сложные математические вычисления, которые с первого взгляда выглядят очень страшновато. Но поняв что делает каждая функция можно без труда разобраться. В данном примере я специально применял чтение свойств кнопки (Button1.Top , Button1.Left , Button1.Height , Button1.Width) что бы сделать программу более универсальной. Можно было вместо них ввести и точные значения. Это выглядело бы очень хорошо вот сравните :

procedure TForm1.Button1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
if abs(Y - 12) < abs(X - 37) then
if X - 37 < 0 then Button1.Left := Button1.Left + X
else Button1.Left := Button1.Left - (75 - X)
else
if Y - 12 < 0 then Button1.Top := Button1.Top + Y
else Button1.Top := Button1.Top - (25 - Y)
end;
 

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

Ссылки

Исходный код проекта 5 кб
Готовый запускаемый модуль проекта 154 кб
Готовый запускаемый модуль проекта требующий Delphi библиотек 5 кб
Электронная почта автора  

 

. : навигация : .

главная
DirectX
уроки
словарь
гостевая книга
о проекте
 

статистика

RAMBLER'S TOP100

Если вы используете материалы с данного сайта, то сообщите владельцу по почте
и вставьте ссылку на этот сайт "seprize.narod.ru"
seprize@narod.ru

© Сайт открылся 04.09.2002     Дата последнего обновления 13.09.2002

Сайт управляется системой uCoz