logo
Курсовые / Лабораторная работа20-25

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

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

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

// щелчок на кнопке Вычислить

void__fastcall TForm1::ButtonlClick(TObject *Sender)

{

float u; // напряжение

float r; // сопротивление

float i; // ток

// проверим, введены ли данные в поля Напряжение и Сопротивление

if (((Edit1-XText).Length()==0)||((Edit2->Text).Length()==0))

{

MessageDlg("Haдo ввести напряжение и сопротивление",

mtlnformation, TMsgDlgButtons()<<mbOK,0);

if ((Edit1->Text).Length()==0)

Edit1->SetFocus(); // курсор в поле Напряжение else

Edit2->SetFocus();// курсор в поле Сопротивление

return;

};

// получить данные из полей ввода

u = StrToFloat(Edit1->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 TForm1::EditlKeyPress(TObject *Sender, char SKey)

{

/* коды запрещенных клавиш заменим нулем, в результате символы этих клавиш в поле редактирования не появятся

Key — код нажатой клавиши

проверим, является ли символ допустимым */

if ((Key>='0')&&(Key<='9'}) // цифра

return;

/* Глобальная переменная DecimalSeparator

содержит символ, используемый в качестве разделителя

при записи дробных чисел */

if ( Key == DecimalSeparator)

{

if ((Edit1->Text).Pos(DecimalSeparator)!=0)

Key =0; // разделитель уже введен

return;

}

if (Key == VK_BACK) // клавиша <Backspace>

return;

if ( Key == VK_RETURN) // клавиша <Enter>

{

Edit2->SetFocus();

return;

};

// остальные клавиши запрещены

Key =0; // не отображать символ

}

// нажатие клавиши в поле Сопротивление

void__fastcall TForm1::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) // клавиша <Enter>

(

Button1->SetFocus();//переход к кнопке Вычислить

// повторное нажатие клавиши <Enter>

// активизирует процесс вычисления тока

return;

};

// остальные клавиши запрещены

Key = 0; //не отображать символ

}

// щелчок на кнопке Завершить

void __fastcall TForm1::Button2Click(TObject *Sender)

{

Form1->Close(); // закрыть форму приложения

}