События в Delphi. События Delphi

07.08.2019

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

Цель работы: научиться программировать различные обработчики событий

Управление программой в Windows основано на обработке сообщений о событиях,

которые происходят в этой многозадачной системе.

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

События можно разделить на следующие типы:

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

События щелчка мыши;

События типа Drag&Drop, что означает "Перетащить и бросить" объект мышью;

События клавиатуры (возникающие при нажатии клавиш);

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

3. События, обусловленные исключительными ситуациями ,которые могут возникать

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

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

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

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



Для того чтобы создать в Delphi нужный обработчик событий, следует выбрать интересующий Вас компонент, щелкнув по нему мышкой, перейти на закладку Events (События) Инспектора Объектов и, выбрав необходимое событие, дважды щелкнуть по его полю ввода. Раскроется Редактор Кода программы, куда Delphi автоматически поместит заготовку процедуры обработчика. Вам остается только вставить между служебными словами begin и end операторы программного кода, реализующие какую либо реакцию Вашей программы на данное событие. Для каждого компонента, в том числе и для формы, можно создать свои собственные обработчики событий

Списки событий, относящихся к конкретному компоненту, в том числе и к форме, заданы на странице Events (События) Инспектора Объектов.


Наиболее часто встречающиеся события для компонентов:

Название Событие
OnCreate При создании объекта (формы, элемента управления).
OnClick Одинарный щелчок левой клавиши мыши на объекте
OnDblClick Двойной щелчок левой клавиши мыши на объекте
OnMouseDown При нажатии кнопки мыши
OnMouseUp При отпускании кнопки мыши
OnMouseMove При перемещении мыши над заданным компонентом
OnKeyDown Нажатие клавиши возвращает значение
Key(тип: Word)-код нажатой клавиши
Shift(Тип: TShiftState)–состояние клавиши
OnKeyPress Нажатая символьная клавиша возвращает значение
Key(тип: Char)-код нажатой клавиши
ОпКеyUр При отпускание клавиши клавиатуры
OnEnter При получении элементом управления фокуса
OnExit При потере элементом управления фокуса

Для каждого события Delphi автоматически определяет имя обработчика в соответствии с именем компонента, для которого эта процедура предназначена. Например, заголовок процедуры обработчика события щелчка левой клавиши мыши (Click) для компонента кнопка (Buttonl), размещенного в окне стартовой формы (Forml) будет выглядеть следующим образом:

Procedure TForm1.Button1Click(Sender:TObject);

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

Задание 1. Создание обработчика событий для формы"Одинарный щелчок мышью ".

Поместите на форму компонент Label (Метка). Цвет метки, тип и размер шрифта на ней задайте по желанию.

Активизируйте форму, щелкнув по ней левой клавишей мыши. Заголовку формы дайте название "Обработка событий".

Перейдите на страницу Events (События) Инспектора Объектов и внимательно рассмотрите, какие события для формы там присутствуют.

Выберете событие OnClick (Одинарный щелчок левой клавишей мыши) и в пустом поле справа от него выполните мышью двойной щелчок. В раскрывшемся окне Редактора Кода будет создана заготовка процедуры обработчика этого события для формы.

Обратите внимание на заголовок обработчика! Между ключевыми словами begin и end

вставьте подчеркнутый текст, приведенный ниже: procedure TForm1.FormСliсk(Sеndеr: TObject);

Label1.Caption: = "ПРИВЕТ! ЭТО ОДИНАРНЫЙ ШЕЛЧОК!"; end;

Запустите приложение и проверьте выполнение одинарного щелчка мышью на форме.

Задание 2. Создание обработчика событий для формы“Двойной щелчок мышью”.

Активизируйте форму, и на странице Events (События) Инспектора Объектов выберете событие OnDblClick (Двойной щелчок левой клавишей мыши).

Раскройте Редактор Кода и вставьте в заготовку обработчика события подчеркнутый текст, приведенный ниже.

Что такое событие на языке Delphi и что из себя представляют процедуры обработки событий на языке Delphi.

В качестве примера описания события на языке Delphi возмём пример, описанный в предыдущих статьях. Вид созданной формы подсказывает, как работает приложение. Очевидно, что пользователь должен ввести в поля редактирования исходные данные и щелкнуть мышью на кнопке Вычислить . Щелчок на изображении командной кнопки - это пример того, что в Windows называется событием.

