События щелчка мышью на форме в Delphi и C++Builder
Здесь будут исследованы события
формы, появляющиеся при щелчках пользователя кнопками мыши на форме:
·
OnClick. Возникает, когда пользователь
щелкает левой кнопкой мыши по форме.
·
OnDblClick. Возникает, когда
пользователь дважды щелкает левой кнопкой мыши по форме.
·
OnMouseDown. Возникает, когда
пользователь нажимает на форме любую кнопку мыши.
·
OnMouseUp. Возникает, когда
пользователь после нажатия любой кнопки мыши ее отпускает.
Запустите на выполнение Delphi или C++Builder. Создайте новый проект, выбрав в меню File | New | VCL
Forms Application - Delphi (File | New | VCL Forms Application – C++Builder).
Положите на форму компонент ListBox. Сюда будут помещаться сообщения программы. Установите
в значение True все подсвойства свойства Anchors: akLeft, akTop, akRight
и akBottom. Компонент будет привязан ко всем
сторонам формы.

Рис.
1. Созданная форма
События щелчка мышью
Напишите следующий обработчик
события, щелчка мышью по форме OnClick:
Delphi
procedure
begin
end;
TForm1.FormClick(Sender: TObject);
begin
ListBox1.Items.Add('OnClick');
end;
C++Builder
void __fastcall
TForm1::FormClick(TObject *Sender)
{
ListBox1->Items->Add("OnClick");
}
Это событие позволяет зафиксировать
сам факт щелчка левой кнопкой мыши по форме.
Аналогичным образом событие OnDblClick
позволяет получить информацию о факте двойного щелчка левой кнопкой мыши по
форме, не уточняя деталей. Напишите следующий обработчик этого события:
Delphi
procedure
begin
end;
TForm
1.
FormDblClick
(
Sender
:
TObject
);
begin
ListBox
1.
Items
.
Add
('
OnDblClick
'
);
end;
C++Builder
void __fastcall
TForm1::FormDblClick(TObject *Sender)
{
ListBox1->Items->Add("OnDblClick");
}
Запустите программу на
выполнение. При двойном щелчке левой кнопкой мыши по форме сначала возникает
событие OnClick, а затем OnDblClick.
Событие OnMouseDown
возникает при нажатии любой кнопки мыши. Напишите следующий обработчик этого
события:
Delphi
procedure
begin
end;
TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
ListBox1.Items.Add('OnMouseDown');
end;
C++Builder
void __fastcall
TForm1::FormMouseDown(TObject *Sender, TMouseButton Button,
TShiftState Shift,
int X,
int Y)
{
ListBox1->Items->Add("OnMouseDown");
}
Запустите программу на
выполнение. Проверьте реакцию на щелчки различными кнопками мыши по форме.
Событию OnMouseDown
передается параметр Button
типа TMouseButton,
позволяющий определить, какая кнопка мыши была нажата. Этот тип является
перечислимым типом:
Delphi
TMouseButton
= (
mbLeft
,
mbRight
,
mbMiddle
);
C++Builder
enum
TMouseButton = {
mbLeft,
mbRight,
mbMiddle
};
Внесите следующие изменения в
обработчик события OnMouseDown:
Delphi
procedure
var
begin
end;
TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
var
S:
String;
begin
if (Button = mbLeft)
then
S := 'Left';
if (Button = mbRight)
then
S :=
'Right'
;
if (Button =
mbMiddle)
then
S :=
'Middle'
;
ListBox1.Items.Add(
'OnMouseDown '
+ S);
end;
C++Builder
void __fastcall
TForm1::FormMouseDown(TObject *Sender, TMouseButton Button,
TShiftState Shift,
int X,
int Y)
{
AnsiString S;
if (Button == mbLeft)
S = "Left";
if (Button ==
mbRight)
S =
"Right"
;
if (Button ==
mbMiddle)
S =
"Middle"
;
ListBox1->Items->Add(
"OnMouseDown "
+ S);
}
Здесь описывается локальная
переменная S строкового типа. При обработке события
проверяется, какая была нажата кнопка мыши, и переменной присваивается
соответствующее значение.
Запустите программу на
выполнение. Проверьте реакцию на щелчки различными кнопками мыши по форме.
Событию OnMouseDown
также передается два целочисленных параметра X и Y,
которые содержат координаты курсора мыши в пикселах относительно клиентской области
окна. Внесите следующее изменение в последний оператор обработчика события:
Delphi
procedure
var
begin
end;
TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
var
S:
String;
begin
if (Button = mbLeft)
then
S := 'Left';
if (Button = mbRight)
then
S :=
'Right'
;
if (Button =
mbMiddle)
then
S :=
'Middle'
;
ListBox1.Items.Add(
'OnMouseDown '
+ S +
', X = '
+
IntToStr(X) +
', Y = '
+
IntToStr(Y));
end;
C++Builder
void __fastcall
TForm1::FormMouseDown(TObject
*Sender, TMouseButton Button,
TShiftState Shift,
int X,
int Y)
{
AnsiString S;
if (Button == mbLeft)
S = "Left";
if (Button ==
mbRight)
S =
"Right"
;
if (Button ==
mbMiddle)
S =
"Middle"
;
ListBox1->Items->Add(
"OnMouseDown "
+ S +
", X = "
+
IntToStr(X) +
", Y = "
+
IntToStr(Y));
}
Здесь в строку компонента ListBox
помещаются также и координаты курсора мыши.
Обработчику события передается
еще параметр Shift
класса TShiftState, который является множеством:
Delphi
TShiftState =
set of
(ssShift, ssAlt, ssCtrl, ssLeft, ssRight, ssMiddle, ssDouble);
C++Builder
(ssShift,
ssAlt, ssCtrl, ssLeft, ssRight, ssMiddle, ssDouble) TShiftState;
Элементы этого множества
означают следующее:
·
ssShift — нажата клавиша Shift.
·
ssAlt — нажата клавиша Alt.
·
ssCtrl — нажата клавиша Ctrl.
·
ssLeft — нажата левая кнопка мыши.
·
ssRight — нажата правая кнопка мыши.
·
ssMiddle — нажата центральная кнопка мыши.
·
ssDouble — выполнен двойной щелчок мышью.
Внесите следующее изменение в
обработчик события:
Delphi
procedure
var
begin
end;
TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
var
S:
String;
begin
if (Button = mbLeft)
then
S := 'Left';
if (Button = mbRight)
then
S :=
'Right'
;
if (Button =
mbMiddle)
then
S :=
'Middle'
;
ListBox1.Items.Add(
'OnMouseDown '
+ S +
', X = '
+
IntToStr(X) +
', Y = '
+
IntToStr(Y));
if (ssShift
in Shift)
then
ListBox1.Items.Add(
' ++ Shift'
);
if (ssCtrl
in Shift)
then
ListBox1.Items.Add(
' ++ Ctrl'
);
if (ssAlt
in Shift)
then
ListBox1.Items.Add(
' ++ Alt'
);
end;
C++Builder
void __fastcall
TForm1::FormMouseDown(TObject *Sender, TMouseButton Button,
TShiftState Shift,
int X,
int Y)
{
AnsiString S;
if (Button == mbLeft)
S = "Left";
if (Button ==
mbRight)
S =
"Right"
;
if (Button ==
mbMiddle)
S =
"Middle"
;
ListBox1->Items->Add(
"OnMouseDown "
+ S +
", X = "
+
IntToStr(X) +
", Y = "
+
IntToStr(Y));
if (Shift.Contains(ssShift))
ListBox1->Items->Add(
"
++ Shift"
);
if
(Shift.Contains(ssCtrl))
ListBox1->Items->Add(
"
++ Ctrl"
);
if
(Shift.Contains(ssAlt))
ListBox1->Items->Add(
"
++ Alt"
);
}
Те же самые параметры передаются
и обработчику события OnMouseUp, которое возникает, когда
пользователь отпускает нажатую кнопку мыши. Напишите следующий обработчик
события:
Delphi
procedure
var
begin
end;
TForm1.FormMouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
var
S:
String;
begin
if (Button = mbLeft)
then
S := 'Left';
if (Button = mbRight)
then
S :=
'Right'
;
if (Button =
mbMiddle)
then
S :=
'Middle'
;
ListBox1.Items.Add(
'OnMouseUp '
+ S +
', X = '
+
IntToStr(X) +
', Y = '
+
IntToStr(Y));
end;
C++Builder
void __fastcall
TForm1::FormMouseUp(TObject *Sender, TMouseButton Button,
TShiftState Shift,
int X,
int Y)
{
AnsiString S;
if (Button == mbLeft)
S = "Left";
if (Button ==
mbRight)
S =
"Right"
;
if (Button ==
mbMiddle)
S =
"Middle"
;
ListBox1->Items->Add(
"OnMouseUp "
+ S +
", X = "
+
IntToStr(X) +
", Y = "
+
IntToStr(Y));
}
Запустите программу на
выполнение. Щелкайте различными кнопками мыши в различных местах формы.
Нажимайте перед щелчком клавиши Shift, Alt и Ctrl — одну из них или любое количество. Затем выполните
двойные щелчки мышью.
При щелчке мышью появляются
события в следующем порядке:
·
OnMouseDown
·
OnClick
·
MouseUp.
При двойном щелчке мышью
появляются следующие события:
·
OnMouseDown
·
OnClick
·
MouseUp
·
OnDblClick
·
OnMouseDown
·
OnMouseUp.
Все реакции на действия с мышью
происходят только в том случае, если курсор мыши находится на форме. Если же он
находится на компоненте ListBox или на заголовке формы, то никаких
действий не будет.
Чтобы вызывались соответствующие
обработчики событий мыши, нужно выделив компонент ListBox,
связать его события с соответствующими обработчиками для формы.
Например, для события OnClick
нужно щелкнуть справа от этого свойства и из выпадающего списка выбрать событие
щелчка мышью для формы — FormClick.
Подобные установки следует
выполнить и для других событий.
Комментариев нет:
Отправить комментарий