Содержимое файла MUnit.cpp




Текст программы с комментариями

Содержимое файла 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);

}

//---------------------------------------------------------------------------

 



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2016-04-11 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: