среда, 13 апреля 2016 г.

11. События формы. Лабораторные Delphi, C++ (7)

События щелчка мышью на форме в 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 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 TForm1.FormDblClick(Sender: TObject);
begin
  ListBox1.Items.Add('OnDblClick');
end;
C++Builder
void __fastcall TForm1::FormDblClick(TObject *Sender)
{
  ListBox1->Items->Add("OnDblClick");
}
Запустите программу на выполнение. При двойном щелчке левой кнопкой мыши по форме сначала возникает событие OnClick, а затем OnDblClick.
Событие OnMouseDown возникает при нажатии любой кнопки мыши. Напишите следующий обработчик этого события:
Delphi
procedure 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 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 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 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 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.
Подобные установки следует выполнить и для других событий.





Комментариев нет:

Отправить комментарий