//--------------------------------------------------------------------------- #include #pragma hdrstop #include "Calc_F.h" //--------------------------------------------------------------------------- #pragma link "RzBtnEdt" #pragma link "RzEdit" #pragma package(smart_init) #pragma link "RzButton" #pragma resource "*.dfm" TCalcForm *CalcForm; //--------------------------------------------------------------------------- __fastcall TCalcForm::TCalcForm(TComponent* Owner) : TForm(Owner) { // ÃʱâÈ­ bFirst = true; bOperator = true; noCurrent = no_None; rzbtnedDisplay = NULL; strStored = "0"; strCurrent = "0"; } //--------------------------------------------------------------------------- void __fastcall TCalcForm::FormDestroy(TObject *Sender) { rzbtnedDisplay->SelectAll(); rzbtnedDisplay = NULL; } //--------------------------------------------------------------------------- void __fastcall TCalcForm::InitForm(TRzButtonEdit *RzButton) { TPoint Pos; rzbtnedDisplay = dynamic_cast(RzButton); if (rzbtnedDisplay) { // À§Ä¡ ¼³Á¤ strCurrent = rzbtnedDisplay->Text; Pos = RzButton->ClientToScreen(TPoint(rzbtnedDisplay->BoundsRect.Left, rzbtnedDisplay->BoundsRect.Top)); Left = Pos.x - rzbtnedDisplay->Left; Top = Pos.y - rzbtnedDisplay->Top + rzbtnedDisplay->Height; UpdateDisplay(); } else { Close(); } } //--------------------------------------------------------------------------- void __fastcall TCalcForm::UpdateDisplay() { double dCurrent; if (rzbtnedDisplay) { try { dCurrent = strCurrent.ToDouble(); // 00, 01 ó·³ 0°ú ½Ç¼ö ¿Ü¿¡ 0À¸·Î ½ÃÀÛÇÏ´Â ¼ö¸¦ ÀԷ¹ÞÁö ¾Êµµ·Ï ÇÑ´Ù if (dCurrent == 0 && strCurrent.Pos(".") == 0) { strCurrent = "0"; } else if (strCurrent.Pos(".") == 0) { strCurrent = FloatToStrF(dCurrent, ffGeneral, 10, 10); } } catch (...) { dCurrent = 0; strStored = "0"; strCurrent = "0"; bFirst = true; noCurrent = no_None; return; } rzbtnedDisplay->Text = strCurrent; rzbtnedDisplay->Repaint(); } } //--------------------------------------------------------------------------- void __fastcall TCalcForm::btnNumClick(TObject *Sender) { TRzButton *btnClickButton = NULL; btnClickButton = dynamic_cast(Sender); if (btnClickButton) { if (bOperator == true) { // ÃʱâÈ­ strCurrent = ""; bOperator = false; } if (noCurrent != no_None) { bFirst = false; } if (strCurrent.Length() < 10) { // 10ÀÚ¸® ÀÌÇϸ¸ ÀÔ·Â ¹Þ´Â´Ù strCurrent += btnClickButton->Caption; } } UpdateDisplay(); } //--------------------------------------------------------------------------- void __fastcall TCalcForm::btnDotClick(TObject *Sender) { TRzButton *btnClickButton = NULL; double dCurrent; btnClickButton = dynamic_cast(Sender); if (btnClickButton) { // ½Ç¼öÀÎÁö È®ÀÎÇÏ¿© '.'À» 2°³ ÀÌ»ó ÀԷ¹ÞÁö ¾Ê´Â´Ù if (strCurrent.Pos(".") == 0) { strCurrent += "."; } } UpdateDisplay(); } //--------------------------------------------------------------------------- void __fastcall TCalcForm::btnOperatorClick(TObject *Sender) { double dStored, dCurrent; TRzButton *btnClickButton = NULL; try { dStored = strStored.ToDouble(); dCurrent = strCurrent.ToDouble(); } catch (...) { dStored = 0; dCurrent = 0; strStored = "0"; strCurrent = "0"; bFirst = true; noCurrent = no_None; return; } btnClickButton = dynamic_cast(Sender); if (btnClickButton) { // óÀ½ ÀԷ¹ÞÀ» °æ¿ì dStored °ª¿¡ ÇöÀç °ªÀ» º¹»çÇÑ´Ù // 0À» ³ÖÀ¸¸é °ö¼ÀÀ̳ª ³ª´°¼ÀÀÌ µÇÁö ¾ÊÀ¸¹Ç·Î ÀÌ·¸°Ô ó¸®ÇÑ´Ù if (bFirst == true) { dStored = dCurrent; } else { try { // Áß°£ °è»êÀ» ÇÑ´Ù switch (noCurrent) { case no_Add: dStored = dStored + dCurrent; break; case no_Sub: dStored = dStored - dCurrent; break; case no_Mul: dStored = dStored * dCurrent; break; case no_Div: if (dCurrent != 0) { // '0'À¸·Î ³ª´©Áö ¾Êµµ·Ï ¹æÁö dStored = dStored / dCurrent; } else { dStored = 0; } break; } } catch (...) { dStored = 0; dCurrent = 0; strStored = "0"; strCurrent = "0"; bFirst = true; noCurrent = no_None; return; } } // ÇöÀç ¿¬»êÀÚ¸¦ ±â·ÏÇØµÎ¾î¾ß °á°ú¸¦ ¾òÀ» ¶§ ¸¶Áö¸·À¸·Î Çѹø ´õ °è»êÇÑ´Ù if (btnClickButton->Caption == "+") { noCurrent = no_Add; } else if (btnClickButton->Caption == "-") { noCurrent = no_Sub; } else if (btnClickButton->Caption == "*") { noCurrent = no_Mul; } else if (btnClickButton->Caption == "/") { noCurrent = no_Div; } strStored = FloatToStrF(dStored, ffGeneral, 10, 10); bOperator = true; } } //--------------------------------------------------------------------------- void __fastcall TCalcForm::btnPosNegClick(TObject *Sender) { double dCurrent; try { dCurrent = strCurrent.ToDouble(); } catch (...) { dCurrent = 0; strStored = "0"; strCurrent = "0"; bFirst = true; noCurrent = no_None; return; } if (dCurrent >= 0) { strCurrent = "-" + strCurrent; } else { strCurrent = strCurrent.SubString(2, strCurrent.Length()-1); } UpdateDisplay(); } //--------------------------------------------------------------------------- void __fastcall TCalcForm::btnClearClick(TObject *Sender) { strStored = "0"; strCurrent = "0"; bFirst = true; noCurrent = no_None; UpdateDisplay(); } //--------------------------------------------------------------------------- void __fastcall TCalcForm::btnBackSpaceClick(TObject *Sender) { TRzButton *btnClickButton = NULL; btnClickButton = dynamic_cast(Sender); if (btnClickButton && strCurrent.Length() > 1) { strCurrent = strCurrent.SubString(1, strCurrent.Length()-1); } else { strCurrent = "0"; } UpdateDisplay(); } //--------------------------------------------------------------------------- void __fastcall TCalcForm::btnResultClick(TObject *Sender) { double dStored, dCurrent; try { dStored = strStored.ToDouble(); dCurrent = strCurrent.ToDouble(); } catch (...) { dStored = 0; dCurrent = 0; strStored = "0"; strCurrent = "0"; bFirst = true; noCurrent = no_None; return; } try { // ¿¬»êÀÚ¿¡ µû¶ó °á°ú °ªÀ» °è»êÇÑ´Ù switch (noCurrent) { case no_None: Close(); return; case no_Add: dStored = dStored + dCurrent; break; case no_Sub: dStored = dStored - dCurrent; break; case no_Mul: dStored = dStored * dCurrent; break; case no_Div: if (dCurrent != 0) { // '0'À¸·Î ³ª´©Áö ¾Êµµ·Ï ¹æÁö dStored = dStored / dCurrent; } else { dStored = 0; } break; } } catch (...) { dStored = 0; dCurrent = 0; strStored = "0"; strCurrent = "0"; bFirst = true; noCurrent = no_None; return; } strCurrent = FloatToStrF(dStored, ffGeneral, 10, 10); strStored = "0"; bFirst = true; noCurrent = no_None; UpdateDisplay(); Close(); } //--------------------------------------------------------------------------- void __fastcall TCalcForm::FormKeyDown(TObject *Sender, WORD &Key, TShiftState Shift) { switch (Key) { case '0': case VK_NUMPAD0: btn0->Click(); break; case '1': case VK_NUMPAD1: btn1->Click(); break; case '2': case VK_NUMPAD2: btn2->Click(); break; case '3': case VK_NUMPAD3: btn3->Click(); break; case '4': case VK_NUMPAD4: btn4->Click(); break; case '5': case VK_NUMPAD5: btn5->Click(); break; case '6': case VK_NUMPAD6: btn6->Click(); break; case '7': case VK_NUMPAD7: btn7->Click(); break; case '8': case VK_NUMPAD8: if (Shift.Contains(ssShift) == false) { btn8->Click(); } break; case '9': case VK_NUMPAD9: btn9->Click(); break; case VK_ADD: btnAdd->Click(); break; case VK_SUBTRACT: btnSub->Click(); break; case VK_MULTIPLY: btnMul->Click(); break; case VK_DIVIDE: btnDiv->Click(); break; case '.': case VK_DECIMAL: btnDot->Click(); break; case 'C': btnClear->Click(); break; case VK_ESCAPE: Close(); break; case VK_BACK: btnBackSpace->Click(); break; case '=': case VK_RETURN: btnResult->Click(); break; } // À§ÀÇ Å° °ª°ú Áߺ¹µÇÁö ¾Ê´Â´Ù if (Shift.Contains(ssShift) == true && Key == 187) { // + btnAdd->Click(); } else if (Shift.Contains(ssShift) == false && Key == 189) { // - btnSub->Click(); } else if (Shift.Contains(ssShift) == true && Key == 56) { // * btnMul->Click(); } else if (Shift.Contains(ssShift) == false && Key == 191) { // / btnDiv->Click(); } else if (Shift.Contains(ssShift) == false && Key == 190) { // . btnDot->Click(); } else if (Shift.Contains(ssShift) == false && Key == 187 ) { // = btnResult->Click(); } } //--------------------------------------------------------------------------- void __fastcall TCalcForm::FormStartDock(TObject *Sender, TDragDockObject *&DragObject) { TPoint Pos; // ¸¶¿ì½º·Î À̵¿ÇÒ ¼ö ¾øµµ·Ï À§Ä¡¸¦ °íÁ¤½ÃŲ´Ù if (rzbtnedDisplay) { Pos = rzbtnedDisplay->ClientToScreen(TPoint(rzbtnedDisplay->BoundsRect.Left, rzbtnedDisplay->BoundsRect.Top)); Left = Pos.x - rzbtnedDisplay->Left; Top = Pos.y - rzbtnedDisplay->Top + rzbtnedDisplay->Height; UpdateDisplay(); } } //--------------------------------------------------------------------------- void __fastcall TCalcForm::FormEndDock(TObject *Sender, TObject *Target, int X, int Y) { TPoint Pos; // ¸¶¿ì½º·Î À̵¿ÇÒ ¼ö ¾øµµ·Ï À§Ä¡¸¦ °íÁ¤½ÃŲ´Ù if (rzbtnedDisplay) { Pos = rzbtnedDisplay->ClientToScreen(TPoint(rzbtnedDisplay->BoundsRect.Left, rzbtnedDisplay->BoundsRect.Top)); Left = Pos.x - rzbtnedDisplay->Left; Top = Pos.y - rzbtnedDisplay->Top + rzbtnedDisplay->Height; UpdateDisplay(); } } //---------------------------------------------------------------------------