Событие (Event ) на Delphi - это то, что происходит во время работы программы. В Delphi каждому событию присвоено имя. Например, щелчок кнопкой мыши - это событие OnClick , двойной щелчок мышью - событие onDblClick .

В таблице 9 приведены некоторые события Windows.

Таблица 9. Некоторые события Windows.

Событие Происходит
OnСlick При щелчке кнопкой мыши
OnDblClick При двойном щелчке кнопкой мыши
OnMouseDown При нажатии кнопки мыши
OnMouseUp При отпускании кнопки мыши
OnMouseMove При перемещении мыши
OnKeyPress При нажатии клавиши клавиатуры
OnKeyDown При нажатии клавиши клавиатуры. События OnKeyDown и OnKeyPress - это чередующиеся, повторяющиеся события, которые происходят до тех пор, пока не будет отпущена удерживаемая клавиша (в этот момент происходит событие OnKeyUp)
OnKeyUp При отпускании нажатой клавиши клавиатуры
OnCreate При создании объекта (формы, элемента управления). Процедура обработки этого события обычно используется для инициализации переменных, выполнения подготовительных действий
OnPaint При появлении окна на экране в начале работы программы, после появления части окна, которая, например, была закрыта другим окном и в других случаях
OnEnter При получении элементом управления фокуса
OnExit При потере элементом управления фокуса

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

Методику создания процедур обработки событий на Delphi рассмотрим на примере процедуры обработки события onclick для командной кнопки Вычислить .

Чтобы приступить к созданию процедуры обработки события, надо сначала в окне Object Inspector выбрать компонент, для которого создается процедура обработки события. Затем, в этом же окне нужно выбрать вкладку Events (События).

Рисунок 21. На вкладке Event (Delphi) перечислены события, которые может воспринимать компонент на Delphi

В левой колонке вкладки Events (рисунок 21) перечислены имена событий на языке программирования Delphi, которые может воспринимать выбранный компонент (объект). Если для события определена (написана) процедура обработки события, то в правой колонке, рядом с именем события, выводится имя этой процедуры.

Для того чтобы создать функцию обработки события на языке программирования Delphi, нужно сделать двойной щелчок мышью в поле имени процедуры обработки соответствующего события. В результате этого откроется окно редактора кода, в которое будет добавлен шаблон функции обработки события, а в окне Object Inspector , рядом с именем события, появится имя функции его обработки (рисунок 22).

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

Рисунок 22. Примеры процедуры обработки событий сгенерированной Delphi

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

В Листинге 1 приведен текст функции обработки события onclick для командной кнопки Вычислить . Обратите внимание на то, как представлена программа. Ее общий вид соответствует тому, как она выглядит в окне редактора кода: ключевые слова выделены полужирным, комментарии - курсивом (выделение выполняет редактор кода). Кроме того, инструкции программы набраны с отступами, в соответствии с принятыми в среде программистов правилами хорошего стиля.

Функция Button1Click выполняет расчет скорости и выводит результат расчета в поле Label4. Исходные данные вводятся из полей редактирования Edit1 и Edit2 путем обращения к свойству Text . Свойство Text содержит строку символов, которую во время работы программы введет пользователь. Для правильной работы программы строка должна содержать только цифры. Для преобразования строки в числа в программе используются функции StrToInt и StrToFloat . Функция StrToInt проверяет символы строки, переданной ей в качестве параметра (Edit1.Text - это содержимое поля Edit1 ), на допустимость, и, если все символы верные, возвращает соответствующее число. Это число записывается в переменную dist . Аналогичным образом работает функция StrToFloat , которая возвращает дробное число, соответствующее содержимому поля Edit2 . Это число записывается в переменную t .

После того как исходные данные будут помещены в переменные dist и t , выполняются подготовительные действия и расчет. Первоначально с использованием функции Trunc , которая "отбрасывает" дробную часть числа, выделяется целая часть переменной t - это количество минут. Значением выражения Trunc(t*l00) mod 100 является количество секунд. Вычисляется это выражение так. Сначала число t умножается на 100 . Полученное значение передается функции Trunc , которая возвращает целую часть результата умножения t на 100 . Полученное таким образом число делится по модулю на 100 . Результат деления по модулю - это остаток от деления.

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

