📄 compute1.~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 + -