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

📄 compute1.~pas

📁 是模仿windows中的计算器而制作的一个小程序.
💻 ~PAS
字号:
//--------------------------------------//
//----     开发人: lywang         ---- //
//----     开发日期:2007/07/18    -----//
//----     功能:实现简单计算器功能-----//
//--------------------------------------//

unit Compute1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Menus, StdCtrls, Buttons, ExtCtrls;

type
  TForm1 = class(TForm)
    MainMenu1: TMainMenu;
    E1: TMenuItem;
    V1: TMenuItem;
    H1: TMenuItem;
    C1: TMenuItem;
    P1: TMenuItem;
    N1: TMenuItem;
    N2: TMenuItem;
    N3: TMenuItem;
    I1: TMenuItem;
    H2: TMenuItem;
    A1: TMenuItem;
    N4: TMenuItem;
    EdtResult: TEdit;
    BitBtn2: TBitBtn;
    BitBtn3: TBitBtn;
    Panel1: TPanel;
    Panel2: TPanel;
    BBtn7: TBitBtn;
    BBtn8: TBitBtn;
    BBtn9: TBitBtn;
    BBtn4: TBitBtn;
    BBtn5: TBitBtn;
    BBtn6: TBitBtn;
    BBtn1: TBitBtn;
    BBtn2: TBitBtn;
    BBtn3: TBitBtn;
    BBtn0: TBitBtn;
    BBtnZ: TBitBtn;
    BBtnD: TBitBtn;
    BBtnCh: TBitBtn;
    BBtnC: TBitBtn;
    BBtnJian: TBitBtn;
    BBtnJia: TBitBtn;
    BBtnDY: TBitBtn;
    BBtnM: TBitBtn;
    BBtnMS: TBitBtn;
    BBtnMR: TBitBtn;
    BBtnMC: TBitBtn;
    BBtnSqrt: TBitBtn;
    BBtnBF: TBitBtn;
    BBtnFZ: TBitBtn;
    Panel3: TPanel;
    BBtnBack: TBitBtn;
    procedure FormCreate(Sender: TObject);
    procedure BBtnBackClick(Sender: TObject);
    procedure BBtn1Click(Sender: TObject);
    procedure BBtnJiaClick(Sender: TObject);
    procedure BBtnDClick(Sender: TObject);
    procedure BBtnZClick(Sender: TObject);
    procedure BBtnSqrtClick(Sender: TObject);
    procedure BBtnDYClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }

  end;

var
  Form1: TForm1;
implementation

var
  num1 : Extended;  //第一位操作数
  num2 : Extended;   //第二位操作数
  result : Extended; //运算结果
  BShu : Boolean;  //用于控制按数字按钮时的操作
  BCao : Boolean; //用于控制按操作按钮时的操作
  QCao : Integer; //用作判断按'='前的操作
  Zhen : Boolean; //判断数字的正负,以用于'+/-'操作
  LianY : Boolean; //判断是否连续按操作符
  LianD : Boolean; //判断是否连续按等号操作符
  Yun : Boolean;  //判断等号前时候有运算符
  Yun1 : Boolean; //辅助判断等号前时候有运算符

{$R *.dfm}

//Procedure SetEnable(Sender:Object);
//begin
//  Panel2.Enabled := false;
//end;


procedure   TForm1.WMSysCommand(var   Msg:   TWMSysCommand);
  begin   
    if   (Msg.CmdType   =   SC_MAXIMIZE)   Then   
          msg.Result:=0   
    Else   
        DefaultHandler(Msg);   
  end; 


procedure TForm1.FormCreate(Sender: TObject);
//按下C、CE键时,也运行TFrom1.FormCreate初始化操作
begin
   //设置显示结果的EdtResult的Text在右边对齐
   SetWindowLong(EdtResult.Handle,GWL_STYLE,
     GetWindowLong(EdtResult.Handle,GWL_STYLE) or ES_RIGHT);
   EdtResult.Text := '0';
   //初始化操作数字
   num1 := 0;
   num2 := 0;
   result := 0;
   BCao := false;
   BShu := false;
   QCao := 0;
   Zhen := true;
   LianY := false;
   LianD := false;
   Yun := false;
   Panel2.Enabled := true;
   Panel3.Enabled := true;
end;

procedure TForm1.BBtnBackClick(Sender: TObject);
// 按键 'Backspace'的方法
begin
  LianD := false;
//  ShowMessage(IntToStr(Length(EdtResult.Text)));
  if Length(EdtResult.Text) <> 1 then
  begin  //当不是只剩下一位数时,显示结果最后一位被删除
    EdtResult.Text := Copy(EdtResult.Text, 1, Length(EdtResult.Text)-1)
  end
  else if StrToFloat(EdtResult.Text) <> 0 then
  begin  //显示结果剩下一位数,且显示不等于0时,返回0
    EdtResult.Text := '0';
  end;
  LianY := false;
end;

procedure TForm1.BBtn1Click(Sender: TObject);
//按0-9数字按钮过程
begin
  //按数字键,显示数字键上的数字
  if Yun1 = false then
    Yun := false;
  if BShu = false then
  begin
    if EdtResult.Text <> '0' then
        EdtResult.Text := EdtResult.Text + TBitBtn(Sender).Caption
    else
        EdtResult.Text := TButton(Sender).Caption;
  end  //if
  else
  begin
    EdtResult.Text := TButton(Sender).Caption;
    BShu := false;
  end; //else
  LianY := false;
  LianD := false;
end;