Вычисленное значение скорости выводится в поле Label4 путем присваивания значения свойству Caption . Для преобразования чисел в строки используются функции IntToStr и FloatToStr .

В результате нажатия кнопки Завершить программа должна завершить работу. Чтобы это произошло, надо закрыть, убрать с экрана, главное окно программы. Делается это при помощи метода Сlose . Процедура обработки события OnClick для кнопки Завершить приведена в листинге 2.

Цели:

  • Обучающая: дать понятие события в ОС Windows и обработчика события в среде Delphi. Изучить основные события и возможности компонентов: Edit, Button, Label.

Оборудование:

  • персональные компьютеры с приложением Boland Delphi for Microsoft Windows;
  • компьютер учителя;
  • мультимедийный проектор;

Учебный и раздаточный материал:

  • учебное пособие;
  • электронный практикум;
  • карточки с заданиями для самостоятельной работы;

План урока:

  1. Повторение темы предыдущего урока в форме опроса.
  2. Изучение нового материала.
  3. Самостоятельная работа.
  4. Итог урока.
  5. Домашнее задание.

Ход урока

1. Повторение темы предыдущего урока в форме опроса. Тема предыдущего занятия: "Компонент. Свойства компонента".

  • что такое компонент?
  • как выбрать и разместить компоненты на форме?
  • какие общие свойства компонентов вы знаете?
  • как можно поменять свойства компонента (например, поменять размер или цвет компонента)?

2. Изучение нового материала.

Сопровождается показом презентации (Приложение1).

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

Обработчик событий

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

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

Событие - это реакция компонента на определённое воздействие.

Windows первой узнает о любом событии, и если связь с обработчиком такого события установлена, передаёт ему управление.

В общем случае это выглядит следующим образом:

На генерацию события программист обычными средствами повлиять не может. В его компетенции только обработать событие, то есть написать процедуру, которая будет выполняться при его возникновении.

Среда Delphi хранит для каждого компонента имена всех его обработчиков событий и выводит их на экран в окне "Инспектор объектов" (Object Inspector) во вкладке "События" (Events).

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

  • выберите компонент, для которого необходимо обработать событие.
  • откройте вкладку "События" (Events) и два раза щелкните по правому столбцу выбранного события.

В результате этих действий Delphi автоматически сгенерирует процедуру

обработки события. Имя этой процедуры состоит из имени компонента и названия события. Оно может быть изменено пользователем непосредственно в окне "Инспектор объектов".

Для удаления события нужно только очистить содержимое процедуры (код между словами Begin и End), а при следующей компиляции, Delphi сам удалит ненужный код процедуры.

Событие OnClick

Самый простой способ сообщить приложению о событии - это щёлкнуть мышью на каком-либо компоненте. При щелчке по кнопке мышью в работающей программе возникает событие OnClick (по щелчку). Пока это событие не обрабатывается программой, поэтому нажатие кнопки не приведёт ни к каким последствиям. Чтобы заставить программу реагировать на нажатие кнопки, необходимо написать на языке Object Pascal фрагмент программы, который называется обработчиком события.

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

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

Слово procedure извещает компилятор о начале процедуры. За ним следует имя метода TForm1.Button1Click. Это имя составное: оно состоит из имени класса TForm1 и собственно имени метода Button1Click.

Пока имеется только заготовка обработчика - тело метода пусто. Команды, которые будут написаны внутри обработчика, выполнятся при щелчке по компоненту.

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

Будет вызван метод Close (закрыть) для объекта Form1 (окно программы).

Примеры программ с обработчиком события OnClick можно посмотреть в:

procedure TForm1.Button1Click(Sender: TObject);

Label1.Caption:="ул. Базарова, дом 35, кв 35";

Label2.Caption:="Проспект Программистов, корпус 3/1, кв. 275";

procedure TForm1.Button3Click(Sender: TObject);

Label3.Caption:="переулок Ковалевской, дом 27, кв 181";

procedure TForm1.Button4Click(Sender: TObject);

Label4.Caption:="ул. Беринга, дом 22, кв 209";

Фрагменты кода на языке Object Pascal приложения "Прыгающая кнопка" (Приложении 6):

procedure TForm1.Button1Click(Sender: TObject);

Button1.Visible:=False;

Button2.Visible:=True;

procedure TForm1.Button2Click(Sender: TObject);

Button2.Visible:=False;

