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

Лабник по СПО

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

Создаём строковый массив констант для имён служебных клавиш и записываем его вне класса перед списком переменных.

Const

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

В процедуру обработки нажатия клавиш FormKeyDown записываем операторы, определяющие нажатые клавиши и выводящие имена клавиш на метку LabPoint. Имена служебных клавиш, нажимаемых совместно с символьными клавишами, выводим на метку ShftLabel. Для отображения состояния или нажатия клавиш, отображаемых на панели, записываем вызов процедуры UpDateKeyPanel.

Procedure TfmKey.FormKeyDown(Sender: TObject; Var Key: Word; Shift: TShiftState);

Var

S:String;

Begin

If Key In [vk_F1..vk_F12]

Then LabPoint.Caption := FunctionKeys[Key];

If Key=VK_LEFT Then LabPoint.Caption:='Left';

If Key=VK_HOME Then LabPoint.Caption:='Home'; If Key=VK_END Then LabPoint.Caption:='End';

If Key=VK_DELETE Then LabPoint.Caption:='Delete';

If Key=VK_PRIOR Then LabPoint.Caption:='Page Up';

If Key=VK_NEXT Then LabPoint.Caption:='Page Down'; If Key=VK_DOWN Then LabPoint.Caption:='Down';

If Key=VK_UP Then LabPoint.Caption:='Up';

If Key=VK_RIGHT Then LabPoint.Caption:='Right'; If Key=VK_SPACE Then Key := 0;

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); ShftLabel.Caption:=S; KeyCod.Caption:=IntToStr(Key);

111

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

UpDatKeyPanel

End;

Проверяем работу программы. Для определения символа нажатой клавиши создаём процедуру FormKeyPress. Текст процедуры заимствуем из распечатки 4.2. Прототип процедуры система программирования создаёт автоматически, при создании заготовки описания процедуры.

Операторы, очищающие заголовки меток после отпускания клавиш, вводим в

процедуру FormKeyUp.

Procedure TfmKey.FormKeyUp(Sender: TObject; Var Key: Word; Shift: TShiftState);

Begin

UpDatKeyPanel; CharLabel.Caption:=' '; ValLabel.Caption:=' '; KeyCod.Caption:=' '; LabPoint.Caption:=' '; ShftLabel.Caption:=' '

End;

Для дезактивации кнопки Выход создаём процедуру FormClick.

Procedure TfmKey.FormClick(Sender: TObject); Begin ButClose.Enabled:=Not ButClose.Enabled End;

Проверяем работу программы.

Написание текста программы KeyInfo на языке С++

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

public: // User declarations

__fastcall TfmKey(TComponent* Owner); void UpDateKeyPanel();

Для вызова функции UpDateKeyPanel() при запуске программы записываем её в функцию

FormCreate.

void __fastcall TfmKey::FormCreate(TObject *Sender)

{

112

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

UpDateKeyPanel();

}

Создаём функцию обработки нажатия клавиш и записываем в неё операторы, определяющие нажатую клавишу и выводящие имена клавиш на метку LabPoint. В текст функции FormKeyDown записываем вызов функции UpDateKeyPanel().

void __fastcall TfmKey::FormKeyDown (TObject *Sender, WORD &Key,TShiftState Shift)

{

AnsiString S=""; KeyCod->Caption=Key; ShftLabel->Caption=S;

if (Key==VK_F4) LabPoint->Caption="F4"; if (Key==VK_F2) LabPoint->Caption="F2"; if (Key==VK_F1) LabPoint->Caption="F1";

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

if (Key==VK_DELETE) LabPoint->Caption="Delete"; if (Key==VK_PRIOR) LabPoint->Caption="Page Up"; if (Key==VK_NEXT) LabPoint->Caption="Page Down"; if (Key==VK_UP) LabPoint->Caption="Up";

if (Key==VK_DOWN) LabPoint->Caption="Down"; if (Key==VK_LEFT) LabPoint->Caption="Left";

if (Key==VK_RIGHT) LabPoint->Caption="Right"; if (Key==VK_SPACE) Key = 0;

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; UpDateKeyPanel();

}

Проверим работу программы. Проверим влияние значения переменной Key при нажатии клавиши пробела на работу кнопки Выход.

