Лабник по СПО
.pdfResStr:=sA+AEd.Text+'; B = '+HEd.Text+ ';S = '+SEd.Text+'.'
End;
6:Begin
ALb.Caption:='Диаметр D = '; SLb.Left:=264; SLb.Caption:='Площадь круга S = '; LabH.Visible:=False; HEd.Visible:=False; LabC.Visible:=False; CEd.Visible:=False;
S:=Pi*A*A/4;
SEd.Text:=' '+FloatToStrF(S,ffGeneral,5,2); ResStr:=' D='+AEd.Text+'; S='+SEd.Text+'.'
End End; Trng:=0
End;
В соответствии с выбранной фигурой должны измениться тексты меток, обозначающие вводимые и рассчитываемый параметры. Лишние редакторы нужно скрыть. Для удобства отладки программы можно сначала написать текст процедуры Calc с
одним рассчитываемым параметром и добавлением расчёта остальных параметров после написания и отладки других процедур программы.
Создаём процедуры ввода значений исходных данных.
Procedure TfmArea.AEdChange(Sender: TObject);
Begin
A:=Vvod(AEd.Text); Calc
End;
Procedure TfmArea.HEdChange(Sender: TObject);
Begin
H:=Vvod(HEd.Text); Calc
End;
Procedure TfmArea.CEdChange(Sender: TObject);
131
PDF created with pdfFactory Pro trial version www.pdffactory.com
Begin
C:=Vvod(CEd.Text); Calc
End;
Создаём процедуру обработки выбора фигуры из списка.
Procedure TfmArea.ListBox1Click(Sender: TObject);
Begin
RP:=ListBox1.ItemIndex;
If (RP=0) Or (RP=1) Then Begin RP:=3; ListBox1.ItemIndex:=RP;
End;
Calc
End;
Пишем процедуру выбора рассчитываемой фигуры нажатием клавиш в соответствии с сочетаниями клавиш, показанными на рис.5.6. Нажатие третьей клавиши при выборе треугольника приведёт к ошибке преобразования строки в число, если фокус находится в одном из редакторов. Чтобы избежать ошибки преобразования из-за ввода некорректного символа, ввод в этом случае не производим, а передаём фокус объекту
ListBox1.
Procedure TfmArea.FormKeyDown(Sender: TObject; Var Key: Word; Shift: TShiftState);
Begin
If (ssCtrl In Shift) And (Key=84)
Then Begin
Trng:=1;
ListBox1.SetFocus
End;
If (Trng=1) And (Key=72)
Then Begin
RP:=2;
ListBox1.ItemIndex:=2; Calc
End;
If (Trng=1) And (Key=76)
132
PDF created with pdfFactory Pro trial version www.pdffactory.com
Then Begin
RP:=3;
ListBox1.ItemIndex:=3;
Calc
End;
If (ssCtrl In Shift) And (Key=83)
Then Begin
RP:=4;
ListBox1.ItemIndex:=4;
Calc
End;
If (ssCtrl In Shift) And (Key=82)
Then Begin
RP:=5;
ListBox1.ItemIndex:=5;
Calc
End;
If (ssCtrl In Shift) And (Key=68)
Then Begin
RP:=6;
ListBox1.ItemIndex:=6;
Calc
End
End;
Вобработчике события OnClick кнопки Да, находящейся на форме сообщения о закрытии программы, задаём значение подтверждающего ответа равным 6.
Procedure TfmClose.BtnYesClick(Sender: TObject);
Begin
ModalResult:=6
End;
Вобработчике события OnCloseQuery главной формы записываем вызов
сообщения с вопросом о закрытии программы и информацией о записанных и сохранённых расчётах.
Procedure TfmArea.FormCloseQuery (Sender: TObject; Var CanClose: Boolean);
133
PDF created with pdfFactory Pro trial version www.pdffactory.com
Begin
If IndWr=0
Then fmClose.Caption:='Результаты не записаны'
Else If IndPas=0
Then fmClose.Caption:= 'Последний расчёт не записан'
Else fmClose.Caption:='Записано расчётов - '+ IntToStr(IndWr);
If IndSave=0
Then Begin
fmClose.LbRez.Caption:='Результаты не сохранены'; fmClose.LbRez.Font.Color:=clRed
End
Else Begin
fmClose.LbRez.Caption:='Результаты сохранялись'; fmClose.LbRez.Font.Color:=clNavy
End;
If fmClose.ShowModal=6 Then CanClose:=True Else CanClose:=False
End;
Пишем текст обработчика нажатия кнопки Записать.
Procedure TfmArea.WrButClick(Sender: TObject);
Begin fmOut.MemoOut.Lines.Add(ResStr); IndWr:=IndWr+1; IndPas:=1; fmOut.Show
End;
Пишем текст обработчика нажатия кнопки Отчёт.
Procedure TfmArea.OpenButClick(Sender: TObject); Begin fmOut.Show End;
Пишем текст обработчика нажатия кнопки Сохранить.
Procedure TfmArea.SavButClick(Sender: TObject);
Begin fmOut.MemoOut.Lines.SaveToFile(Edittxt.Text); IndSave:=1;
End;
134
PDF created with pdfFactory Pro trial version www.pdffactory.com
Создаём контекстное меню на форме fmOut в соответствии с рис.5.9.
Рис.5.9. Контекстное меню формы
для записи результатов расчёта
Создаём обработчик нажатия пункта меню Удалить формы fmOut.
Procedure TfmOut.OutDelClick(Sender: TObject);
Begin fmOut.MemoOut.Clear;
fmOut.MemoOut.Lines.Add('Результаты расчёта'); fmOut.MemoOut.Lines.Add(' ');
IndWr:=0;
IndPas:=0
End;
Создаём обработчик нажатия пункта меню Записать формы fmOut.
Procedure TfmOut.WrtOutClick(Sender: TObject);
Begin fmOut.MemoOut.Lines.Add(ResStr); IndWr:=IndWr+1;
IndPas:=1
End;
Создаём обработчик нажатия пункта меню Сохранить формы fmOut.
Procedure TfmOut.SavOutClick(Sender: TObject);
Begin fmOut.MemoOut.Lines.SaveToFile(fmArea.Edittxt.Text); IndSave:=1;
End;
Создаём обработчик нажатия пункта меню Закрыть форму.
Procedure TfmOut.ClsfmOutClick(Sender: TObject);
Begin Close End;
Создаём обработчик нажатия пункта меню Закрыть программу формы fmOut.
135
PDF created with pdfFactory Pro trial version www.pdffactory.com
Procedure TfmOut.ClsPrOutClick(Sender: TObject); Begin fmArea.Close End;
Создаём контекстное меню на главной форме в соответствии с рис.5.10.
Рис.5.10. Контекстное меню главной формы
Создаём обработчик нажатия пункта Записать контекстного меню главной формы.
Procedure TfmArea.WrOutClick(Sender: TObject);
Begin
WrButClick(Sender)
End;
Создаём обработчик нажатия пункта Открыть контекстного меню главной формы.
Procedure TfmArea.OpOutClick(Sender: TObject);
Begin fmOut.Show
End;
Создаём обработчик нажатия пункта Сохранить контекстного меню главной формы.
Procedure TfmArea.SavOutClick(Sender: TObject);
Begin
SavButClick(Sender)
End;
Создаём обработчик нажатия пункта Закрыть контекстного меню главной формы.
Procedure TfmArea.ClsPrClick(Sender: TObject);
Begin
Close
End;
Текст программы на языке С++
Написание текста производим в такой последовательности, чтобы после написания каждого оператора можно было проверять работу программы.
136
PDF created with pdfFactory Pro trial version www.pdffactory.com
Объявляем переменные типа double для хранения задаваемых и расчётной величин. Объявляем переменную RP для хранения вида рассчитываемой фигуры и переменную Trng для регистрации вызова фигуры треугольника через двойной символ. Объявляем три
переменные типа unsigned char для хранения информации о числе записей результатов в отчёте, о записи последнего расчёта и о сохранении отчёта в файле. Объявляем строковую переменную ResStr для формирования строки результата. Задаём начальное значение строки на случай, если команда на запись поступит раньше команды на расчёт.
Переменные объявляем вне класса, чтобы их можно было инициализировать. Тексты, использование которых предполагается неоднократным, объявляем как строковые константы.
public: // User declarations
__fastcall TfmArea(TComponent* Owner); double Vvod(AnsiString Str);
void Calc();
};
double A=3,H=4,C=5,S; unsigned char RP=3,Trng=0,
unsigned char IndWr=0, IndPas=0, IndSave=0; AnsiString ResStr=" A = 3; B = 4; C = 5; S = 6."; const AnsiString lA="Сторона А = ", sA="A = ", lB="Сторона B = ";
const AnsiString lH="Высота H = ", SS="Площадь треугольника S = "; //-------------------------------------------------
Затем задаём начальное значение индекса списка в событии главной формы
OnCreate.
void __fastcall TfmArea::FormCreate(TObject *Sender)
{
ListBox1->ItemIndex=RP;
}
Создаём функцию преобразования строки в число с выводом сообщения о некорректном вводе или недопустимых значениях исходных данных. Сообщение выводим на модальную форму fmError.
double TfmArea::Vvod(AnsiString Str)
{
137
PDF created with pdfFactory Pro trial version www.pdffactory.com
double Nm; try
{
Nm=StrToFloat(Str);
}
catch(...)
{
Nm=0;
if ((Str != "")&&(Str != " ")&&(Str != "-"))
{
fmError->LabelErr->Caption="Ошибка ввода"; fmError->ShowModal();
}
}
return Nm;
}
Создаём функцию расчёта, используя переключатель switch с параметром RP (распечатка 5.3). В соответствии с выбранной фигурой должен изменяться текст меток, обозначающих вводимые рассчитываемые параметры, и скрываться лишние редакторы. Для удобства отладки программы можно сначала написать текст функции Calc с одним рассчитываемым параметром RP и добавлением остальных параметров после написания и отладки других функций программы.
Распечатка 5.3 void TfmArea::Calc()
{
IndPas=0; switch (RP)
{
case 2: ALb->Caption=lA; LabH->Caption=lH; SLb->Left=224; SLb->Caption=SS; LabC->Visible=false; CEd->Visible=false; LabH->Visible=true;
138
PDF created with pdfFactory Pro trial version www.pdffactory.com
HEd->Visible=true; S=A*H/2;
SEd->Text=" "+FloatToStrF(S,ffGeneral,5,2); ResStr=sA+AEd->Text+"; H = "+HEd->Text+
"; S = "+SEd->Text+'.'; break;
case 3: ALb->Caption=lA; LabH->Caption=lB; LabC->Caption="Сторона C ="; SLb->Left=224; SLb->Caption=SS; LabH->Visible=true; HEd->Visible=true; LabC->Visible=true; CEd->Visible=true;
S=(A+H+C)*(H+C-A)*(A-H+C)*(A+H-C)/16; if (S>=0) {
S=sqrt(S);
SEd->Text=" "+FloatToStrF(S,ffGeneral,5,2);
}
else {
SEd->Text=" ??"; fmError->LabelErr->Caption=
"Недопустимые\n значения"; fmError->ShowModal();
}
ResStr=sA+AEd->Text+"; B = "+HEd->Text+ "; C = "+CEd->Text+"; S = "+SEd->Text+'.';
break;
case 4: ALb->Caption=lA; SLb->Left=246;
SLb->Caption="Площадь квадрата S ="; LabH->Visible=false; HEd->Visible=false; LabC->Visible=false;
139
PDF created with pdfFactory Pro trial version www.pdffactory.com
CEd->Visible=false; S=A*A;
SEd->Text=" "+FloatToStrF(S,ffGeneral,5,2); ResStr=sA+AEd->Text+"; S = "+SEd->Text+'.';
break;
case 5: ALb->Caption=lA; LabH->Caption=lВ; SLb->Left=210;
SLb->Caption="Площадь прямоугольника S ="; LabH->Visible=true;
HEd->Visible=true;
LabC->Visible=false;
CEd->Visible=false; S=A*H;
SEd->Text=" "+FloatToStrF(S,ffGeneral,5,2); ResStr=sA+AEd->Text+"; B = "+HEd->Text+
"; S = "+SEd->Text+'.'; break;
case 6: ALb->Caption="Диаметр D ="; SLb->Left=264; SLb->Caption="Площадь круга S ="; LabH->Visible=false; HEd->Visible=false; LabC->Visible=false; CEd->Visible=false; S=M_PI*A*A/4;
SEd->Text=" "+FloatToStrF(S,ffGeneral,5,2); ResStr=" D="+AEd->Text+"; S="+SEd->Text+'.';
break;
}
Trng=0;
}
Создаём функции ввода значений исходных данных. void __fastcall TfmArea::AEdChange(TObject *Sender)
{
140
PDF created with pdfFactory Pro trial version www.pdffactory.com