Button3.Visible:=True;

procedure TForm1.Button7Click(Sender: TObject);

Button7.Visible:=False;

Button8.Visible:=True;

procedure TForm1.Button8Click(Sender: TObject);

Button8.Visible:=False;

Button1.Visible:=True;

Другие события

Название события Когда возникает
OnKeyPress Наступает, когда пользователь нажимает какую-либо клавишу.
OnDBClick Возникает при двойном щелчке на компоненте
OnMouseMove Возникает при перемещении курсора мыши над компонентом
OnMouseDown Возникает при нажатии на кнопку мыши
OnMouseUp Возникает при отпускании кнопки мыши
OnEnter Возникает при получении компонентом фокуса ввода
OnExit Возникает при потере компонентом фокуса ввода
OnCreate Возникает в момент создания формы. Существует только у формы

3. Самостоятельная работа.

Учащимся предлагается создать приложение с обработчиком события OnClick компонента Button.

4. Итог урока.

Теперь подведем итоги нашего урока, сегодня мы узнали о том, что:

  • обработчик события - это процедура, которая выполняется при возникновении заданного события;
  • для выбора события служит вкладка "События" (Events) "Инспектора объектов" (Object Inspector);
  • научились создавать обработчик для самого популярного события OnClick.

Результаты самостоятельной работы учеников можно посмотреть:

5. Домашнее задание.

Выполнить задания из "Электронного практикума"

Список литературы.

  1. В. В. Кузнецов, И.В. Абдрашитова "Основы объектно-ориентированного программирования в DELPHI", "Школьный Университет, Томск, 2008.
  2. "Delphi для учителя в примерах и задачах" часть I, "Образование и Информатика", Москва, 2006.
  3. Г.В. Галисеев "Программирование в среде Delphi 7", "Диалектика", Москва · Санкт-Петербург · Киев, 2003.
  4. http: //umnic.rikt.ru/everest/distant.

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

Если разработчик реализовал код обработчика события, то он выполняется, когда это событие происходит. В противном случае обычно ничего не происходит.

Имеется два вида событий: взаимодействие пользователя и изменение состояния. События взаимодействия пользователя почти всегда вызываются в соответствии с сообщениями Windows, указывая, что пользователь делал кое-что, поэтому компонент может ответить. События изменения состояния также могут быть сведены к сообщениям Windows.

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

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

Объявление событий

Синтаксически события объявляются почти полностью аналогично свойствам:

Property :
[Index Read ]
[Write }
[Stored Логическое выражение>} [Default Nil|NoDefault ];

Примечания:
Хотя в командах чтения и записи могут использоваться методы, на практике они не используются. Обычно используется прямой доступ к полю.
Команда Index используется вместе с методами записи или чтения. Поскольку методы практически не используются, то и команда Index также.
Команда Default фактически допускает только одно значение по умолчанию — Nil, которое и так устанавливается компилятором. Поэтому использование команды Default и, соответственно, NoDefault нецелесообразно.
Все события в Delphi принято именовать с «On «: OnCreate, OnClick и т.д.
В данном случае событие и соответствующее поле имеют тип TNotifyEvent.

Таким образом, в общем случае для объявления события необходимо сделать следующее:
определить или выбрать тип данных события (тип указателя на метод)(процедурный тип);
объявить поле соответствующего типа для хранения значения события;
объявить (корреспондирующий — event-dispatching method) метод, который будет вызывать обработчик события, когда оно произойдет. Представить реализацию этого метода и определить механизм его вызова;
объявить собственно событие.

а) Объявление типа события
Событие — это механизм, с помощью которого связывается некоторое происшествие с некоторым кодом. Код оформляется в виде метода, тип которого объявляется до объявления класса, включающего объявление события. Этот метод должен принадлежать не классу, а экземпляру класса, поскольку даже для объектов одного класса исполняемый код обычно бывает различным. Создание кода метода, реагирующего на событие — это привилегия программиста, Delphi же обеспечивает связь этого метода с событием для вызова этого метода.

Связь события и метода, выполняющего в ответ на это событие, осуществляется в Delphi с помощью указателя на метод. Точнее — это указатель на метод в экземпляре класса. Указатели на метод работают точно также как любой другой процедурный тип, но еще они поддерживают скрытый указатель на объект. Как и всякий указатель, это фактически адрес, в данном случае, адрес метода, и он требует четыре байта для размещения в памяти. Поскольку эти методы предназначены для обработки событий, их называют обработчиками событий (event handler), а управление объектами — управлением по событиям (event driven).

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