113

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

Для определения символа нажатой клавиши создаём процедуру FormKeyPress. Текст процедуры заимствуем из распечатки 4.1. Прототип процедуры система программирования создаёт автоматически при создании заготовки описания процедуры.

Операторы, очищающие заголовки после отпускания клавиш, вводим в процедуру

FormKeyUp.

void __fastcall TfmKey::FormKeyUp

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

{

UpDateKeyPanel(); CharLabel->Caption = ' '; ValLabel->Caption = ' '; KeyCod->Caption = ' '; LabPoint->Caption = " "; ShftLabel->Caption = " ";

}

Для дезактивации кнопки Выход создаём процедуру FormClick, запускаемую щелчком по форме.

void __fastcall TfmKey::FormClick(TObject *Sender)

{

BitBtClose->Enabled = !BitBtClose->Enabled;

}

Проверяем работу программы.

114

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

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

1.Какие операции выполняют следующие выражения? B = A == 1;

B := A = 1;

Какого типа могут быть переменные А и В в этих выражениях?

2.Что нужно сделать, чтобы при нажатии заданной клавиши изменялся цвет метки?

3.Назовите методы обработки событий клавиатуры.

4.Назовите типы переменной Key в событиях OnKeyDown, OnKeyUp, OnKeyPress.

5.Объясните, как происходит вычисление и какой тип результата получится в следующих операторах?

ShiftL->Enabled = GetKeyState(VK_SHIFT) & 0x80; CsLkLab.Enabled:=GetKeyState(vk_Capital) And 1=1;

6.На что влияет свойство формы KeyPreView?

7.Какие методы можно использовать для определения состояния служебных клавиш: Alt,

Shift, Ctrl, Insert, NumLock и CapsLock?

8.Почему в языке С++ можно использовать оператор вида:

NumLabel->Enabled=(GetKeyState(VK_NUMLOCK) & 1);

а в языке Delphi нужно добавлять ещё и операцию сравнения: NumLab.Enabled:=GetKeyState(vk_NumLock) And 1=1;

115

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

Лабораторная работа № 5. Вызов управляющих команд по сочетаниям клавиш

Задание

Цель работы:

1.Изучение методов изменения вида объектов, отображаемых на форме.

2.Изучение методов ввода управляющих команд с клавиатуры.

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

4.Освоение приёмов использования стандартных сообщений и модальных форм.

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

Разработка приложения для расчёта площадей плоских фигур.

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

Выполняемые действия: расчёт площади плоских фигур. Перечень фигур: треугольник, квадрат, прямоугольник и круг.

Одновременно отображаемые параметры: исходные данные, названия исходных данных, площадь фигуры, название фигуры.

Типы чисел: действительные числа с плавающей запятой. Число значащих цифр в выводе результатов расчёта: 5 не менее.

Выполнение расчёта: по изменению исходных данных или по выбору фигуры. Выбор фигуры: из списка мышью или нажатием клавиш.

Виды сообщений:

Ÿо недопустимых значениях исходных данных;

Ÿо корректности вводимых символов;

Ÿо делении на ноль;

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

116

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

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

Электронная форма в папке с именем Work5 на диске Н:.

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

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

Модальные формы

Основным элементом любого приложения является форма - контейнер, в котором размещаются другие объекты. Обычно проект содержит несколько форм. По умолчанию все формы создаются автоматически при запуске приложения, и первая из введённых в

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

Невидимые при запуске формы можно сделать видимыми методом Show или ShowModal. Метод ShowModal можно применять только к невидимой в данный момент форме. Модальная форма останавливает выполнение вызвавшей её программы, и

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

При открытии модальной формы её свойство ModalResult получает значение 0. Как только при обработке каких-то событий на форме её свойству ModalResult будет присвоено положительное значение, модальная форма закроется. По умолчанию при нажатии кнопки OK свойству ModalResult присваивается значение, равное 1. Значение свойства ModalResult можно прочитать методом ShowModal. Таким образом, процедура, вызвавшая модальную форму, может узнать, какая кнопка была нажата.

При закрытии модальной формы кнопкой Cancel или методом Close свойство ModalResult получает значение 2. При закрытии модальной формы другой кнопкой или другими методами можно присвоить свойству ModalResult любые целые значения. Свойство ModalResult используется только для модальных форм. В обычных формах значение этого свойства должно быть равно mrNone.

При закрытии формы методом Close в закрывающейся форме возникает последовательность событий, которые можно обрабатывать. Их назначение - проверка возможности закрытия формы и указание возможных действий. Первым возникает

117

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

событие OnCloseQuery. В его обработчик передаётся по ссылке переменная CanClose, определяющая, должно ли продолжаться закрытие формы. По умолчанию значение CanClose равно True, что означает продолжение закрытия. Но если из анализа текущего состояния приложения, например, при наличии не сохраненных результатов расчёта, следует, что закрывать приложение нельзя, то параметру CanClose нужно присвоить значение False.

Если обработчик события OnCloseQuery отсутствует или в его обработчике сохранено значение True, то следом наступает событие OnClose. В обработчик события OnClose передаётся по ссылке переменная Action, которой можно задавать значения:

ŸcaNone - не закрывать форму;

ŸcaHide - значение по умолчанию, для не главных форм. Форма становится невидимой. Вся информация формы сохраняется;

ŸcaMinimize - свернуть форму до пиктограммы. Вся информация формы сохраняется;

ŸcaFree - закрыть форму. Освободить занимаемую память.

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

При сообщении о вводе некорректных исходных данных не требуется что-то выбирать, поэтому можно создать форму с одной кнопкой для закрытия окна (рис.5.1) или даже без кнопки.

Рис.5.1. Модальное окно с сообщением

онекорректном вводе

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

118

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

Создание модальной формы производится так же, как и не модальной формы. Создаём новую форму, присваиваем имя модулю формы, размещаем на форме рисунки и надписи, записываем в разделе Uses главной формы имя модуля созданной формы.

Записываем в разделе Uses главной формы имя модальной формы сообщения.

Implementation

Uses UnClose, UnError; {$R *.DFM}

В языке С++ записываем ссылку на заголовочный файл модальной формы сообщения. #include "UnitErr.h"

Свойство Visible модальной формы должно иметь значение false. Вызов модальной формы производится оператором:

fmError.ShowModal

или fmError->ShowModal();

Если требуется узнать выбор пользователя, например, в сообщении с вопросом, нужно ли закрывать программу (рис.5.2), то необходимо присвоить соответствующие значения свойству ModalResult при нажатии кнопок, определяющих необходимые действия.

Рис.5.2. Модальное окно с вопросом

о закрытии программы

Создаём процедуру обработчика нажатия кнопки, подтверждающей закрытие программы, с присвоением свойству ModalResult значения 1.

Procedure TfmClose.BtnOkClick(Sender: TObject);

Begin

ModalResult := 1 End;

void __fastcall TfmClse::BtnOkClick(TObject *Sender)

{

119

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

ModalResult = 1;

}

В событие OnCloseQuery главной формы записываем вызов модальной формы с изменением заголовка модальной формы в зависимости от значения переменной IndSave. Если результаты были сохранены, значение переменной IndSave равно единице.

Если метод ShowModal возвращает значение, равное 1, то переменной CanClose присваивается значение True, если главная форма не должна закрываться, то переменной CanClose присваивается значение False.

Procedure TfmTr.FormCloseQuery (Sender: TObject; Var CanClose: Boolean);

Begin

If IndSave = 0

Then fmClose.Caption := 'Результаты не сохранены'

Else fmClose.Caption := 'Закрытие программы'; If fmClose.ShowModal = 1 Then CanClose := True Else CanClose := False

End;

или

void __fastcall TForm1::FormCloseQuery (TObject *Sender, bool &CanClose)

{if (IndSave==0) fmClose->Caption="Результаты не сохранены";

else fmClose->Caption = "Закрытие программы"; if (fmClose->ShowModal()==1 ) CanClose = True; else CanClose = False;

}

Библиотечные функции для вывода сообщений

В системе программирования имеются библиотечные функции, которые позволяют

выводить сообщения на экран в модальных формах и определять реакцию пользователя на полученную информацию.

Простое сообщение, не требующее выбора, выводится оператором:

ShowMessage('Сообщение');

//на языке Delphi.

ShowMessage("Сообщение");

//на языке C++ Builder.

 

120

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

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