Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабораторки 1-6 по Delphi.pdf
Скачиваний:
39
Добавлен:
08.04.2015
Размер:
1.09 Mб
Скачать

Языки программирования

ЛР5. Обработка клавиатурных событий и событий мышки

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

щелчки кнопками мыши по элементу управления;

перемещение указателя мыши над элементом управления;

вращение колесика мыши;

операция перетаскивания drag and drop.

Щелчки кнопками мыши

Самым востребованным событием в Delphi является щелчок левой кнопкой мыши над областью компонента.

property OnClick: TNotifyEvent;

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

type TNotifyEvent = procedure(Sender: TObject) of object;

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

Внимание!

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

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

Выберите кнопку Button1 и напишите всего одну строку кода в обработчике события (листинг 5.1).

Листинг 5.1. Получение имени компонента по параметру Sender

procedure TForm1.Button1Click(Sender: TObject); begin

Memo1.Lines.Add((Sender as TComponent).Name); end;

Щелчок по кнопке приводит к появлению в многострочном редакторе Memo1 строки с именем компонента, вызвавшего событие (в данном случае кнопки Button1).

Выберите на форме любой другой компонент. Перейдите на вкладку Events (События) в Инспекторе объектов, в перечне событий найдите событие OnClick и сопоставьте с ним событие Button1Click (рис. 5.1). Наши действия приведут к тому, что два компонента станут разделять между собой один общий обработчик события. Аналогичным образом подключите к событию все остальные компоненты (включая форму) и запустите проект на выполнение. Щелкните по любому из компонентов — его имя сразу появится в отдельной строке многострочного редактора Memo1.

48

СКФУ Кафедра компьютерной безопасности

Языки программирования

Рис. 5.1. Разделение одного обработчика события между несколькими компонентами

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

property OnDblClick: TNotifyEvent;

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

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

property OnMouseDown: TMouseEvent; //кнопка нажимается property OnMouseUp : TMouseEvent; //кнопка отпускается

где:

TMouseEvent = procedure (Sender: TObject;Button: TMouseButton;

Shift: TShiftState; X, Y: Integer) of object;

В табл. 5.1 представлен список параметров, позволяющих описывать реакцию элемента управления на событие.

 

 

Таблица 5.1. Описание параметров TMouseEvent

 

 

 

 

Параметр

Возможные значения

Описание

 

 

 

 

 

Sender

Ссылка на объект

Ссылка на источник сообщения

 

Button

mbLeft

Щелчок левой кнопкой мыши

 

 

mbRight

Щелчок правой кнопкой мыши

 

 

mbMiddle

Щелчок центральной кнопкой мыши

 

Shift

ssShift

Удерживается в нажатом состоянии клавиша <Shift>

 

 

ssAlt

Удерживается в нажатом состоянии клавиша <Alt>

 

 

ssCtrl

Удерживается в нажатом состоянии клавиша <Ctrl>

 

 

ssLeft

Нажимается/отпускается левая кнопка мыши

 

 

ssRight

Нажимается/отпускается правая кнопка мыши

 

 

ssMiddle

Нажимается/отпускается центральная кнопка мыши

 

 

ssDouble

Двойной щелчок любой кнопкой

 

 

 

49

СКФУ Кафедра компьютерной безопасности

Языки программирования

 

X, Y

Integer

Координаты указателя мыши

 

Простейший прием обработки события нажатия на кнопку мыши предложен в листинге 5.2.

Листинг 5.2. Обработка события нажатия кнопки мыши

procedure TForm1.FormMouseDown(Sender: TObject;

Button: TMouseButton; Shift: TShiftState; X, Y: Integer);

begin

if (ssAlt in Shift) //если удерживается клавиша <Alt>

and (Button=mbRight) //и пользователь нажимает правую кнопку мыши then

//реакция на нажатие кнопки end;

Перемещение указателя мыши

В момент попадания указателя мыши в клиентскую область элемента управления генерируется событие

property OnMouseEnter: TNotifyEvent;

Выход указателя за пределы области сопровождается событием property OnMouseLeave: TNotifyEvent;

При малейшем перемещении указателя мыши над поверхностью объекта у элемента управления генерируется событие:

property OnMouseMove: TMouseMoveEvent;

type TMouseMoveEvent = procedure(Sender: TObject; Shift: TShiftState; X, Y: Integer) of object;

Параметры события вам уже знакомы (см. табл. 5.1), аргумент Shift контролирует состояние служебных клавиш, координаты указателя в рамках клиентской области элемента управления доступны благодаря аргументам X и Y.

Вращение колесика мыши

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

property OnMouseWheel: TMouseWheelEvent;

type TMouseWheelEvent = procedure(Sender: TObject; Shift: TShiftState; WheelDelta: Integer; MousePos: TPoint;

var Handled: Boolean) of object;

Параметры события описаны в табл. 5.2.

 

 

Таблица 5.2. Описание параметров TMouseWheelEvent

Параметр

Возможные

Описание

 

значения

 

Sender

Ссылка

Ссылка на источник сообщения

Shift

ssShift

Удерживается в нажатом состоянии клавиша <Shift>

 

 