Type =Procedure (Sender : TObject [; }) Of Object ;

Дополнительные ключевые слова Of Object указывают компилятору о том, что это указатель на метод объекта, а не самостоятельная процедура. Таким образом, для обработки событий в Delphi предусмотрено объявление указателей на метод, обеспечивающих неявную передачу указателя на экземпляр (переменная Self), вызвавший то или иное событие.

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

Можно использовать Var параметры и для того, чтобы отменять заданную по умолчанию обработку.

Примеры типовых указателей на методы.
Список событий в Delphi:

TNotyfyEvent=Procedure(Sender: TObject) Of Object;
OnClick; OnDblClick; OnCreate; OnDestroy;
TMouseMoveEvent=Procedure(Sender: TObject; Shift: TShiftState; X,Y: Integer) Of Object; =>OnMouseMove

Б) Определение механизма возбуждения события
Этот механизм должен фактически реагировать на какие-то ситуации, происшествия, в ответ на возникновение которых и должно возбуждаться события.

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

в) Объявление и реализация метода, вызывающего обработчик события После определения механизма возбуждения пользовательского события, следует решить, какие реакции (видимые и невидимые) должны быть у объекта, и как будет вызываться обработчик события.

Обычно для реализации кода реакции объекта на событие и вызова обработчика события объявляется и создается реализация соответствующего (корреспондирующего) виртуального защищенного метода.

Так, в задачу динамического метода Click, помимо изменения внешнего представления кнопки (кнопка «утопает»), входит проверка наличия обработчика события, и если он есть, передача управления ему.

Синтаксис объявления такого метода следующий:

Procedure [()]; Dynamic ;

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

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

Procedure .[()];
Begin
If Assigned ()
Then (Self [,]);
End ;

Вычислить. событием.

Таблица В9. События

Событие

Происходит

При щелчке кнопкой мыши

При нажатии кнопки мыши

При отпускании кнопки мыши

При перемещении мыши


Вычислить.

Object Inspector Events (События).

Рис. В26. На вкладке Events

В левой колонке вкладки Events

Object Inspector

Рис. В27.

Вычислить.

Листинг В1.

// нажатие кнопки Вычислить

procedure

dist: integer; // дистанция, метров

t: real; // время как дробное число

min: integer; // время, минуты

sek: integer; // время, секунды

v: real; // скорость

begin

//

//

min:= Trunc(t); //

sek:= Trunc(t*100) mod 100;

//

// числа t

// вычисление

// вывод результата

end;

по модулю

В результате нажатия кнопки Завершить Завершить приведена в листинге В2.

Листинг В2.

// нажатие кнопки Завершить

procedure

begin

Form1.Close; //

Событие и процедура обработки события

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

Событие (Event) - это то, что происходит во время работы программы. В Delphi каждому событию присвоено имя. Например, щелчок кнопкой мыши - это событие OnClick, двойной щелчок мышью событие OnDblClick.

В табл. В9 приведены некоторые события Windows.

Таблица В9. События

Событие

Происходит

При щелчке кнопкой мыши

При двойном щелчке кнопкой мыши

При нажатии кнопки мыши

При отпускании кнопки мыши

При перемещении мыши

При нажатии клавиши клавиатуры

При нажатии клавиши клавиатуры. События OnKeyDown и OnKeyPress - это чередующиеся, повторяющиеся события, которые происходят до тех пор, пока не будет отпущена удерживаемая клавиша (в этот момент происходит событие OnKeyUp)

При отпускании нажатой клавиши клавиатуры

При создании объекта (формы, элемента управления). Процедура обработки этого события обычно используется для инициализации переменных, выполнения подготовительных действий

При появлении окна на экране в начале работы программы, после появления части окна, которая, например, была закрыта другим окном, и в других случаях

При получении элементом управления фокуса

При потере элементом управления фокуса

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

Методику создания процедур обработки событий рассмотрим на примере процедуры обработки события OnClick для командной кнопки Вычислить.

Чтобы приступить к созданию процедуры обработки события, надо сначала в окне Object Inspector выбрать компонент, для которого создается процедура обработки события. Затем в этом же окне нужно выбрать вкладку Events (События).

