⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 bcdcalu.cpp

📁 条码控件: 一维条码控件 二维条码控件 PDF417Barcode MaxiCodeBarcode
💻 CPP
字号:
// ***** BEGIN LICENSE BLOCK *****
// * Version: MPL 1.1
// *
// * The contents of this file are subject to the Mozilla Public License Version
// * 1.1 (the "License"); you may not use this file except in compliance with
// * the License. You may obtain a copy of the License at
// * http://www.mozilla.org/MPL/
// *
// * Software distributed under the License is distributed on an "AS IS" basis,
// * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
// * for the specific language governing rights and limitations under the
// * License.
// *
// * The Original Code is TurboPower SysTools
// *
// * The Initial Developer of the Original Code is
// * TurboPower Software
// *
// * Portions created by the Initial Developer are Copyright (C) 1996-2002
// * the Initial Developer. All Rights Reserved.
// *
// * Contributor(s):
// *
// * ***** END LICENSE BLOCK *****
//---------------------------------------------------------------------------
#include <vcl\vcl.h>
#pragma hdrstop

#include "BcdCalU.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma link "StBcd"
#pragma link "StStrL"

#pragma resource "*.dfm"
TBCDCalcDlg *BCDCalcDlg;
//---------------------------------------------------------------------------
__fastcall TBCDCalcDlg::TBCDCalcDlg(TComponent* Owner)
	: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TBCDCalcDlg::FormCreate(TObject *Sender)
{
  Memo1->Lines->Strings[0] = "";
  PendOp = 0;
  DFHold = 0;
  XBuffer = "0";
  ClearOnNext = false;
}
//---------------------------------------------------------------------------
extern System::AnsiString __fastcall BytesToString(char * Value, Cardinal Size)
{
  Cardinal Index;
  String S, Res;

  Res.SetLength(2*Size);

  for (Cardinal I = 1; I <= Size; I++) {
    Index = I*2;
    S = HexBL(Value[I-1]);

    Res[(Index)-1] = S[1];
    Res[Index] = S[2];
  };

  return Res;
}
//---------------------------------------------------------------------------
void __fastcall TBCDCalcDlg::FormKeyPress(TObject *Sender, char &Key)
{
  char HldOp;
  int L;
  TBcd BCD1;
  String S;

  if (Key == 13) {
    if (XBuffer == "0") {
      XBuffer = Memo1->Lines->Strings[0];
    }
    else {
      EqualBtnClick(Sender);
      XBuffer = "0";
    };
    Key = 0;
    ClearOnNext = true;
  };

  if (BCDChar.Contains(Key)) {
    if (Key == 'p') {
      S = Memo1->Lines->Strings[0];
      if (S[1] != '-') {
        S.Insert('-', 1);
      }
      else {
        S.Delete(1, 1);
      }
      Memo1->Lines->Strings[0] = S;
      ValBcd_C(S, BCD1);
      BCDString->Text = BytesToString((char *)BCD1, sizeof(BCD1));
      Key = 0;
    }
    else {
      if (ClearOnNext) {
        Memo1->Lines->Strings[0] = "";
        ClearOnNext = false;
      };
    };
  };

  if (BCDOper.Contains(Key)) {
    if ((Key != 's') && (Key != 'e') && (Key != 'l')) {
      if (Memo1->Lines->Strings[0] == "") {
        Memo1->Lines->Strings[0] = "0";
      };
      if (XBuffer != "0") {
        EqualBtnClick(Sender);
      }
      XBuffer = Memo1->Lines->Strings[0];
      ValBcd_C(XBuffer, BCD1);
      BCDString->Text = BytesToString((char *)BCD1, sizeof(BCD1));
      PendOp = Key;
      Key = 0;
      ClearOnNext = true;
    }
    else {
      HldOp = PendOp;
      PendOp = Key;
      EqualBtnClick(Sender);
      PendOp = HldOp;
      Key = 0;
    };
  };

  if (BCDChar.Contains(Key)) {
    S = Memo1->Lines->Strings[0];
    L = S.Length();
    if (L < Memo1->MaxLength) {
      Memo1->Lines->Strings[0] = S + Key;
    };
    Key = 0;
  };
  Memo1->SetFocus();
  Memo1->SelStart = Memo1->Text.Length();
  Memo1->SelLength = 0;
}
//---------------------------------------------------------------------------
void __fastcall TBCDCalcDlg::ClearBtnClick(TObject *Sender)
{
  XBuffer = "0";
  Memo1->Lines->Strings[0] = "0";
  BCDString->Text = "";
  PendOp = 0;
  ClearOnNext = true;
}
//---------------------------------------------------------------------------
void __fastcall TBCDCalcDlg::ClearEntryBtnClick(TObject *Sender)
{
  Memo1->Lines->Strings[0] = '0';
  ClearOnNext = true;
}
//---------------------------------------------------------------------------
void __fastcall TBCDCalcDlg::SevenKeyClick(TObject *Sender)
{
  char c = '7';
  FormKeyPress(Sender, c);
}
//---------------------------------------------------------------------------
void __fastcall TBCDCalcDlg::EightKeyClick(TObject *Sender)
{
  char c = '8';
  FormKeyPress(Sender, c);
}
//---------------------------------------------------------------------------
void __fastcall TBCDCalcDlg::NineKeyClick(TObject *Sender)
{
  char c = '9';
  FormKeyPress(Sender, c);
}
//---------------------------------------------------------------------------
void __fastcall TBCDCalcDlg::FourKeyClick(TObject *Sender)
{
  char c = '4';
  FormKeyPress(Sender, c);
}
//---------------------------------------------------------------------------
void __fastcall TBCDCalcDlg::FiveKeyClick(TObject *Sender)
{
  char c = '5';
  FormKeyPress(Sender, c);
}
//---------------------------------------------------------------------------
void __fastcall TBCDCalcDlg::SixKeyClick(TObject *Sender)
{
  char c = '6';
  FormKeyPress(Sender, c);
}
//---------------------------------------------------------------------------
void __fastcall TBCDCalcDlg::OneKeyClick(TObject *Sender)
{
  char c = '1';
  FormKeyPress(Sender, c);
}
//---------------------------------------------------------------------------
void __fastcall TBCDCalcDlg::TwoKeyClick(TObject *Sender)
{
  char c = '2';
  FormKeyPress(Sender, c);
}
//---------------------------------------------------------------------------
void __fastcall TBCDCalcDlg::ThreeKeyClick(TObject *Sender)
{
  char c = '3';
  FormKeyPress(Sender, c);
}
//---------------------------------------------------------------------------
void __fastcall TBCDCalcDlg::ZeroBtnClick(TObject *Sender)
{
  char c = '0';
  FormKeyPress(Sender, c);
}
//---------------------------------------------------------------------------
void __fastcall TBCDCalcDlg::DecKeyClick(TObject *Sender)
{
  FormKeyPress(Sender, DecimalSeparator);
}
//---------------------------------------------------------------------------
void __fastcall TBCDCalcDlg::PlusMinusBtnClick(TObject *Sender)
{
  char c = 'p';
  FormKeyPress(Sender, c);
}
//---------------------------------------------------------------------------
void __fastcall TBCDCalcDlg::AddBtnClick(TObject *Sender)
{
  char c = '+';
  FormKeyPress(Sender, c);
}
//---------------------------------------------------------------------------
void __fastcall TBCDCalcDlg::SubBtnClick(TObject *Sender)
{
  char c = '-';
  FormKeyPress(Sender, c);
}
//---------------------------------------------------------------------------
void __fastcall TBCDCalcDlg::MulBtnClick(TObject *Sender)
{
  char c = '*';
  FormKeyPress(Sender, c);
}
//---------------------------------------------------------------------------
void __fastcall TBCDCalcDlg::DivBtnClick(TObject *Sender)
{
  char c = '/';
  FormKeyPress(Sender, c);
}
//---------------------------------------------------------------------------
void __fastcall TBCDCalcDlg::SqrtBtnClick(TObject *Sender)
{
  char c = 's';
  FormKeyPress(Sender, c);
}
//---------------------------------------------------------------------------
void __fastcall TBCDCalcDlg::ExpBtnClick(TObject *Sender)
{
  char c = 'e';
  FormKeyPress(Sender, c);
}
//---------------------------------------------------------------------------
void __fastcall TBCDCalcDlg::LnBtnClick(TObject *Sender)
{
  char c = 'l';
  FormKeyPress(Sender, c);
}
//---------------------------------------------------------------------------
void __fastcall TBCDCalcDlg::XtoYBtnClick(TObject *Sender)
{
  char c = '^';
  FormKeyPress(Sender, c);
}
//---------------------------------------------------------------------------
void __fastcall TBCDCalcDlg::EqualBtnClick(TObject *Sender)
{
  Extended RV;
  String S;
  TBcd BCD;

  if (PendOp != 0) {
    S = Memo1->Lines->Strings[0];
    if (S == "") {
      MessageBeep(0);
      return;
    };
    
    switch (PendOp) {
      case '+' : {
        RV = StrToFloat(XBuffer) + StrToFloat(S);
        Memo1->Lines->Strings[0] = FloatToStr(RV);
        ValBcd_C(Memo1->Lines->Strings[0], BCD);
        BCDString->Text = BytesToString((char *)BCD, sizeof(BCD));
        break;
      };
      case '-' : {
        RV = StrToFloat(XBuffer) - StrToFloat(S);
        Memo1->Lines->Strings[0] = FloatToStr(RV);
        ValBcd_C(Memo1->Lines->Strings[0], BCD);
        BCDString->Text = BytesToString((char *)BCD, sizeof(BCD));
        break;
      };
      case '*' : {
        RV = StrToFloat(XBuffer) * StrToFloat(S);
        Memo1->Lines->Strings[0] = FloatToStr(RV);
        ValBcd_C(Memo1->Lines->Strings[0], BCD);
        BCDString->Text = BytesToString((char *)BCD, sizeof(BCD));
        break;
      };
      case '/' : {
        RV = StrToFloat(S);
        if (RV == 0) {
          Memo1->Lines->Strings[0] = "Divide by zero error";
          PendOp = 0;
          ClearOnNext = false;
        }
        else {
          RV = StrToFloat(XBuffer) / StrToFloat(S);
          Memo1->Lines->Strings[0] = FloatToStr(RV);
          ValBcd_C(Memo1->Lines->Strings[0], BCD);
          BCDString->Text = BytesToString((char *)BCD, sizeof(BCD));
        };
        break;
      };
      case 's' : {
        RV = sqrt(StrToFloat(S));
        Memo1->Lines->Strings[0] = FloatToStr(RV);
        ValBcd_C(Memo1->Lines->Strings[0], BCD);
        BCDString->Text = BytesToString((char *)BCD, sizeof(BCD));
        break;
      };
      case 'e' : {
        RV = exp(StrToFloat(S));
        Memo1->Lines->Strings[0] = FloatToStr(RV);
        ValBcd_C(Memo1->Lines->Strings[0], BCD);
        BCDString->Text = BytesToString((char *)BCD, sizeof(BCD));
        break;
      };
      case 'l' : {
        RV = log(StrToFloat(S));
        Memo1->Lines->Strings[0] = FloatToStr(RV);
        ValBcd_C(Memo1->Lines->Strings[0], BCD);
        BCDString->Text = BytesToString((char *)BCD, sizeof(BCD));
        break;
      };
      case '^' : {
        RV = exp(log(StrToFloat(XBuffer)) * StrToFloat(S));
        Memo1->Lines->Strings[0] = FloatToStr(RV);
        ValBcd_C(Memo1->Lines->Strings[0], BCD);
        BCDString->Text = BytesToString((char *)BCD, sizeof(BCD));
        break;
      };
    };
  };

  PendOp = 0;
  ClearOnNext = true;
  Memo1->SetFocus();
  Memo1->SelStart = 0;
  Memo1->SelLength = 0;
}
//---------------------------------------------------------------------------
void __fastcall TBCDCalcDlg::Copy1Click(TObject *Sender)
{
  Memo1->SelectAll();
  Memo1->CopyToClipboard();
  Memo1->SelStart = 0;
}
//---------------------------------------------------------------------------
void __fastcall TBCDCalcDlg::Paste1Click(TObject *Sender)
{
  String S = "";
  String Nums = "";
  bool IsNeg = false;
  S = Clipboard()->AsText;
  Nums = "0123456789";
  Nums = Nums + Sysutils::DecimalSeparator;
  if (S[1] == '-') {
    IsNeg = true;
    S = S.SubString(2, S.Length() - 1);
  }

  if (IsStrNumericL(S, Nums)) {
    if (IsNeg) {
     S = "-" + S;
    }
    Memo1->Lines->Strings[0] = S;
  }
}
//---------------------------------------------------------------------------
void __fastcall TBCDCalcDlg::BSBtnClick(TObject *Sender)
{
  Memo1->Lines->Strings[0] = Memo1->Lines->Strings[0].SubString(1, Memo1->Lines->Strings[0].Length() - 1);
  if (Memo1->Lines->Strings[0].Length() == 0)
    ClearBtnClick(ClearBtn);
}
//---------------------------------------------------------------------------
void __fastcall TBCDCalcDlg::FormShow(TObject *Sender)
{
  BCDChar << '0' << '1' << '2' << '3' << '4' << '5' << '6' << '7' << '8' << '9' << DecimalSeparator << 'p';
  BCDOper << '+' << '-' << '/' << '*' << '^' << 'e' << 'l' << 's' << '=';
  
}
//---------------------------------------------------------------------------

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -