Вход


Главная страница >> Учебный процесс >> Конспекты >> Delphi. Библиотека визуальных компонентов VCL >> Общие принципы устройства и работы компонентов >> Реакция на события от мыши клавиатуры
Переход на главную страницу

Сервер поддерживается
кафедрой информатики и вычислительной техники ГрГУ
тел. +375-(0)152-445-101
E-mail :
kadan@grsu.grodno.by


[Назад]    [Содержание ]    [Вперед]

  


Реакция на события от мыши клавиатуры


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

(Pb) property OnMouseDown: TMouseEvent;

(Pb) property OnMouseUp: TMouseEvent;

TMouseEvent = procedure(Sender: TObject; Button: TMouseButton; ═════Shift: TShiftState; X, Y: Integer) of object;

Параметры:

Sender ? элемент-источник сообщения (обычно равен Self);

Button ? идентификатор одной из кнопок;

TMouseButton = (mbLeft, mbRight, mbMiddle);

Shift ? множество, которое может содержать элементы:

ssAlt, ssCtrl, ssShift ? в зависимости от состояния этих клавиш;

ssLeft, ssRight, ssMiddle, ssDouble ? в зависимости от нажатия кнопок мыши (ssDouble ? нажаты и правая, и левая кнопки);

X, Y ? координаты нажатия (в системе координат клиентской области получателя).

При перемещении мыши возникает событие:

(Pb) property OnMouseMove: TMouseMoveEvent;

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

Использование сообщений от мыши уже встречалось в примерах, приведенных выше (например, см. разд. "Положение, размеры и выравнивание элементов управления").

Два события извещают о щелчке и двойном щелчке левой кнопкой мыши над компонентом:

(Pb) property OnClick: TNotifyEvent;

(Pb) property OnDblClick: TNotifyEvent;

Отменить генерацию этих событий можно, удалив флаг csClickEvents из слова состояния элемента (ControlStyle). Для некоторых компонентов (например, кнопок) OnClick возникает еще и при нажатии определенных клавиш на клавиатуре, а также вследствие вызова метода Click.

События, связанные с мышью, могут быть получены потомками TControl. В отличие от них, реакцию на события от клавиатуры могут иметь только оконные элементы управления ("могут", т. к. на уровне TControl и TWinControl эти события только описаны, но не опубликованы). Таким образом, есть компоненты (в том числе в Палитре компонентов), не имеющие связи с этими событиями из-за ее ненадобности. Впрочем, их меньшинство, и материал в этом разделе обобщен вполне обоснованно.

Нажатие и отпускание клавиш клавиатуры могут инициировать следующие события:

(Pb) property OnKeyDown: TKeyEvent;

(Pb) property OnKeyUp: TKeyEvent;

TKeyEvent = procedure(Sender: TObject; var Key: Word; Shift: TShiftState) of object;

Генерация этих событий встроена в обработчики сообщений Windows WMJCEYDOWN, WM.SYSKEYDOWN и WMJCEYUP, WM_SYSKEYUP соответственно. Обработчику передаются:

Sender ? источник сообщения;

Shift ? состояние специальных клавиш и кнопок мыши во время нажатия (отпускания);

Key ? код нажатой клавиши, представляющий собой виртуальный код клавиши Windows (константы вида VK_XX, например, VK_F1, VK_ESCAPE и т. п.). Обратите внимание, что Key является var-параметром; т. е. его значение может быть изменено программистом.

Другое событие, возникающее вследствие нажатия клавиши:

property OnKeyPress: ТКеуPress Event;

TKeyPressEvent = procedure(Sender: TObject; var Key: Char) of object;

Это событие возникает при вводе с клавиатуры символа ASCII, т. е. оно не генерируется, например, при нажатии функциональных клавиш или <CapsLock>. Обработчик события вызывается при нажатии буквенных (в т. ч. вместе с <Shift>), цифровых клавиш, комбинаций <Ctrl>+<A> .. <Ctrl>+<Z> (коды ASCII #1..#26), <Enter>, <Esc>, <Backspace>, <Ctrl>+<Break> (код #3) и некоторых других. Также код ASCII можно сгенерировать, нажав <А1t>+<десятичный код символа> на числовой клавиатуре (Numeric Pad).

Событие OnKeyPress соответствует сообщению Windows WM_CHAR.

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

(Pb) property KeyPreview: boolean;

установлено в True, то сначала все три вида сообщений поступают к ее обработчикам, и только потом ? к элементу управления. Если при этом в них обнулить параметр Key, то в элемент сообщение не поступит вообще. В приведенном ниже примере клавиша <F5> резервируется для изменения состояния формы:

procedure TForm1.FormCreate(Sender: TObject);
begin
═════KeyPreview := True
end;

procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
if Key = VK_F5 then
═════begin
══════════if ssCtrl in Shift
══════════════then WindowState := wsNormal
══════════════else if Shift = []
════════════════════════then WindowState := wsMaximized;
══════════Key := 0;
═════end;
end;



[Назад]    [Содержание ]    [Вперед]

  


Для комментария : kadan@grsu.grodno.by

  
За содержание страницы отвечает Гончарова М.Н.
©
Кафедра СПиКБ, 2002-2017