procedure TForm1.BBtnJiaClick(Sender: TObject);
// 按+、-、*、/运算符按钮过程
begin
  BShu := true;
  Yun := true;
  Yun1 := true;
  if BCao = false then  //判断当前EdtResult的值赋给num1还是num2
                        //当BCao = false时,赋值给num1,否则赋给num2
  begin
    num1 := StrToFloat(EdtResult.Text);
    BShu := true;
    BCao := true;
    QCao := TBitBtn(Sender).Tag;
  end // if BCao = false
  else if LianY = false then  //连续按预算符情况
  begin
    case QCao of
      1:   //加法情况
      begin
        num2 := StrToFloat(EdtResult.Text);
        result := num1 + num2;
        EdtResult.Text := FloatToStr(result);
        num1 := result;
        BShu := true;
        QCao := 1;
      end; //1
      2:  //减号情况
      begin
        num2 := StrToFloat(EdtResult.Text);
        result := num1 - num2;
        EdtResult.Text := FloatToStr(result);
        num1 := result;
        BShu := true;
        QCao := 2;
      end; //2
      3:  //乘号情况
      begin
        num2 := StrToFloat(EdtResult.Text);
        result := num1 * num2;
        EdtResult.Text := FloatToStr(result);
        num1 := result;
        BShu := true;
        QCao := 3;
      end; //3
      4:   //除法情况
      begin
        num2 := StrToFloat(EdtResult.Text);
        if num2 <> 0 then
        begin
          result := num1 / num2;
          EdtResult.Text := FloatToStr(result);
          num1 := result;
          BShu := true;
        end //if num2 <> 0
        else
        begin
          EdtResult.Text := '除数不能为0';
          Panel2.Enabled := false;
          Panel3.Enabled := false;
        end; //if num2 <> 0 ... else
      end; //4
    end; //case of
  end; // if LianY = false
  LianY := true;
  QCao := TBitBtn(Sender).Tag;
  
end;

procedure TForm1.BBtnDClick(Sender: TObject);
//'.'按钮处理方法
begin
  LianD := false;
  if Pos('.', EdtResult.Text) = 0 then
  begin
    EdtResult.Text := EdtResult.Text + '.';
  end;
end;

procedure TForm1.BBtnZClick(Sender: TObject);
//运算符'+/-'运算方法
begin
  LianD := false;
  if (EdtResult.Text <> '0') and (Zhen = true) then
  begin
    EdtResult.Text := '-' + EdtResult.Text;
    Zhen := false;
  end
  else if Zhen = false then
  begin
  //如果为负数了,则再次按'+/-'时取消前面的'-'
    EdtResult.Text :=Copy(EdtResult.Text, 2, Length(EdtResult.Text)-1);
    Zhen := true;
  end;
end;

procedure TForm1.BBtnSqrtClick(Sender: TObject);
//为了函数清晰,把运算符sqrt、%、1/x跟其他运算符分开
begin
  LianD := false;
  BShu := True;
  case TBitBtn(Sender).Tag of
    2:   // 'sqrt'运算符情况
    begin
      if Pos('-', EdtResult.Text) <> 0 then  //负数情况
      begin
        EdtResult.Text := '函数输入无效';
        Panel2.Enabled := false;
        Panel3.Enabled := false;
      end
      else  //正数情况
      begin
        num1 := StrToFloat(EdtResult.Text);
        num1 := Sqrt(num1);
        EdtResult.Text := FloatToStr(num1);
      end;
    end;   //2
    3:   //'%'运算符情况
    begin
      EdtResult.Text := '0';  //不清楚'%'的作用
      num1 := StrToFloat(EdtResult.Text);
    end;  //3
    4:   // '1/x'运算符情况
    begin
      if EdtResult.Text = '0' then  //分母为0时
      begin
        EdtResult.Text := '除数不能为0';
        Panel2.Enabled := false;
        Panel3.Enabled := false;
      end //if EdtResult.Text = '0'
      else
      begin
        num1 := StrToFloat(EdtResult.Text);
        result := 1 / num1;
        EdtResult.Text := FloatToStr(result);
      end; // if EdtResult.Text = '0' ... else
    end;  //4

  end;  //case
  QCao := 0; //用于控制连续按 '='
end;

procedure TForm1.BBtnDYClick(Sender: TObject);
// '='运算符的方法
begin
  if Yun = false then
  //如果直接按等号,不执行任何操作
  else
  begin

    if LianD = false then
    begin
      num2 := StrToFloat(EdtResult.Text);
    end;
//  LianD := true;  //连续按等号,不在对num2进行赋值,让它一直等于原数

    case QCao of  //判断前面运算符是[+,-,*,/]中的哪个
      1:
      begin
        result := num1 + num2;
        EdtResult.Text := FloatToStr(result);
      end;  //1
      2:
      begin
        result := num1 - num2;
        EdtResult.Text := FloatToStr(result);
      end;  //2
      3:
      begin
        result := num1 * num2;
        EdtResult.Text := FloatToStr(result);
      end;  //3
      4:
      begin
        if num2 = 0 then
        begin
          EdtResult.Text := '除数不能为0';
          Panel2.Enabled := false;
          Panel3.Enabled := false;
        end  //if num2 = 0
        else
        begin
          result := num1 / num2;
          num1 := result;
          EdtResult.Text := FloatToStr(result);
        end;  //else
      end;  //4
    end;
    LianD := true;   //判断连续按了等号
    num1 := result;
    LianY := False;  //连续按运算符为假
  end;  //if Yun = false ..else

  BShu := true;
  BCao := false;   //判断下一个输入数赋值给num1
  Yun1 := false;    //为按等号前是否有运算符作判断

end;

end.

⌨️ 快捷键说明

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