Лабник по СПО
.pdfIf ButAdd.Down = True
Then
If ButSum.Down = True
Then
If ButReplc.Down = False Then Res:=Res+Nm1 Else Res:=Res+Nm2
Else Res:=Nm1+Nm2; ResLb.Caption:=FloatToStrF(Res,ffGeneral,4,1)
End;
Для того чтобы информировать пользователя о выбранных действиях, необходимо вывести соответствующую информацию на метку. Сообщение о действиях записываем в обработчики событий OnClick каждой кнопки, задающей действия. Процедура обработчика нажатия кнопки Сложение приведена в распечатке 3.2.
Распечатка 3.2
Procedure TfmCalc.ButAddClick(Sender: TObject);
Begin
Label1.Caption:='';
If ButAdd.Down = True Then If ButSum.Down = True
Then
If ButReplc.Down = False
Then LabRes.Caption:=' Результат Res = Res + Nm1' Else LabRes.Caption:='Результат Res = Res + Nm2' Else LabRes.Caption:='Результат Res = Nm1 + Nm2'; ResLb.Font.Color := clGray
End;
Нажатие кнопки Сложение изменяет вид действия, но само действие происходит только после нажатия кнопки Расчёт. При нажатии кнопок ButReplc и ButSum также должна изменяться информация о выбранном действии, поэтому в обработчики события OnClick этих кнопок тоже записываем процедуру ButAddClick.
Procedure TfmCalc.ButReplcClick(Sender: TObject); Begin ButAddClick(Sender) End;
Procedure TfmCalc.ButSumClick(Sender: TObject); Begin ButAddClick(Sender) End;
81
PDF created with pdfFactory Pro trial version www.pdffactory.com
Создаём процедуры ButMultClick, ButSubClick и ButDivClick для операций умножения, вычитания и деления.
Procedure TfmCalc.ButDivClick(Sender: TObject);
Begin
If ButDiv.Down=True Then
If ButReplc.Down=True Then If ButSum.Down=True
Then LabRes.Caption:='Результат Res = Res / Nm1'
Else LabRes.Caption:='Результат Res = Nm2 / Nm1' Else If ButSum.Down=False
Then LabRes.Caption:='Результат Res = Nm1 / Nm2'
Else LabRes.Caption:='Результат Res = Res / Nm2'; ResLb.Font.Color := clRed
End;
Вводим ссылки на процедуры умножения, вычитания и деления в процедуры ButSumClick
и ButReplcClick.
Procedure TfmCalc.ButReplcClick(Sender: TObject);
Begin
LabErr.Caption:='';
ButAddClick(Sender);
ButSubClick(Sender);
ButMultClick(Sender);
ButDivClick(Sender)
End;
Procedure TfmCalc.ButSumClick(Sender: TObject);
Begin
ButAddClick(Sender);
ButSubClick(Sender);
ButMultClick(Sender);
ButDivClick(Sender)
End;
В процедуру BitBtCalcClick добавляем операции умножения, вычитания и деления, написанные в соответствии со схемами, приведёнными на рис.3.6 - 3.8. Создаём операторы для формирования строки результата ResStr, записываемой в отчёт (распечатка
3.3).
82
PDF created with pdfFactory Pro trial version www.pdffactory.com
Распечатка 3.3
Procedure TfmCalc.BitBtCalcClick(Sender: TObject);
Begin
ResLb.Font.Color := clBlack;
ResStr:=' '+FloatToStrF(Res,ffGeneral,4,1); If ButAdd.Down = True Then
If ButSum.Down = True
Then If ButReplc.Down = False
Then Begin
Res:=Res+Nm1; ResStr:=ResStr+' + '+
FloatToStrF(Nm1,ffGeneral,4,1)+'='+
FloatToStrF(Res,ffGeneral,4,1)
End
Else Begin
Res:=Res+Nm2; ResStr:=ResStr+' + '+
FloatToStrF(Nm2,ffGeneral,4,1)+'='+
FloatToStrF(Res,ffGeneral,4,1)
End Else Begin
Res:=Nm1+Nm2; ResStr:=' '+
FloatToStrF(Nm1,ffGeneral,4,1)+' + '+
FloatToStrF(Nm2,ffGeneral,4,1)+'='+
FloatToStrF(Res,ffGeneral,4,1)
End;
If ButMult.Down = True Then If ButSum.Down = True
Then If ButReplc.Down = False
Then Begin
Res:=Res*Nm1; ResStr:=ResStr+' * '+
FloatToStrF(Nm1,ffGeneral,4,1)+'='+
FloatToStrF(Res,ffGeneral,4,1)
83
PDF created with pdfFactory Pro trial version www.pdffactory.com
End
Else Begin
Res:=Res*Nm2;
ResStr:=ResStr+' * '+FloatToStrF(Nm2,ffGeneral,4,1) +'='+FloatToStrF(Res,ffGeneral,4,1)
End Else Begin
Res:=Nm1*Nm2; ResStr:=' '+
FloatToStrF(Nm1,ffGeneral,4,1)+' * '+
FloatToStrF(Nm2,ffGeneral,4,1)+'='+
FloatToStrF(Res,ffGeneral,4,1)
End;
If ButSub.Down = True Then If ButSum.Down = True
Then If ButReplc.Down = False
Then Begin
Res:=Res-Nm1; ResStr:=ResStr+' - '+FloatToStrF
(Nm1,ffGeneral,4,1)+' = '+ FloatToStrF(Res,ffGeneral,4,1)
End
Else Begin
Res:=Res-Nm2; ResStr:=ResStr+' - '+
FloatToStrF(Nm2,ffGeneral,4,1)+'='+
FloatToStrF(Res,ffGeneral,4,1)
End
Else If ButReplc.Down = False
Then Begin
Res:=Nm1-Nm2; ResStr:=' '+
FloatToStrF(Nm1,ffGeneral,4,1)+' - '+
FloatToStrF(Nm2,ffGeneral,4,1)+' = '+ FloatToStrF(Res,ffGeneral,4,1)
84
PDF created with pdfFactory Pro trial version www.pdffactory.com
End
Else Begin
Res:=Nm2-Nm1; ResStr:=' '+
FloatToStrF(Nm2,ffGeneral,4,1)+' - '+
FloatToStrF(Nm1,ffGeneral,4,1)+' = '+ FloatToStrF(Res,ffGeneral,4,1)
End;
If ButDiv.Down=True Then
If ButReplc.Down=True
Then If Nm1=0 Then LabErr.Caption:='Ошибка ввода' Else If ButSum.Down=True
Then Begin
Res:=Res/Nm1; ResStr:=ResStr+' / '+
FloatToStrF(Nm1,ffGeneral,4,1)+' = '+ FloatToStrF(Res,ffGeneral,4,1)
End
Else Begin
Res:=Nm2/Nm1; ResStr:=' '+
FloatToStrF(Nm2,ffGeneral,4,1)+' / '+
FloatToStrF(Nm1,ffGeneral,4,1)+' = '+ FloatToStrF(Res,ffGeneral,4,1)
End
Else If Nm2=0 Then LabErr.Caption:='Ошибка ввода' Else If ButSum.Down=False
Then Begin
Res:=Nm1/Nm2; ResStr:=' '+
FloatToStrF(Nm1,ffGeneral,4,1)+' / '+
FloatToStrF(Nm2,ffGeneral,4,1)+' = '+ FloatToStrF(Res,ffGeneral,4,1)
End
Else Begin
85
PDF created with pdfFactory Pro trial version www.pdffactory.com
Res:=Res/Nm2; ResStr:=ResStr+' / '+
FloatToStrF(Nm1,ffGeneral,4,1)+' = '+ FloatToStrF(Res,ffGeneral,4,1)
End; ResLb.Caption:=FloatToStrF(Res,ffGeneral,4,1)
End;
После написания этого текста программа должна выполнять все действия с управлением через пиктографическое меню. Для того чтобы управлять через главное меню, в пункты главного меню вносим операторы, изменяющие состояния кнопок, и
вводим ссылки на обработчики событий кнопок пиктографического меню (распечатка 3.4).
Распечатка 3.4
Procedure TfmCalc.ActAddClick(Sender: TObject);
Begin {Пункт меню Сложение} ButAdd.Down:=True; ButAddClick(Sender)
End;
Procedure TfmCalc.ActSubClick(Sender: TObject);
Begin {Пункт меню Вычитание} ButSub.Down:=True; ButSubClick(Sender)
End;
Procedure TfmCalc.ActSub1Click(Sender: TObject);
Begin {Пункт меню Вычитание Nm1–Nm2} ButSub.Down:=True; ButReplc.Down:=False; ButSubClick(Sender)
End;
Procedure TfmCalc.ActSub2Click(Sender: TObject);
Begin {Пункт меню Вычитание Nm2–Nm1}
ButSub.Down:=True;
ButReplc.Down:=True;
ButSubClick(Sender)
86
PDF created with pdfFactory Pro trial version www.pdffactory.com
End;
Procedure TfmCalc.ActDivClick(Sender: TObject);
Begin {Пункт меню Деление}
ButDiv.Down:=True;
ButDivClick(Sender)
End;
Procedure TfmCalc.DivNm1Click(Sender: TObject);
Begin {Пункт меню Деление Nm1/Nm2}
ButDiv.Down:=True;
ButReplc.Down:=False;
ButDivClick(Sender)
End;
Procedure TfmCalc.DivNm2Click(Sender: TObject);
Begin {Пункт меню Деление Nm2/Nm1}
ButDiv.Down:=True;
ButReplc.Down:=True;
ButDivClick(Sender)
End;
Procedure TfmCalc.Reg1Click(Sender: TObject);
Begin {Пункт меню Одинарное действие}
ButSum.Down:=False;
ButAddClick(Sender);
ButSubClick(Sender);
ButMultClick(Sender);
ButDivClick(Sender)
End;
Procedure TfmCalc.RegAddClick(Sender: TObject);
Begin {Пункт меню Дополняющие действия}
ButSum.Down:=True;
ButAddClick(Sender);
ButSubClick(Sender);
ButMultClick(Sender);
ButDivClick(Sender)
End;
87
PDF created with pdfFactory Pro trial version www.pdffactory.com
В подпункты пункта Результаты главного меню вносим команды по обработке результатов (распечатка 3.5).
Распечатка 3.5
Procedure TfmCalc.CalcResClick(Sender: TObject);
Begin {Подпункт Расчёт } BitBtCalcClick(Sender)
End;
Procedure TfmCalc.WrResClick(Sender: TObject);
Begin {Подпункт меню Записать} fmOut.OutMem.Lines.Add(ResStr); fmOut.Show
End;
Procedure TfmCalc.OpResClick(Sender: TObject);
Begin fmOut.Show End; {Подпункт меню Открыть} Procedure TfmCalc.SavResClick(Sender: TObject);
Begin {Подпункт меню Сохранить} fmOut.OutMem.Lines.SaveToFile(FlNameEd.Text);
End;
Создаём процедуру OnClick кнопки ButtWrite для записи результатов расчёта.
Procedure TfmCalc.ButtWriteClick(Sender: TObject); Begin WrResClick(Sender) End;
Всобытие OnClick кнопки ButtOpen вводим команду на открытие второй формы.
Procedure TfmCalc.ButtOpenClick(Sender: TObject);
Begin fmOut.Show
End;
Вобработчиках событий контекстного меню второй формы делаем ссылки на обработчики событий главного меню.
Procedure TfmOut.CalcResPopClick(Sender: TObject);
Begin {Пункт Расчёт } fmCalc.BitBtCalcClick(Sender)
End;
Procedure TfmOut.ResOutClrClick(Sender: TObject);
Begin {Пункт Удалить результаты } OutMem.Clear;
88
PDF created with pdfFactory Pro trial version www.pdffactory.com
OutMem.Lines.Add(' Результаты расчёта')
End;
Procedure TfmOut.WrResPopClick(Sender: TObject);
Begin {Пункт меню Записать} fmCalc.WrResClick(Sender)
End;
Procedure TfmOut.SavPopClick(Sender: TObject);
Begin {Пункт меню Сохранить} fmCalc.SavResClick(Sender)
End;
Пункт Выход контекстного меню второй формы должен закрывать программу, а не только вторую форму. Для закрытия программы в обработчик события OnClick пункта меню Выход вводим оператор, закрывающий программу.
Procedure TfmOut.ClsOutClick(Sender: TObject);
Begin
Application.Terminate
End;
Можно закрыть программу оператором, закрывающим главную форму.
Procedure TfmOut.ClsOutClick(Sender: TObject); Begin fmCalc.Close End;
В обработчиках событий контекстного меню главной формы делаем ссылки на обработчики событий главного меню или кнопок.
Текст программы на языке С++
Устанавливаем восемь кнопок типа SpeedButton в соответствии с рис.3.12.
Присваиваем кнопкам имена: But1_2, ButSum, ButAdd, ButSub, ButMult, ButDiv, ButWr и ButOpen. Свойству GroupIndex зависимых кнопок: ButAdd, ButSub, ButMult и ButDiv
присваиваем значение 1, этому же свойству кнопки But1_2 - значение 2 и кнопки ButSum - значение 3. Свойству AllowAllUp кнопок ButReplc и ButSum присваиваем значение true, у остальных кнопок оставляем значение этого свойства равным false.
Для определенности действия, выполняемого по умолчанию, свойству Down кнопки ButAdd задаём значение true.
Помещаем на форму метки с обозначениями вводимых чисел, редакторы для ввода чисел, метку для вывода результата, метку для вывода описания заданного действия.
89
PDF created with pdfFactory Pro trial version www.pdffactory.com
Устанавливаем на форму редактор для ввода имени файла, в котором должны сохраняться результаты расчёта. Устанавливаем кнопки для ввода команд: расчёта, записи результатов, открытия результатов и выхода из программы в соответствии с рис.3.12.
В графическом редакторе создаём рисунки для кнопок размером 16×16 пикселей. Рисунки загружаем в свойства кнопок Glyph.
Объявляем в заголовочном файле главной формы глобальные переменные типа double для хранения вводимых чисел и результата, строковую переменную ResStr для формирования строки результата, записываемой в отчёт и затем сохраняемой в файле.
Прототип функции Vvod записываем в секцию public класса формы. public: // User declarations
__fastcall TfmCalc(TComponent* Owner); double Vvod(AnsiString Str);
};
double Nm1,Nm2,Res;
AnsiString ResStr=" Расчётов не было";
Текст описания функции ввода, предназначенной для преобразования вводимой строки в число, приведён в распечатке 3.6. Для вывода сообщения об ошибке в функции использована метка.
Распечатка 3.6
double TfmCalc::Vvod(AnsiString Str)
{
double Nm; try
{Nm=StrToFloat(Str); LabErr->Caption = "";
}
catch(...)
{
Nm=0;
if ((Str != "")&&(Str != " ")&&(Str != "-")) LabErr->Caption = "Ошибка ввода";
}
return Nm;
}
90
PDF created with pdfFactory Pro trial version www.pdffactory.com