Практическое занятие № 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;