Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Лабник по СПО

.pdf
Скачиваний:
9
Добавлен:
05.06.2015
Размер:
1.59 Mб
Скачать

ButDiv->Down=true;

But1_2->Down=true;

ButDivClick(Sender);

}

Записываем тексты обработчиков пунктов раздела Режим расчёта (см. рис.3.10,в): одинарное действие или повторяющееся.

void __fastcall TfmCalc::Reg1Click(TObject *Sender)

{

ButSum->Down = false; ButSumClick(Sender);

}

void __fastcall TfmCalc::RegAddClick(TObject *Sender)

{

ButSum->Down = true; ButSumClick(Sender);

}

101

PDF created with pdfFactory Pro trial version www.pdffactory.com

Контрольные вопросы

1.Назовите назначение и типы меню.

2.Объясните свойства и события объекта меню.

3.Какие типы объектов можно создать с помощью компонента ToolBar?

4.Сколько контекстных меню можно создать и использовать на одной форме?

5.Сколько главных меню можно создать и использовать на одной форме?

6.Как создать пиктографическое меню?

7.Что такое ShortCut и где её найти?

8.Как ввести подсказки к пунктам меню?

9.Какое значение получит переменная N2 после выполнения операторов, приведённых ниже?

N1:=2;

N2:=8;

If N1>2 Then N2:=3

Else If N1>4 Then N2:=4

Else N2:=2;

или

int N1=2; int N2=8;

if (N1>2) N2=3; else if (N1>4) N2=4;

else N2=2;

102

PDF created with pdfFactory Pro trial version www.pdffactory.com

Лабораторная работа № 4. Обработка нажатия клавиш

Задание

Цель работы:

1.Изучение методов определения кода и символа нажатой клавиши.

2.Освоение приёмов получения информации о нажатии символьных и служебных клавиш.

Содержание работы:

Разработка приложения, позволяющего определять коды символов и коды нажатых клавиш.

Технические требования к приложению:

Выполняемые действия: ввод данных нажатой клавиши, определение состояния служебных клавиш.

Отображаемая информация: код клавиши, имя или символ клавиши, код символа, состояние служебных клавиш.

Число форм в проекте: 1.

Форма отчёта:

Текст проекта в папке с именем Work4 на диске Н:.

Содержание отчёта:

Файлы проекта и исполняемый файл.

Методы определения нажатой клавиши

Для определения нажатой клавиши применяют два основных метода:

1)использование строки ввода (Edit, Memo, RichEdit), выводящей символ нажатой клавиши;

2)создание обработчиков: нажатия клавиши; удержания нажатой клавиши; отпускания нажатой клавиши.

Для определения состояния клавиш предусмотрены обработчики трёх событий:

103

PDF created with pdfFactory Pro trial version www.pdffactory.com

ŸOnKeyPress - событие, возникающее при нажатии клавиши, генерирующей символы

ASCII;

ŸOnKeyDown - событие, возникающее при нажатии пользователем любой клавиши, включая функциональные и специальные клавиши;

ŸOnKeyUp - событие, возникающее при отпускании любой клавиши.

Обработчик возвращает параметр с именем Key, который представляет нажатую клавишу. В обработчиках событий OnKeyDown и OnKeyUp параметр Key является беззнаковым значением типа Word, содержащим номер клавиши. В обработчике событий OnKeyPress параметр Key является значением типа Char, представляющим символ ASCII с учетом регистра.

Для служебных клавиш и цифр, размещённых на цифровой клавиатуре, можно использовать числовые константы или номера клавиш. Имена констант и номера некоторых клавиш приведены в табл.4.1.

Таблица 4.1

Имена и номера служебных клавиш

Клавиша

Имя константы

Номер

 

 

клавиши

 

 

 

Alt

VK_MENU

16

 

 

 

Стрелка <é>

VK_UP

38

 

 

 

Стрелка <ê>

VK_DOWN

40

 

 

 

Стрелка <ç>

VK_LEFT

37

 

 

 

Стрелка <è>

VK_RIGHT

39

 

 

 

Home

VK_HOME

36

 

 

 

Caps Lock

VK_CAPITAL

20

 

 

 

Page Up

VK_PRIOR

33

 

 

 

Page Down

VK_NEXT

34

 

 

 

Backspace

VK_BACK

8

 

 

 

Esc

VK_ESCAPE

27

 

 

 

Пробел

VK_SPACE

32

 

 

 

End

VK_END

35

 

 

 

Имена констант и номера клавиш можно найти в разделе Virtual Key Codes пункта Help главного меню системы программирования.

104

PDF created with pdfFactory Pro trial version www.pdffactory.com

Все символы ASCII имеют соответствующие численные коды, но не все клавиши имеют символьное обозначение.

Операционная система использует фокус ввода для того, чтобы определить, куда посылать события клавиатуры. Чтобы активная форма первой перехватывала события клавиатуры, необходимо установить значение свойства формы KeyPreview равным True.

Создание процедур, определяющих нажатие клавиш

На языке Delphi код символа определяем через функцию Ord(Key), возвращающую номер символа (распечатка 4.1). В данной процедуре CharLabel и ValLabel - имена меток для отображения символа и его номера.

