Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Лабник по СПО

.pdf
Скачиваний:
9
Добавлен:
05.06.2015
Размер:
1.59 Mб
Скачать

ResStr:=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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]