50

СКФУ Кафедра компьютерной безопасности

Языки программирования

 

 

ssAlt

Удерживается в нажатом состоянии клавиша <Alt>

 

 

 

ssCtrl

Удерживается в нажатом состоянии клавиша <Ctrl>

 

 

 

ssLeft

Нажата левая кнопка мыши

 

 

 

ssRight

Нажата правая кнопка мыши

 

 

 

ssDouble

Двойной щелчок любой кнопкой

 

 

WheelDelta

integer

Отрицательное значение — вращение вниз, положительное — вверх

 

 

MousePos

TPoint

Местоположение указателя мыши

 

 

Handled

Boolean

False — если обработкой события занимается родительский объект,

 

 

 

 

иначе True

 

Листинг 5.3 демонстрирует один из вариантов управления полосой прокрутки

ScrollBar1:TScrollBar1 при посредничестве события OnMouseWheel() формы.

Листинг 5.3. Управления полосой прокрутки с помощью колесика мыши

procedure TForm1.FormMouseWheel(Sender: TObject; Shift: TShiftState; WheelDelta: Integer; MousePos: TPoint;

var Handled: Boolean);

begin

if WheelDelta>0 then ScrollBar1.Position:=ScrollBar1.Position-1; else

if WheelDelta<0 then ScrollBar1.Position:=ScrollBar1.Position+1;

Handled:=true; end;

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

property OnMouseWheelUp: TMouseWheelUpDownEvent; //вращение вверх

property OnMouseWheelDown: TMouseWheelUpDownEvent; //вращение вниз type TMouseWheelUpDownEvent = procedure(Sender: TObject;

Shift: TShiftState; MousePos: TPoint; var Handled: Boolean) of object;

Параметры событий аналогичны представленным в табл. 5.2.

Операция перетаскивания drag and drop

Класс TControl обеспечивает поддержку очень популярного действия drag and drop (перетащить и опустить). Эта операция позволяет реализовать операцию перетаскивания в пределах приложения, а при использовании разделяемой памяти — и между разными приложениями Delphi. Обычно перемещение происходит между двумя элементами управления, называемыми источником и приемником. Источник инициирует перетаскивание и содержит сам перетаскиваемый объект (клиент). Приемник принимает перетаскиваемый объект. Классическим примером реализации операции drag and drop служит Проводник Windows, предоставляющий услуги переноса файлов и папок при помощи операций перетаскивания.

Первым шагом на пути создания интерфейса перетаскивания должна стать настройка свойства property DragKind: TDragKind;

51

СКФУ Кафедра компьютерной безопасности

Языки программирования

type TDragKind = (dkDrag, dkDock);

В случае, если свойство находится в состоянии dkDrag — при перетаскивании реализуется технология drag and drop, в противном случае — drag and dock (операция буксировки элементов управления).

Способ работы с технологией перетаскивания:

property DragMode: TDragMode;

type TDragMode = (dmManual, dmAutomatic);

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

procedure BeginDrag(Immediate: Boolean; Threshold: Integer = -1);

Метод рассчитан на то, что пользователь утопит кнопку мыши над объектом-клиентом и, удерживая эту кнопку в нажатом состоянии, "потащит" объект. Если параметр Immediate установлен в true, то операция перетаскивания начинается немедленно, в противном случае — после перемещения мыши на небольшое расстояние (количество пикселов указывается в

Threshold).

При необходимости прервать процесс перетаскивания вызывается метод procedure EndDrag(Drop: Boolean);

В случае если параметру Drop передано значение true, то результаты перетаскивания будут приняты. В противном случае произойдет отмена.

За внешний вид курсора при операции перетаскивания отвечает свойство: property DragCursor: TCursor;

Если элемент-приемник по каким-то причинам отказывается получать данные от источника, то внешний вид курсора над ним будет соответствовать значению crNoDrop (перечеркнутый круг). Если все в порядке, то сигналом готовности станет курсор crDrag.

Процесс перетаскивания последовательно сопровождается четырьмя событиями (табл. 5.3).

Таблица 5.3. Последовательность событий в операции drag and drop

События

Инициатор

Описание

 

 

 

OnStartDrag()

Элемент-

Над элементом-источником нажата кнопка мыши и начато

 

источник

движение с удержанием кнопки в нажатом состоянии

OnDragOver()

Элемент-

Перетаскиваемый элемент находится над приемником

 

приемник

 

OnDragDroup()

Элемент-

Над элементом-приемником отпущена кнопка мыши

 

приемник

 

OnEndDrag()

Элемент-

Сигнализирует о завершении перетаскивания, используется

 

источник

для освобождения используемых ресурсов, отмены операции

 

 

и т. п.

 

 

 

В момент начала перетягивания генерируется событие

property OnStartDrag: TStartDragEvent;

type TStartDragEvent = procedure(Sender: TObject;

var DragObject: TDragObject) of object;

В программах Delphi обработчик события OnStartDrag() задействуется только при необходимости, например для инициализации переменных, вызова дополнительных процедур и

52

СКФУ Кафедра компьютерной безопасности