Распечатка 4.1

Procedure TMainForm.FormKeyPress (Sender: TObject; Var Key: Char);

Begin

CharLabel.Caption := Key; ValLabel.Caption := IntToStr(Ord(Key))

End;

Для отображения номера символа на языке С++ объявим переменную целого типа и присвоим ей номер символа Key (распечатка 4.2).

Распечатка 4.2

void __fastcall TfmKey::FormKeyPress (TObject *Sender, char &Key)

{

CharLabel->Caption = Key; unsigned char KL = Key; ValLabel->Caption = KL;

}

Процедура отображает символ с учётом регистра и языка, но для отображения служебной клавиши, нажатой одновременно с символьной клавишей, требуется процедура, обрабатывающая событие OnKeyDown. Для отображения нажатия служебных клавиш Alt, Ctrl и Shift используем отдельную метку с именем ShftLabel. Процедура события FormKeyDown возвращает параметр Shift типа TShiftState, который содержит информацию о нажатии служебных клавиш Alt, Ctrl и Shift.

105

PDF created with pdfFactory Pro trial version www.pdffactory.com

Вязыке Delphi имеется операция In, выдающая значение True, если нажата клавиша, входящая в массив Shift.

Вязыке С++ для определения вхождения переменной в массив предусмотрена функция Contains(const Tel) типа bool, являющаяся членом класса Shift. Функция возвращает значение true, если нажата клавиша, входящая в массив Shift. Для того чтобы вывести сообщение о трёх одновременно нажатых клавишах, их имена нужно объединить

водну строку. Тексты процедур, показывающих нажатие клавиш Alt, Ctrl и Shift, приведены ниже.

Procedure TMainForm.FormKeyDown

(Sender: TObject; Var Key: Word; Shift: TShiftState);

Var S:String;

Begin

S:='';

If ssShift In Shift Then S:=s+'Shift+'; If ssAlt In Shift Then S:=s+'Alt+';

If ssCtrl In Shift Then S:=s+'Ctrl+';

If Length(S)>0 Then Delete(S,Length(S),1); ShiftLabel.Caption:=S;

End;

void __fastcall TfmKey::FormKeyDown (TObject *Sender, WORD &Key,TShiftState Shift) {AnsiString S = "";

if (Shift.Contains(ssShift)) S = S+"Shift+"; if (Shift.Contains(ssCtrl)) S = S+"Ctrl+"; if (Shift.Contains(ssAlt)) S = S+"Alt+";

if (S.Length()>0) S.Delete(S.Length(),1); ShftLabel->Caption = S;

}

Для вывода информации о нажатии несимвольных клавиш можно в процедуре FormKeyDown написать отдельные операторы для каждой клавиши с выводом имени клавиши на метку.

void __fastcall TfmKey::FormKeyDown

(TObject *Sender, WORD &Key,TShiftState Shift) {KeyCod->Caption = Key;

106

PDF created with pdfFactory Pro trial version www.pdffactory.com

if (Key==VK_F1) CharLabel->Caption = "F1"; if (Key==VK_F4) CharLabel->Caption = "F4";

if (Key==VK_HOME) CharLabel->Caption = "Home"; if (Key==VK_END) CharLabel->Caption = "End";

if (Key==VK_SPACE) Key = 0;

}

Последний оператор даёт запрет обработки клавиши пробела, чтобы не активизировать кнопку Выход. Если не ввести этот оператор, то после нажатия клавиши пробела форма закроется. Проблема закрытия программы при нажатии клавиш пробела

или Enter при наличии единственной кнопки на форме может быть решена переводом кнопки Выход в запрещенное состояние присвоением свойству Enabled кнопки Выход значения False.

Можно создать массив констант с именами служебных клавиш, и тогда обойтись одним оператором для отображения нажатия любой клавиши, включенной в массив.

Const

FunctionKeys: Array[vk_F1..vk_F12] Of String[3]= ('F1','F2','F3','F4','F5','F6','F7','F8','F9', 'F10','F11','F12');

Procedure TMainForm.FormKeyDown

(Sender: TObject; Var Key: Word; Shift: TShiftState);

Begin

If Key In [vk_F1..vk_F12]

Then CharLabel.Caption := FunctionKeys[Key]; KeyCod.Caption:=IntToStr(Key)

End;

Обработчик события OnKeyDown не воспринимает нажатие стрелок, если на форме имеется активная кнопка. Её следует убрать, или отключить или использовать обработчик события OnKeyUP, но в последнем случае информация о нажатии стрелки появится только после отпускания клавиши.

После отпускания клавиш тексты на метках остаются, хотя клавиши уже не нажаты. Для того чтобы очистить тексты меток после отпускания клавиш, можно использовать процедуру FormKeyUp.

Procedure TfmKey.FormKeyUp

(Sender: TObject; Var Key: Word; Shift: TShiftState);

107

PDF created with pdfFactory Pro trial version www.pdffactory.com

Begin

CharLabel.Caption := ' ';

ValLabel.Caption := ' '; KeyCod.Caption:=' '

End;

void __fastcall TfmKey::FormKeyUp

