您的位置:首页 > 编程语言 > Delphi

通过DELPHI实现计算器功能.

2009-07-02 22:11 417 查看
//--------------------------------------//
//---- 作者: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.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.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: