Иллюстрированный самоучитель по C++ Builder

Внесение изменений

После нескольких запусков программы "Сила тока" возникает желание усовершенствовать программу, внести в нее изменения. Например, такие, чтобы после ввода напряжения в результате нажатия клавиши Enter курсор переходил в поле Сопротивление, а после ввода сопротивления в результате нажатия этой же клавиши выполнялся расчет. Кроме того, было бы неплохо, чтобы пользователь мог вводить в поля редактирования только числа. Чтобы внести изменения в программу, нужно запустить C++ Builder и открыть соответствующий проект. Сделать это можно обычным способом, выбрав в меню File команду Open Project.

Можно также воспользоваться командой Reopen из меню File. При выборе команды Reopen открывается список проектов, над которыми работал программист в последнее время. В листинге 2.4 приведена программа "Сила тока", в которую внесены изменения: добавлены функции обработки событий onKeyPress для компонентов Edit1 и Edit2. Чтобы добавить в программу функцию обработки события, надо в окне Object Inspector выбрать компонент, для которого нужно создать функцию обработки события, на вкладке Events выбрать событие и сделать двойной щелчок в поле рядом с именем события. C++ Builder сформирует шаблон функции обработки события. После этого можно вводить инструкции, реализующие функцию.

Листинг 2.4. Функции обработки событий на компонентах формы программы "Сила тока".

// щелчок на кнопке Вычислить
void__fastcall TForml::ButtonlClick(TObject *Sender)
{
float u; // напряжение
float r; // сопротивление
float i; // ток
// проверим, введены ли данные в поля Напряжение и Сопротивление
if (((Editl-XText).Length() == 0) || ((Edit2 › Text).Length() ==0))
{
MessageDlg("Haдo ввести напряжение и сопротивление",
mtlnformation, TMsgDlgButtons() << 0);>
if ((Editl › Text).Length() == 0)
Edit1 › SetFocus(); // курсор в поле Напряжение else
Edit2 › SetFocus(); // курсор в поле Сопротивление return; };
// получить данные из полей ввода
u = StrToFloat(Editl › Text);
r = StrToFloat(Edit2 › Text);
// вычислить силу тока try
{
i = u/r;
}
catch (EZeroDivide &e)
{
ShowMessage("Величина сопротивления не должна быть равна нулю");
Edit2 › SetFocus(); // курсор в поле Сопротивление
return;
}
// вывести результат в поле Label4
Label4 › Caption = "Ток: " +
FloatToStrF(i,ffGeneral,7.2) + " А";
}
// нажатие клавиши в поле Напряжение
void __fastcall TForml::EditlKeyPress(TObject *Sender, char SKey)
{
// коды запрещенных клавиш заменим нулем, в результате
// символы этих клавиш в поле редактирования не появятся
// Key – код нажатой клавиши
// проверим, является ли символ допустимым
if ((Key >= '0') && (Key <= '9'})
// цифра return;
// Глобальная переменная DecimalSeparator
// содержит символ, используемый в качестве разделителя
// при записи дробных чисел
if (Key == DecimalSeparator)
{
if ((Editl-XText).Pos(DecimalSeparator)!= 0)
Key =0; // разделитель уже введен return;
}
if (Key == VK_BACK) // клавиша <Backspace>
return;
if (Key == VK_RETURN) // клавиша <strong>Enter</strong>
{
Edit2 › SetFocus();
return;
};
// остальные клавиши запрещены Key =0;
// не отображать символ
}
// нажатие клавиши в поле Сопротивление
void__fastcall TForml::Edit2KeyDown(TObject *Sender, WORD &Key,
TSHIFTState SHIFT)
{
if ((Key >= '0') && (Key <= '9')) // цифра
return;
if (Key == DecimalSeparator)
{
if ((Edit2 › Text).Pos(DecimalSeparator)!= 0)
Key =0; // разделитель уже введен return;
}
if (Key == VK_BACK) // клавиша <Backspace>
return; <
if (Key == VK_RETORN) // клавиша <strong>Enter</strong>
(
Buttonl › SetFocus(); // переход к кнопке Вычислить
// повторное нажатие клавиши <strong>Enter</strong>
// активизирует процесс вычисления тока
return;
};
// остальные клавиши запрещены Key = 0; //не отображать символ
}
// щелчок на кнопке Завершить
void __fastcall TForml::Button2Click(TObject *Sender)
{
Forml › Close(); // закрыть форму приложения }
Если Вы заметили ошибку, выделите, пожалуйста, необходимый текст и нажмите CTRL + Enter, чтобы сообщить об этом редактору.