(TObject *Sender, WORD &Key,TShiftState Shift)

{

CharLabel->Caption = ' ';

ValLabel->Caption = ' ';

KeyCod->Caption = ' ';

}

Для определения состояния служебных клавиш можно использовать функцию Windows API GetKeyState, в которую передаём код виртуальной клавиши. Функция GetKeyState возвращает значение типа Shortint в системе Delphi или signed char в системе С++ Builder. Младший бит этого числа меняет своё значение с каждым нажатием на противоположное. Обычно клавиши Insert, NumLock и CapsLock считают включёнными, если младший бит равен единице. Старший бит этого числа равен единице, если клавиша нажата. Значение старшего или младшего бита можно получить с помощью операции логического побитового умножения и привести результат операции к логическому типу. Свойство объекта Enabled позволяет отображать информацию о состоянии клавиши яркостью цвета текста метки с названием клавиши. Если клавиша нажата, то свойству Enabled присваиваем значение True и текст становится ярким, если клавиша не нажата, то свойству Enabled присваиваем значение False и текст становится бледным.

Текст процедуры, реализующей определение состояния клавиш Insert, NumLock и CapsLock и нажатие клавиш Shift, Alt и Ctrl, приведён в распечатке 4.3.

Распечатка 4.3

void TfmKey::UpDateKeyPanel() {InsLabel->Enabled=(GetKeyState(VK_INSERT)&1)==1; NumLabel->Enabled=(GetKeyState(VK_NUMLOCK) & 1); CapsLockL->Enabled=GetKeyState(20) & true; ShiftL->Enabled=(GetKeyState(VK_SHIFT) & 0x80); LabAlt->Enabled=GetKeyState(VK_MENU) & 0x80; CtrlLb->Enabled=GetKeyState(VK_CONTROL) & 0x80;

}

108

PDF created with pdfFactory Pro trial version www.pdffactory.com

Procedure TMainForm.UpDatKeyPanel;

Begin

NumLab.Enabled:=GetKeyState(VK_NUMLOCK) And 1=1; InsLab.Enabled:= GetKeyState(VK_INSERT) And 1=1; CapsLockL.Enabled:=GetKeyState(20) And 1=1; ShiftLab.Enabled:=GetKeyState(VK_SHIFT) And $80=$80; LabAlt.Enabled:=GetKeyState(VK_MENU) And $80=$80; CtrlLb.Enabled:=GetKeyState(VK_CONTROL) And $80=$80

End;

Для отображения состояния клавиш использована панель с метками по числу отображаемых индикаторов.

Для того чтобы проверить состояние клавиш после запуска программы, нужно создать

процедуру проверки состояний и вызывать её при создании формы и при нажатии и отпускании любой клавиши.

Компонент для объединения меток

Компонент Panel (панель) находится на вкладке Standard и представляет собой контейнер общего назначения. Объекты этого класса помещают на форму для того, чтобы располагать вставленные в них подчиненные объекты вдоль одной из сторон, независимо от изменения размеров окна.

Создание проекта KeyInfo

для обработки событий клавиатуры

Создаём проект типа VCL Forms Application. Сохраняем проект в папке с именем Work4, присваиваем главному модулю имя UnitKey, а проекту - имя KeyInfo. Присваиваем форме имя fmKey. Проверяем работу проекта.

Помещаем на форму панель, а на панели размещаем семь меток для информации о служебных клавишах (рис.4.1). У шести меток с именами служебных клавиш свойству Enabled присваиваем значение False. Седьмую метку с именем LabPoint помещаем левее метки CtrlLb и используем её для вывода имён при нажатии других служебных клавиш, не имеющих меток с собственными именами.

109

PDF created with pdfFactory Pro trial version www.pdffactory.com

Рис.4.1. Окно программы, определяющей код и символ

нажатой клавиши

Свойству Enabled метки LabPoint присваиваем значение True. На рис.4.1 эту метку не видно, так как ни одна из служебных клавиш, выводимых на эту метку, не нажата, и поэтому её заголовок должен быть пустым.

Для того чтобы активная форма первой перехватывала события клавиатуры, задаём свойству формы KeyPreview значение True.

На панель также устанавливаем кнопку Выход. Проверяем работу кнопки Выход. Размещаем на форме ещё восемь меток. Четыре метки для вывода названий и

четыре метки для вывода: символа нажатой клавиши, имён, нажатых вместе с символьной клавишей, служебных клавиш, кода символа и кода клавиши. Если не нажата ни одна клавиша, четыре последние метки должны быть пустыми.

Текст программы KeyInfo на языке Delphi

Создаём процедуру, определяющую состояние служебных клавиш на момент запуска программы. Текст процедуры заимствуем из распечатки 4.3. Прототип процедуры объявляем в секции Public класса формы.

Public

{ Public declarations } Procedure UpDatKeyPanel;

End;

Для вызова процедуры при запуске программы записываем процедуру UpDatKeyPanel в

процедуру FormCreate.

Procedure TfmKey.FormCreate(Sender: TObject);

Begin

UpDatKeyPanel

End;}

110

PDF created with pdfFactory Pro trial version www.pdffactory.com

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]