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

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

События клавиатуры на форме в Delphi и C++Builder

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








Рис. 1. Созданная форма

События нажатия клавиш

Событие формы OnKeyDown возникает при нажатии пользователем на клавиатуре любой клавиши. Обработчику события передается параметр Key типа данных Word.
Выделите мышью форму, перейдите на вкладку событий Events. Создайте следующий обработчик события для OnKeyDown:
Delphi
procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  ListBox1.Items.Add('KeyDown. Char = ' +
    Char(Key) + '. Int = ' + IntToStr(Key));
end;
C++Builder
void __fastcall TForm1::FormKeyDown(TObject *Sender, WORD &Key,
    TShiftState Shift)
{
  AnsiString S;
  S = "KeyDown. Char = ";
  S = S + (AnsiChar)(Key);
  S = S + ". Int = " + IntToStr(Key);
  ListBox1->Items->Add(S);
}
Параметр Key передается обработчикам событий OnKeyDown и OnKeyUp. Некоторые его значения описаны в табл. 1.
Таблица 1. Значения параметра Key
Клавиша
Символьное значение
Числовое значение
Backspace

8
Enter

13
Shift

16
Ctrl

17
Alt

18
Caps Lock

20
Esc

27
Пробел
Пробел
32
PgUp
!
33
PgDn
"
34
End
#
35
Home
$
36
Стрелка влево
%
37
Стрелка вверх
&
38
Стрелка вправо
'
39
Стрелка вниз
(
40
Ins
-
45
Del
.
46
0
0
48
1
1
49
A
A
65
B
B
66
0 на цифровой клавиатуре

96
1 на цифровой клавиатуре
a
97
* на цифровой клавиатуре
j
106
+ на цифровой клавиатуре
k
107
- на цифровой клавиатуре
m
109
/ на цифровой клавиатуре
o
111
F1
p
112
F2
q
113
NumLock

144
ScrollLock

145



Запустите программу на выполнение. Нажимайте различные клавиши на клавиатуре. Смотрите результаты. Завершите программу.
Создайте простой обработчик события OnKeyUp:
Delphi
procedure TForm1.FormKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
  ListBox1.Items.Add('KeyUp');
end;
C++Builder
void __fastcall TForm1::FormKeyUp(TObject *Sender, WORD &Key, TShiftState Shift)
{
  ListBox1->Items->Add("KeyUp");
}
Запустите программу на выполнение. Выполните различные проверки. Завершите программу.
Создайте обработчик события OnKeyPress:
Delphi
procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char);
begin
  ListBox1.Items.Add('KeyPress. Char = ' + Char(Key));
end;
C++Builder
{
  AnsiString S;
  S = "KeyPress. Char = ";
  S = S + (AnsiChar)(Key);
  ListBox1->Items->Add(S);
}
Обработчику передается параметр Key типа данных Char, в котором находится введенный символ.
Запустите программу на выполнение. Выполните проверки нажатия различных клавиш.










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.
Подобные установки следует выполнить и для других событий.