Практическое занятие № 11
Тема: "Создание программ для обработки событий мыши и клавиатуры"
Цель работы: на практике отработать принципы обработки событий мыши и клавиатуры при проектировании интерфейса пользователя
Ход работы
Создайте форму вида:
Форма не имеет заголовка и перемещается по экрану за любое пустое место на ней;
Указания: Для формы задайте свойства: BorderStyle=bsNone, BorderWidth=4, Caption=Практика, Color=clMoneyGreen, Height=290, KeyPreview=True (чтобы форма реагировала на нажатие клавиш пользователем), Width=280, Position=poDesktopCenter.
Для перетаскивания формы за пустое место на ней в событии формы OnMouseDown напишем код:
procedure Tform1.FormMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
//если нажата левая кнопка мыши
if Button=mbLeft then
begin
ReleaseCapture();
(Sender as TControl).Perform(WM_SysCommand, $f012,0);
end;
end;
При наведении мыши на текстовое поле меняется фон поля на желтый, а в строке статуса отображается текст "Первое поле" или "Второе поле"
Указания: На форму нанесите два текстовых поля.
На форму нанесите компонент StatusBar (Win32), щелкните на компоненте два раза и в редакторе панелей создайте 4 панели с помощью кнопки Add New. Выделите вторую панель и в свойстве Text укажите текст Num.
Для обработки наведения мыши на поле в событии OnMouseMove поля Edit1 напишем код:
procedure Tform1.Edit1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
begin
//устанавливаем цвет фона для поля
Edit1.Color:=clYellow;
//в строке статуса отображаем текст
StatusBar1.Panels[2].Text:='Первое поле';
end;
В событии OnMouseMove поля Edit2 напишем код:
procedure Tform1.Edit2MouseMove(Sender: TObject; Shift: TShiftState; X,Y: Integer);
begin
//устанавливает цвет фона для поля
Edit2.Color:=clYellow;
//в строке статуса отображаем текст
StatusBar1.Panels[2].Text:='Второе поле';
end;
В событии OnMouseMove формы напишем код:
procedure Tform1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,Y: Integer);
begin
//возвращаем для полей начальный белый цвет
Edit1.Color:=clWindow;
Edit2.Color:=clWindow;
//очищаем строку статуса
StatusBar1.Panels[2].Text:='';
end;
При входе в первое поле язык на клавиатуре переключается на "английский". При входе во второе поле - на "русский".
Указания: для переключения языка в первом поле нужно в событии OnEnter поля Edit1 написать текст:
procedure Tform1.Edit1Enter(Sender: TObject);
begin
//переключаем клавиатуру на английский язык
LoadKeyboardLayout('00000409',klf_activate);
end;
Для переключения языка во втором поле нужно в событии OnEnter поля Edit2 написать текст:
procedure Tform1.Edit2Enter(Sender: TObject);
begin
//переключаем клавиатуру на русский язык
LoadKeyboardLayout('00000419',klf_activate);
end;
В первое текстовое поле можно ввести только числа, а во второе - только русские буквы;
Указания: Для ограничения ввода в первое текстовое поле только цифр необходимо в событии OnKeyPress поля Edit1 написать код:
procedure Tform1.Edit1Keypress(Sender: TObject; var Key: Char);
//описываем переменную
//для получения символа десятичного разделителя в Windows
var ch:char;
begin
//присваиваем переменной символ десятичного разделителя
ch:=DecimalSeparator;
//если введенна точка или запятая,
//заменяем их на принятый десятичный разделитель
if (Key='.') of (Key=',') then
Key:=ch;
//если символ не цифра, не разделитель, не минус и не BackSpace
if not (Key in ['0'..'9',ch,'-',#8])
//или, если разделитель уже был введен ранее
or ((Key=ch)and(pos(ch,Edit1.Text)>0))
//или, если минус уже был введен ранее
or ((Key='-')and(pos('-',Edit1.Text)>0))
//или, если введенный минус не в начале числа
or ((Key='-')and(Edit1.SelStart>0)) then
//заменяем введенный символ на пустой
Key:=#0;
end;
Для ограничения ввода во второе текстовое поле только русских букв необходимо для события OnKeyPress поля Edit2 написать код:
procedure Tform1.Edit2KeyPress(Sender: TObject; var Key: Char);
begin
//если символ не русская буква, не пробел, не минус и не BackSpace
if not (Key in ['А'..'я',' ','-',#8]) then
//заменяем введенный символ на пустой
Key:=#0;
end;
Переключатели " Сумма" и "Разность" должны выбираться пользователем с помощью клавиш ALT+F1 и ALT+F2;
Указания: по умолчанию форма не реагирует на нажатия клавиш. Для включения реакции на клавиши укажите для формы свойство: KeyPreview = true.
На форму нанесите компонент RadioGroup (Standard), в свойстве Items введите названия переключателей, в свойстве ItemIndex укажите номер выбранного по умолчанию переключателя.
Для включения переключателей с помощью комбинации клавиш необходимо в событии OnKeyDown формы написать код:
procedure Tform1.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
//если нажаты клавиши Alt+F1
if (ssAlt in Shift) and (Key=VK_F1) then
//то включается первый переключатель
RadioGroup1.ItemIndex:=0
//иначе, если нажаты клавиши Alt+F2
else if (ssAlt in Shift) and (Key=VK_F2) then
//то включается второй переключатель
RadioGroup1.ItemIndex:=1;
end;
Флажок на форме переключается комбинацией клавиш Ctrl+F.
Указания: На форму нанесите компонент CheckBox (Standard), в свойстве Caption укажите текст надписи возле флажка. Для включения/выключение флажка с помощью комбинации клавиш необходимо в событии OnKeyDown формы добавить код:
//если нажаты клавиши Ctrl+F
if (ssCtrl in Shift) and (Key=ord('F')) then
//то флажок переводится в противоположное состояние
CheckBox1.Checked:=not CheckBox1.Checked;
В строке статуса в первом поле отображать текст "CAPS", если включенна клавиша CapsLock, во втором поле отображать текст "NUM", если включенная клавиша NumLock
Указания: Для отображения состояния клавиш CapsLock и NumLock в событие OnKeyDown формы добавьте код:
//если клавиша CapsLock включенна
if (GetKeyState(VK_CAPITAL) and 1) = 1 then
//то отображаем текст в первой панели (нумерация панелей начинается с 0)
StatusBar1.Panels[0].Text:='CAPS'
else
//иначе удаляем текст из панели
StatusBar1.Panels[0].Text:='';
//если клавиши NumLock включенна
if (GetKeyState(VK_NUMLOCK) and 1) = 1 then
//то отображаем текст во второй панели (нумерация панелей начинается с 0)
StatusBar1.Panels[1].Text:='NUM'
else
//иначе удаляем текст из панели
StatusBar1.Panels[1].Text:='';
При запуске программы клавиатура должная автоматически переключаться на украинский язык, выключаться клавиша CapsLock (если она включена) и включаться клавиша NumLock (если она выключена). В строке статуса нужно отобразить текущий язык клавиатуры.
Указания: Для автоматического переключения на украинский язык и настройки клавиш CapsLock и NumLock при старте программы, необходимо в событии OnCreate формы написать код:
procedure TForm1.FormCreate(Sender: TObject);
begin
//переключаем клавиатуру на украинский язык
LoadKeyboardLayout('00000422',klf_activate);
//если CapsLock включенна, то выключаем
if (GetKeyState(VK_CAPITAL) and 1) = 1 then
begin
//нажимаем ее
keybd_event(VK_CAPITAL,MapVirtualKey(VK_CAPITAL, 0),0,0);
//и отпускаем
keybd_event(VK_CAPITAL, MapVirtualKey(VK_CAPITAL, 0), keyeventf_keyup,0);
end;
//если NumLock выключенна, то включаем
if (GetKeyState(VK_NUMLOCK) and 1) = 0 then
begin
//нажимаем ее
keybd_event(VK_NUMLOCK, MapVirtualKey(VK_NUMLOCK, 0),0,0);
//и отпускаем
keybd_event(VK_NUMLOCK, MapVirtualKey(VK_NUMLOCK, 0),keyeventf_keyup),0);
end;
//в 4 панели строки статуса отобразим текущий язык клавиатуры
//если активный язык - английский
if GetKeyboardLayout(0) = 67699721 then
StatusBar1.Panels[3].Text:='EN'
//иначе, если активный язык - русский
else if GetKeyboardLayout(0) = 68748313 then
StatusBar1.Panels[3].Text:='RU'
//иначе, если активный язык - украинский
else if GetKeyboardLayout(0) = 4039115810 then
StatusBar1.Panels[3].Text:='UA'
end;
При смене языка клавиатуры в 4 панели строки статуса нужно отображать название активного языка.
Указания: в событии OnKeyDown формы нужно добавить код:
//если активный язык - английский
if GetKeyboardLayout(0) = 67699721 then
StatusBar1.Panels[3].Text:='EN'
//иначе, если активный язык - русский
else if GetKeyboardLayout(0) = 68748313 then
StatusBar1.Panels[3].Text:='RU'
//иначе, если активный язык - украинский
else if GetKeyboardLayout(0) = 4039115810 then
StatusBar1.Panels[3].Text:='UA'
На форме создайте кнопку, которая невидимая при запуске программы, но становится видимой при нажатии на клавиши ALT+CTRL+F1. Кнопка должна перемещаться по форме с помощью клавиш управления курсором (стрелок). Для кнопки напишите код, который завершает работу с программой
Указания: Для создания скрытой кнопки нанесите на форму компонент Button (Standard) и задайте ей свойства: Caption=Выход, Visible=False. Для отображения скрытой кнопки на форме в событии OnKeyDown формы нужно добавить код:
//если нажаты клавиши Alt+Ctrl+F1
if (ssAlt in Shift) and (ssCtrl in Shift) and (Key=VK_F1) then
//то кнопка Button1 становится видимой
Button1.Visible := true
Для перемещения кнопки с помощью стрелок управления курсором нужно в событие OnKeyDown формы добавить код:
//если нажата клавиша Стрелка вверх
if Key = VK_UP then
//то кнопка сдвигается на форме вверх на 10 точек
Button1.Top:=Button1.Top-10
//иначе, если нажатая клавиша Стрелка вниз
else if Key = VK_DOWN then
//то кнопка сдвигается на форме вниз на 10 точек
Button1.Top:=Button1.Top+10
//иначе, если нажатая клавиша Стрелка влево
else if Key = VK_LEFT then
//то кнопка сдвигается на форме влево на 10 точек
Button1.Left:=Button1.Left-10
//иначе, если нажатая клавиша Стрелка вправо
else if Key = VK_RIGHT then
//то кнопка сдвигается на форме вправо на 10 точек
Button1.Left:=Button1.Left+10;
Для того, чтобы кнопка завершала работу с программой необходимо в событии OnClick кнопки написать код:
procedure TForm1.Button1Click(Sender: TObject);
begin
//закрываем программу
Close;
end;