Рис. В26. На вкладке Events перечислены события, которые может воспринимать компонент (в данном случае - командная кнопка)

В левой колонке вкладки Events (рис. В26) перечислены имена событий, которые может воспринимать выбранный компонент (объект). Если для события определена (написана) процедура обработки события, то в правой колонке рядом с именем события выводится имя этой процедуры.

Для того чтобы создать функцию обработки события, нужно сделать двойной щелчок мышью в поле имени процедуры обработки соответствующего события. В результате этого откроется окно редактора кода, в которое будет добавлен шаблон процедуры обработки события, а в окне Object Inspector рядом с именем события появится имя функции его обработки (рис. В27).

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

Рис. В27. Шаблон процедуры обработки события, сгенерированный Delphi

В окне редактора кода между словами begin и end можно печатать инструкции, реализующие функцию обработки события.

В листинге В1 приведен текст функции обработки события onclick для командной кнопки Вычислить. Обратите внимание на то, как представлена программа. Ее общий вид соответствует тому, как она выглядит в окне редактора кода: ключевые слова выделены полужирным, комментарии - курсивом (выделение выполняет редактор кода). Кроме того, инструкции программы набраны с отступами в соответствии с принятыми в среде программистов правилами хорошего стиля.

Листинг В1. Процедура обработки события OnClick на кнопке Button1 (Вычислить)

// нажатие кнопки Вычислить

procedure TForm1.ButtonlClick(Sender: TObject);

dist: integer; // дистанция, метров

t: real; // время как дробное число

min: integer; // время, минуты

sek: integer; // время, секунды

v: real; // скорость

begin

// получить исходные данные из полей ввода

dist:= StrToint(Edit1.Text); t:= StrToFloat(Edit2.Text);

// предварительные преобразования

min:= Trunc(t); // кол-во минут - это целая часть числа t

sek:= Trunc(t*100) mod 100;

// кол-во секунд - это дробная часть

// числа t

// вычисление

v:= (dist/1000) / ((min*60 + sek)/3600);

// вывод результата

label4.Caption:= "Дистанция: "+ Edit1.Text

+ " м" + #13 + "Время: " + IntToStr(min)

+ " мин " + IntToStr(sek) + " сек " + #13 +

"Скорость: " + FloatToStrF(v,ffFixed,4,2) + " км/час";

end;

Функция Button1click выполняет расчет скорости и выводит результат расчета в поле Label4. Исходные данные вводятся из полей редактирования Editl и Edit2 путем обращения к свойству Text. Свойство Text содержит строку символов, которую во время работы программы введет пользователь. Для правильной работы программы строка должна содержать только цифры. Для преобразования строки в числа в программе используются функции StrToInt и strToFloat. Функция strToInt проверяет символы строки, переданной ей в качестве параметра (Edit1.Text - это содержимое поля Editl), на допустимость и, если все символы верные, возвращает соответствующее число. Это число записывается в переменную dist. Аналогичным образом работает функция strToFioat, которая возвращает дробное число, соответствующее содержимому поля Edit2. Это число записывается в переменную t.

После того как исходные данные будут помещены в переменные dist и t, выполняются подготовительные действия и расчет. Первоначально с использованием функции Trunc, которая "отбрасывает" дробную часть числа, выделяется целая часть переменной t - это количество минут. Значением выражения Trunc(t*100) mod 100 является количество секунд. Вычисляется это выражение так. Сначала число t умножается на 100. Полученное значение передается функции Trunc, которая возвращает целую часть результата умножения t на 100. Полученное таким образом число делится по модулю на 100. Результат деления по модулю - это остаток от деления.

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

Вычисленное значение скорости выводится в поле Label4 путем присваивания значения свойству Caption. Для преобразования чисел в строки используются функции IntToStr И FloatToStr.

В результате нажатия кнопки Завершить программа должна завершить работу. Чтобы это произошло, надо закрыть, убрать с экрана, главное окно программы. Делается это при помощи метода close. Процедура обработки события Onclick для кнопки Завершить приведена в листинге В2.

Листинг В2. Процедура обработки события Onclick на кнопке Button2 (Завершить)

// нажатие кнопки Завершить

procedure TForm1.Button2Click(Sender: TObject);

begin

Form1.Close; // закрыть главное окно программы