Текст программы с комментариями
Содержимое файла MUnit.h
//---------------------------------------------------------------------------
#ifndef MUnitH
#define MUnitH
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <Menus.hpp>
#include <vcl\Clipbrd.hpp>
#include "LongCalculation.h"
#include "AboutUnit.h"
#include <Dialogs.hpp>
//---------------------------------------------------------------------------
class TMForm: public TForm
{
__published: // IDE-managed Components
TMainMenu *MainMenu;
TMenuItem *Pravka;
TMenuItem *Spravka;
TMenuItem *NoProgr;
TMenuItem *CtrlC;
TMenuItem *CtrlV;
TStaticText *STValue;
TGroupBox *GBNumbers;
TButton *B7;
TButton *B8;
TButton *B9;
TButton *B6;
TButton *B5;
TButton *B4;
TButton *B3;
TButton *B2;
TButton *B1;
TButton *Button10;
TButton *Button11;
TButton *B0;
TGroupBox *GBOperators;
TButton *Bplus;
TButton *Bminus;
TButton *Bdelen;
TButton *Bymn;
TButton *Boddelperem;
TButton *Bznak;
TButton *Bravno;
TGroupBox *GroupBox1;
TButton *Breset;
TButton *Bbs;
TButton *Bclear;
TStaticText *STFIntFrac;
TMenuItem *NClose;
TMemo *MFile;
TSaveDialog *SaveFile;
TMenuItem *Save;
void __fastcall FormCreate(TObject *Sender);
void __fastcall OnResetClicked(TObject *Sender);
void __fastcall OnBackspaceClicked(TObject *Sender);
void __fastcall OnClearClicked(TObject *Sender);
void __fastcall OnAddDigit(TObject *Sender);
void __fastcall OnAdd3Zero(TObject *Sender);
void __fastcall OnChangeFracState(TObject *Sender);
void __fastcall OnReturn(TObject *Sender);
void __fastcall OnOperation(TObject *Sender);
void __fastcall OnTurnSign(TObject *Sender);
void __fastcall CtrlCClick(TObject *Sender);
void __fastcall CtrlVClick(TObject *Sender);
void __fastcall FormKeyPress(TObject *Sender, char &Key);
void __fastcall FormKeyUp(TObject *Sender, WORD &Key, TShiftState Shift);
void __fastcall NoProgrClick(TObject *Sender);
void __fastcall NCloseClick(TObject *Sender);
void __fastcall SaveClick(TObject *Sender);
private: // User declarations
//Контроллер калькулятора, обеспечивает хранение чисел и все операции с ними
CCalcController oCalculator;
public: // User declarations
__fastcall TMForm(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TMForm *MForm;
//---------------------------------------------------------------------------
#endif
Содержимое файла MUnit.cpp
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "MUnit.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TMForm *MForm;
//---------------------------------------------------------------------------
__fastcall TMForm::TMForm(TComponent* Owner): TForm(Owner) {
}
//---------------------------------------------------------------------------
void __fastcall TMForm::FormCreate(TObject *Sender){
// на всякий случай, сбрасываем калькулятор
oCalculator.Reset();
MFile->Clear();
// выводим текущее значение ввода
STValue->Caption = oCalculator.Print();
// показываем текущую область ввода
STFIntFrac->Caption = (oCalculator.InFrac)? "FRAC":"INT";
}
//---------------------------------------------------------------------------
void __fastcall TMForm::OnResetClicked(TObject *Sender){
// сбрасиываем калькулятор
MFile->Clear();
oCalculator.Reset();
// выводим текущее значение ввода
STValue->Caption = oCalculator.Print();
// показываем текущую область ввода
STFIntFrac->Caption = (oCalculator.InFrac)? "FRAC":"INT";
}
//---------------------------------------------------------------------------
void __fastcall TMForm::OnBackspaceClicked(TObject *Sender){
// затираем один правый символ в области ввода
oCalculator.RemoveDigit();
// выводим текущее значение ввода
STValue->Caption = oCalculator.Print();
// показываем текущую область ввода
STFIntFrac->Caption = (oCalculator.InFrac)? "FRAC":"INT";
}
//---------------------------------------------------------------------------
void __fastcall TMForm::OnClearClicked(TObject *Sender){
// очищаем область ввода
oCalculator.ClearInput();
// выводим текущее значение ввода
STValue->Caption = oCalculator.Print();
// показываем текущую область ввода
STFIntFrac->Caption = (oCalculator.InFrac)? "FRAC":"INT";
}
//---------------------------------------------------------------------------
void __fastcall TMForm::OnAddDigit(TObject *Sender){
// добавляем одну цифру (0...9) в область ввода
// В каждом из закрепленных объектов, в поле Tag хранится добавляемое значение
oCalculator.InputDigit('0' + (char)((TWinControl*)Sender)->Tag);
// выводим текущее значение ввода
STValue->Caption = oCalculator.Print();
}
//---------------------------------------------------------------------------
void __fastcall TMForm::OnAdd3Zero(TObject *Sender){
// добавляем три нуля справа
oCalculator.InputDigit('0');
oCalculator.InputDigit('0');
oCalculator.InputDigit('0');
// выводим текущее значение ввода
STValue->Caption = oCalculator.Print();
}
//---------------------------------------------------------------------------
void __fastcall TMForm::OnChangeFracState(TObject *Sender){
// меняем область ввода
oCalculator.Turn2Frac();
// показываем текущую область ввода
STFIntFrac->Caption = (oCalculator.InFrac)? "FRAC":"INT";
}
//---------------------------------------------------------------------------
void __fastcall TMForm::OnReturn(TObject *Sender){
// производим вычисления, если неыло ошибок, то показываем результат
MFile->Lines->Add("Второе число:"+STValue->Caption);
if(oCalculator.MakeReturn())
{
STValue->Caption = oCalculator.GetResult();
MFile->Lines->Add("Результат:"+STValue->Caption);
MFile->Lines->Add("");
}
else
// если есть ошибки, пкоазываем ошибку
STValue->Caption = "Ошибка!Проверьте входные данные";
// показываем текущую область ввода
STFIntFrac->Caption = (oCalculator.InFrac)? "FRAC":"INT";
}
//--------------------------------------------------------------------------
void __fastcall TMForm::OnOperation(TObject *Sender){
// задаем операцию для вычисления и выводим результат
MFile->Enabled=true;
MFile->Lines->Add("Первое число:"+STValue->Caption);
if ((ECalcOperation)((TWinControl*)Sender)->Tag==1)
{
MFile->Lines->Add("Операция: сложение");
Bplus->Enabled==false;
Bminus->Enabled==false;
Bymn->Enabled==false;
Bdelen->Enabled==false;
Boddelperem->Enabled==false;
};
if ((ECalcOperation)((TWinControl*)Sender)->Tag==2)
{
MFile->Lines->Add("Операция: вычитание");
Bplus->Enabled==false;
Bminus->Enabled==false;
Bymn->Enabled==false;
Bdelen->Enabled==false;
Boddelperem->Enabled==false;
};
if ((ECalcOperation)((TWinControl*)Sender)->Tag==3)
{
MFile->Lines->Add("Операция: умножение");
Bplus->Enabled==false;
Bminus->Enabled==false;
Bymn->Enabled==false;
Bdelen->Enabled==false;
Boddelperem->Enabled==false;
};
if ((ECalcOperation)((TWinControl*)Sender)->Tag==4)
{
MFile->Lines->Add("Операция: деление");
Bplus->Enabled==false;
Bminus->Enabled==false;
Bymn->Enabled==false;
Bdelen->Enabled==false;
Boddelperem->Enabled==false;
};
if(oCalculator.MakeOperation((ECalcOperation)((TWinControl*)Sender)->Tag))
{
STValue->Caption = oCalculator.GetResult();
}
else
// показываем ошибку, если операция не удалась
STValue->Caption = "Ошибка!Операция не может быть выполнена!";
// показываем текущую область ввода
STFIntFrac->Caption = (oCalculator.InFrac)? "FRAC":"INT";
}
//---------------------------------------------------------------------------
void __fastcall TMForm::OnTurnSign(TObject *Sender){
// меняем знак числа
oCalculator.TurnSign();
// выводим текущее значение ввода
STValue->Caption = oCalculator.Print();
}
//---------------------------------------------------------------------------
void __fastcall TMForm::CtrlCClick(TObject *Sender){
TClipboard* oClipBoard = Clipboard();
// копируем текущее выведенное значение в буфер обмена
oClipBoard->SetTextBuf(STValue->Caption.c_str());
}
//---------------------------------------------------------------------------
void __fastcall TMForm::CtrlVClick(TObject *Sender){
// принимаемое из буфера значение
char cClip[256] = {0};
// бегунок по принятой строке
char *pDigit = cClip;
TClipboard* oClipBoard = Clipboard();
// прием значения из буфера
oClipBoard->GetTextBuf(cClip, 255);
// проходим бегунком по принятой трочке
while(*pDigit){
// если хоть один символ будет неподходящим, обрываем операцию вставки
if(
(oCalculator.InFrac && ('.' == *pDigit))||
((0 > (int)(*pDigit - '0'))&&(9 < (int)(*pDigit - '0')))||
(!strchr(".0123456789",*pDigit))
) break;
// вставляем просто через псевдонажатие клавиши
FormKeyPress(this,*pDigit);
// смещаем бегунок далее
pDigit++;
};
}
//---------------------------------------------------------------------------
void __fastcall TMForm::FormKeyPress(TObject *Sender, char &Key){
switch(Key){
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':
// вводим цифру
oCalculator.InputDigit(Key);
// выводим текущее значение ввода
STValue->Caption = oCalculator.Print();
break;
case '.':
// меняем область ввода
oCalculator.Turn2Frac();
// выводим текущее значение ввода
STValue->Caption = oCalculator.Print();
break;
};
}
//---------------------------------------------------------------------------
void __fastcall TMForm::FormKeyUp(TObject *Sender, WORD &Key, TShiftState Shift){
switch(Key){
case VK_BACK: // клавиша Backspace
// удаляем цифру
oCalculator.RemoveDigit();
// выводим текущее значение ввода
STValue->Caption = oCalculator.Print();
// показываем текущую область ввода
STFIntFrac->Caption = (oCalculator.InFrac)? "FRAC":"INT";
break;
case VK_ADD: // '+'
if(oCalculator.MakeOperation(coAdd))
STValue->Caption = oCalculator.GetResult();
else
STValue->Caption = "Ошибка! Операция сложения не может быть вычислена!";
// показываем текущую область ввода
STFIntFrac->Caption = (oCalculator.InFrac)? "FRAC":"INT";
break;
case VK_SUBTRACT: // '-'
if(oCalculator.MakeOperation(coSub))
STValue->Caption = oCalculator.GetResult();
else
STValue->Caption = "Ошибка! Операция вычитания не может быть вычислена!";
// показываем текущую область ввода
STFIntFrac->Caption = (oCalculator.InFrac)? "FRAC":"INT";
break;
case VK_MULTIPLY: // '*'
if(oCalculator.MakeOperation(coMul))
STValue->Caption = oCalculator.GetResult();
else
STValue->Caption = "Ошибка! Операция умножения не может быть вычислена!";
// показываем текущую область ввода
STFIntFrac->Caption = (oCalculator.InFrac)? "FRAC":"INT";
break;
case VK_DIVIDE: // '/'
if(oCalculator.MakeOperation(coDiv))
STValue->Caption = oCalculator.GetResult();
else
STValue->Caption = "Ошибка! Операция Деления не может быть вычислена!";
// показываем текущую область ввода
STFIntFrac->Caption = (oCalculator.InFrac)? "FRAC":"INT";
break;
case VK_RETURN:
if(oCalculator.MakeReturn())
STValue->Caption = oCalculator.GetResult();
else
STValue->Caption = "Error...";
// показываем текущую область ввода
STFIntFrac->Caption = (oCalculator.InFrac)? "FRAC":"INT";
break;
};
}
//---------------------------------------------------------------------------
void __fastcall TMForm::NoProgrClick(TObject *Sender){
AboutForm->ShowModal();
}
//---------------------------------------------------------------------------
void __fastcall TMForm::NCloseClick(TObject *Sender)
{
Close();
}
//---------------------------------------------------------------------------
void __fastcall TMForm::SaveClick(TObject *Sender)
{
if (SaveFile->Execute())
MFile->Lines->SaveToFile(SaveFile->FileName);
}
//---------------------------------------------------------------------------