Лабник по СПО
.pdfВ обработчик изменения текста редакторов записываем операторы ввода чисел. Для индикации того, что действие ещё не выполнено и результат не соответствует введённым данным, цвет результата изменяем на красный или светло-серый. Изменение цвета результата с чёрного на красный или светло-серый должно происходить при любых изменениях параметров, влияющих на значение результата. Чёрный цвет шрифта восстанавливаем только после выполнения расчёта.
void __fastcall TfmCalc::Nm1EdChange(TObject *Sender)
{
Nm1 = Vvod(Nm1Ed->Text); ResLab->Font->Color=clFuchsia;
}
void __fastcall TfmCalc::Nm2EdChange(TObject *Sender)
{
Nm2 = Vvod(Nm2Ed->Text); ResLab->Font->Color=clFuchsia;
}
Создаём текст функции обработчика нажатия кнопки Сложение с проверкой режима расчёта: одинарный или дополняющий режимы сложения (кнопки ButSum и But1_2) с указанием номера дополняющего числа.
void __fastcall TfmCalc::ButAddClick(TObject *Sender) {LabErr->Caption = "";
if (ButSum->Down==true) if (But1_2->Down==true)
ActLab->Caption=" Res = Res + Nm1"; else ActLab->Caption=" Res = Res + Nm2"; else ActLab->Caption=" Res = Nm1 + Nm2"; ResLab->Font->Color=clFuchsia;
}
Нажатие кнопки Сложение задаёт тип действия, но само действие происходит только после нажатия кнопки Расчёт, поэтому при задании типа действия результат не изменяется. Для того чтобы показать несоответствие исходных данных и результата, цвет шрифта результата делаем серым или красным, так же как и при вводе значения числа. Чёрный цвет шрифта восстанавливаем только после выполнения расчёта.
Создаём текст функции обработчика нажатия кнопки Вычитание с проверкой режима расчёта и последовательности операндов (кнопки ButSum и But1_2).
91
PDF created with pdfFactory Pro trial version www.pdffactory.com
void __fastcall TfmCalc::ButSu bClick(TObject *Sender)
{
LabErr->Caption = "";
if (ButSum->Down==true) if (But1_2->Down==true)
ActLab->Caption=" Res = Re s - Nm1"; else ActLab->Caption=" Res = Res - Nm2"; else if (But1_2->Down==false)
ActLab->Caption=" Res = Nm1 - Nm2"; else ActLab->Caption=" Res = Nm2 - Nm1";
ResLab->Font->Color=clFuchsia;
}
Аналогичные тексты пи шем для кнопок Умножение и Деление. Для кнопок ButSub и ButDiv создаём свои контекстные меню SubMenu и DivMenu, позволяю щие производить перестановку операндов (рис.3.13).
а б
Рис.3.13. Контекстные меню кнопок Вычитание (а) и Деление (б)
Записываем тексты обр аботчиков пунктов контекстных меню. void __fastcall TfmCalc::SubM enu12Click
(TObject *Sender)
{
ButSub->Down=true;
But1_2->Down=false;
ButSubClick(Sender);
}
void __fastcall TfmCalc::SubM enu21Click (TObject *Sender)
{
ButSub->Down=true;
But1_2->Down=true;
92
PDF created with pdfFactory Pro trial version www.pdffactory.com
ButSubClick(Sender);
}
void __fastcall TfmCalc::DivMenu21Click (TObject *Sender)
{
ButDiv->Down=true;
But1_2->Down=true;
ButDivClick(Sender);
}
void __fastcall TfmCalc::DivMenu12Click (TObject *Sender)
{
ButDiv->Down=true;
But1_2->Down=false;
ButDivClick(Sender);
}
Цифры 12 в имени функции означают, что используется прямая последовательность переменных, т.е. первым операндом является переменная Nm1, вторым операндом - переменная Nm2. Цифры 21 означают, что используется обратная последовательность переменных, т.е. первым операндом является переменная Nm2, вторым операндом - переменная Nm1.
При нажатии кнопок But1_2 и ButSum также должна изменяться информация о выбранном действии, поэтому в обработчики события OnClick этих кнопок записываем функции, изменяющие информацию о выбранном действии.
Проверяем работу программы.
void __fastcall TfmCalc::ButSumClick(TObject *Sender) {if (ButAdd->Down==true) ButAddClick(Sender);
if (ButSub->Down==true) ButSubClick(Sender);
if (ButMulty->Down==true) ButMultyClick(Sender); if (ButDiv->Down==true) ButDivClick(Sender);
}
void __fastcall TfmCalc::But1_2Click(TObject *Sender)
{
LabErr->Caption = "";
if (ButAdd->Down==true) ButAddClick(Sender);
93
PDF created with pdfFactory Pro trial version www.pdffactory.com
if (ButSub->Down==true) ButSubClick(Sender);
if (ButMulty->Down==true) ButMultyClick(Sender); if (ButDiv->Down==true) ButDivClick(Sender);
}
В функцию BitBtCalcClick вводим операторы, выполняющие операции сложения, умножения, вычитания и деления в соответствии со схемами рис.3.6 - 3.8, и операторы для формирования строки результата. Полный текст функции расчёта приведён в распечатке 3.7.
Распечатка 3.7
void __fastcall TfmCalc::CalcBitBtClick (TObject *Sender)
{
ResLab->Font->Color=clBlack;
ResStr=" "+FloatToStrF(Res,ffGeneral,4,1); if (ButAdd->Down==true)
if (ButSum->Down==true) if (But1_2->Down==true)
{
Res=Res+Nm1; ResStr=ResStr+" + "+
FloatToStrF(Nm1,ffGeneral,4,1)+" = "+ FloatToStrF(Res,ffGeneral,4,1);
}
else
{Res=Res+Nm2; ResStr=ResStr+" + "+
FloatToStrF(Nm2,ffGeneral,4,1)+" = "+ FloatToStrF(Res,ffGeneral,4,1);
}
else
{
Res=Nm1+Nm2;
ResStr=" "+FloatToStrF(Nm1,ffGeneral,4,1)+" + " +FloatToStrF(Nm2,ffGeneral,4,1)+" = "+ FloatToStrF(Res,ffGeneral,4,1);
94
PDF created with pdfFactory Pro trial version www.pdffactory.com
}
if (ButSub->Down==true) if (ButSum->Down==true) if (But1_2->Down==false)
{
Res=Res-Nm1; ResStr=ResStr+" - "+
FloatToStrF(Nm1,ffGeneral,4,1)+" = "+ FloatToStrF(Res,ffGeneral,4,1);
}
else
{
Res=Res-Nm2; ResStr=ResStr+" - "+
FloatToStrF(Nm2,ffGeneral,4,1)+" = "+ FloatToStrF(Res,ffGeneral,4,1);
}
else
{if (But1_2->Down==false)
{
Res=Nm1-Nm2;
ResStr=" "+FloatToStrF(Nm1,ffGeneral,4,1)+
"- "+FloatToStrF(Nm2,ffGeneral,4,1)+" = "+ FloatToStrF(Res,ffGeneral,4,1);
}
else
{
Res=Nm2-Nm1;
ResStr=" "+FloatToStrF(Nm2,ffGeneral,4,1)+
"- "+FloatToStrF(Nm1,ffGeneral,4,1)+" = "+ FloatToStrF(Res,ffGeneral,4,1);
}
}
if (ButMulty->Down==true) if (ButSum->Down==true)
95
PDF created with pdfFactory Pro trial version www.pdffactory.com
if (But1_2->Down==true)
{
Res=Res*Nm1;
ResStr=ResStr+
"* "+FloatToStrF(Nm1,ffGeneral,4,1)+" = "+ FloatToStrF(Res,ffGeneral,4,1);
}
else
{
Res=Res*Nm2;
ResStr=ResStr+
"* "+FloatToStrF(Nm2,ffGeneral,4,1)+" = "+ FloatToStrF(Res,ffGeneral,4,1);
}
else
{
Res=Nm1*Nm2;
ResStr=" "+FloatToStrF(Nm1,ffGeneral,4,1)+
"* "+FloatToStrF(Nm2,ffGeneral,4,1)+" = "+ FloatToStrF(Res,ffGeneral,4,1);
}
if (ButDiv->Down==true) if (But1_2->Down==true)
if (Nm1==0) LabErr->Caption = "Деление на нуль"; else if (ButSum->Down==true)
{
Res=Res/Nm1; ResStr=ResStr+" / "+
FloatToStrF(Nm1,ffGeneral,4,1)+" = "+ FloatToStrF(Res,ffGeneral,4,1);
}
else if (ButSum->Down==true)
{
Res=Res/Nm1; ResStr=ResStr+" / "+
96
PDF created with pdfFactory Pro trial version www.pdffactory.com
FloatToStrF(Nm1,ffGeneral,4,1)+" = " +FloatToStrF(Res,ffGeneral,4,1);
}
else { Res=Nm2/Nm1; ResStr=" "+
FloatToStrF(Nm2,ffGeneral,4,1)
+" / "+FloatToStrF(Nm1,ffGeneral,4,1)+ " = "+FloatToStrF(Res,ffGeneral,4,1);
}
else
if (Nm2==0) LabErr->Caption = "Деление на нуль"; else if (ButSum->Down==true)
{
Res=Res/Nm2; ResStr=ResStr+" / "+
FloatToStrF(Nm2,ffGeneral,4,1)+" = "+ FloatToStrF(Res,ffGeneral,4,1);
}
else { Res=Nm1/Nm2; ResStr=" "+
FloatToStrF(Nm1,ffGeneral,4,1)+" / "+
FloatToStrF(Nm2,ffGeneral,4,1)+" = "+ FloatToStrF(Res,ffGeneral,4,1);
}
ResLab->Caption=FloatToStrF(Res,ffGeneral,4,1);
}
Проверяем правильность вычисления результата.
Всобытие OnClick кнопки ButOpen вводим команду на открытие второй формы. void __fastcall TfmCalc::ButOpenClick(TObject *Sender)
{
fmOut->Show();
}
Всобытие OnClick кнопки ButWr вводим команду на запись результата.
97
PDF created with pdfFactory Pro trial version www.pdffactory.com
void __fastcall TfmCalc::ButWrClick(TObject *Sender)
{
fmOut->OutRes->Lines->Add(ResStr); fmOut->Show();
}
Записываем тексты пунктов контекстного меню на второй форме. void __fastcall TfmOut::ClrResClick(TObject *Sender)
{ //Пункт Удалить результаты
OutRes->Clear();
OutRes->Lines->Add(" Результаты расчёта"); OutRes->Lines->Add(" ");
}
void __fastcall TfmOut::CalcPMenuClick (TObject *Sender)
{//Пункт Расчёт
fmCalc->CalcBitBtClick(Sender);
}
void __fastcall TfmOut::SaveResClick(TObject *Sender)
{//Пункт Сохранить
OutRes->Lines->SaveToFile(fmCalc->NameFileEd->Text);
}
void __fastcall TfmOut::WrResClick(TObject *Sender)
{//Пункт Записать
fmOut->OutRes->Lines->Add(fmCalc->ResStr);
}
В пункт Выход записываем команду, закрывающую программу, без вызова сообщения о закрытии программы.
void __fastcall TfmOut::ClsPrtClick(TObject *Sender)
{
Application->Terminate();
}
или
void __fastcall TfmOut::ClsPrtClick(TObject *Sender)
{
98
PDF created with pdfFactory Pro trial version www.pdffactory.com
fmCalc->Close();
}
Записываем тексты обработчиков OnClick пунктов главного меню. Начнём создание текстов с пунктов раздела Результаты (см. рис.3.10,а).
void __fastcall TfmCalc::CalcResClick(TObject *Sender) { //Пункт Расчёт
CalcBitBtClick(Sender);
}
void __fastcall TfmCalc::WrResClick(TObject *Sender) { //Пункт Записать
ButWrClick(Sender);
}
void __fastcall TfmCalc::OpResClick(TObject *Sender) { //Пункт Открыть
fmOut->Show();
}
void __fastcall TfmCalc::ResSaveClick(TObject *Sender) { //Пункт Сохранить fmOut->SaveResClick(Sender);
}
void __fastcall TfmCalc::ClsPrClick(TObject *Sender)
{Close(); |
//Пункт Выход |
} |
|
Записываем тексты обработчиков пунктов и подпунктов раздела Действия главного меню
(см. рис.3.10,б).
void __fastcall TfmCalc::ActAddClick(TObject *Sender)
{ |
|
ButAdd->Down=true; |
//Пункт Сложить |
ButAddClick(Sender); |
|
} |
|
void __fastcall TfmCalc::ActSubClick(TObject *Sender)
{ |
|
ButSub->Down=true; |
//Пункт Вычесть |
ButSubClick(Sender); |
|
} |
|
|
99 |
PDF created with pdfFactory Pro trial version www.pdffactory.com
void __fastcall TfmCalc::Nm1SubNm2Click (TObject *Sender)
{ //Пункт Nm1–Nm2
ButSub->Down=true;
But1_2->Down=false;
ButSubClick(Sender);
}
void __fastcall TfmCalc::Nm2SubNm1Click (TObject *Sender)
{ //Пункт Nm2–Nm1
ButSub->Down=true;
But1_2->Down=true;
ButSubClick(Sender);
}
void __fastcall TfmCalc::ActMultyClick(TObject *Sender) { //Пункт Умножить
ButMulty->Down=true;
ButMultyClick(Sender);
}
void __fastcall TfmCalc::ActDivClick(TObject *Sender) { //Пункт Разделить
ButDiv->Down=true;
ButDivClick(Sender);
}
void __fastcall TfmCalc::Nm1DivNm2Click (TObject *Sender)
{ //Пункт Nm1/Nm2
ButDiv->Down=true;
But1_2->Down=false;
ButDivClick(Sender);
}
void __fastcall TfmCalc::Nm2DivNm1Click (TObject *Sender)
{//Пункт Nm2/Nm1
100
PDF created with pdfFactory Pro trial version www.pdffactory.com