Внесение изменений
После нескольких запусков программы "Сила тока" возникает желание усовершенствовать программу, внести в нее изменения. Например, такие, чтобы после ввода напряжения в результате нажатия клавиши 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(); // закрыть форму приложения }