unit Unit1;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, Forms, Controls, Graphics, Dialogs, StdCtrls, ExtCtrls,
Menus, DividerBevel;
type
{ TForm1 }
TForm1 = class(TForm)
Bevel1: TBevel;
Button1: TButton;
Button10: TButton;
Button11: TButton;
Button12: TButton;
Button13: TButton;
Button14: TButton;
Button15: TButton;
Button16: TButton;
Button17: TButton;
Button2: TButton;
Button3: TButton;
Button4: TButton;
Button5: TButton;
Button6: TButton;
Button7: TButton;
Button8: TButton;
Button9: TButton;
DividerBevel1: TDividerBevel;
Edit1: TEdit;
Edit2: TEdit;
Edit3: TEdit;
Edit4: TEdit;
Label1: TLabel;
Label2: TLabel;
MainMenu1: TMainMenu;
Memo1: TMemo;
MenuItem1: TMenuItem;
MenuItem2: TMenuItem;
MenuItem3: TMenuItem;
MenuItem5: TMenuItem;
MenuItem6: TMenuItem;
procedure Button10Click(Sender: TObject);
procedure Button12Click(Sender: TObject);
procedure Button13Click(Sender: TObject);
procedure Button16Click(Sender: TObject);
procedure Button17Click(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
public
end;
var
Form1: TForm1;
A: Double; // 0-10 按键(实数型)
B: Double; // {BANNED}中国第一次输入数字,没有点任何计算符时
C: Char; // 计算符
D: Double; // 第二次输入数字,已经点击过计算符
F: Double; // 计算结果
G: Double; // 代表已经有 计算结果
H: Double; // Memo1 结果追加新数值 用的
implementation
{$R *.lfm}
{ TForm1 }
procedure TForm1.FormCreate(Sender: TObject);
begin
// 窗体 始终置顶
form1.FormStyle := fsSystemStayOnTop;
//限制窗体{BANNED}最佳大/{BANNED}最佳小 宽度和高度
form1.Constraints.MaxHeight := Height;
form1.Constraints.MinHeight := Height;
form1.Constraints.MaxWidth := Width;
form1.Constraints.MinWidth := Width;
// 禁止 窗体{BANNED}最佳大化
form1.BorderIcons := form1.BorderIcons - [biMaximize];
// 窗体 居中显示
form1.Position := poDesktopCenter;
// 窗体 靠近屏幕边缘时,贴边吸附
form1.ScreenSnap := True;
//结果默认为 0
F := 0;
end;
procedure TForm1.Button10Click(Sender: TObject);
begin
//计算器 数字 0 被点击
if (C <> #0) and (F = 0) then // 2,如果 已经按下 计算符 并且 结果为空时
begin
// 清空 编辑框4 中的 运算符
Edit4.Text := StringReplace(Edit4.Text, '+', '', [rfReplaceAll]);
Edit4.Text := StringReplace(Edit4.Text, '-', '', [rfReplaceAll]);
Edit4.Text := StringReplace(Edit4.Text, '×', '', [rfReplaceAll]);
Edit4.Text := StringReplace(Edit4.Text, '÷', '', [rfReplaceAll]);
// 增加 数字 0
Edit4.text := Edit4.text + '0';
// 将光标移动到 Memo1 的末尾
Memo1.SelStart := Length(Memo1.Text);
// 选择长度为0,即不选择任何文本
Memo1.SelLength := 0;
// 在光标位置不换行,插入数字 0
Memo1.SelText := '0';
ShowMessage('已经按下 计算符 并且 结果为空时');
end
else
if (F <> 0) and (C = #0) and (G = 1) then // 检测 已经计算过结果 并且 没有按计算符
begin
// 清空 编辑框4 中的 运算符
Edit4.Text := StringReplace(Edit4.Text, '+', '', [rfReplaceAll]);
Edit4.Text := StringReplace(Edit4.Text, '-', '', [rfReplaceAll]);
Edit4.Text := StringReplace(Edit4.Text, '×', '', [rfReplaceAll]);
Edit4.Text := StringReplace(Edit4.Text, '÷', '', [rfReplaceAll]);
//计算器 数字 0 被点击 插入数字 0
Edit4.text := Edit4.text + '0';
if H = 1 then
begin
// 将光标移动到 Memo1 的末尾
Memo1.SelStart := Length(Memo1.Text);
// 选择长度为0,即不选择任何文本
Memo1.SelLength := 0;
// 在光标位置不换行,插入编辑框4内容(同步MEmo1)
Memo1.SelText := Edit4.text;
H := 0;
ShowMessage('已经计算过结果 并且 没有按计算符');
end
else
begin
// 结果追加新数值,插入数字 0
Memo1.SelText := '0';
ShowMessage('结果追加新数值 并且 没有按计算符');
end;
end;
if (C = #0) and (F = 0) and (G = 0) then // 如果 没有按计算符 并且 结果也为空
begin
//计算器 数字 0 被点击
Edit4.text := Edit4.text + '0';
// 将光标移动到 Memo1 的末尾
Memo1.SelStart := Length(Memo1.Text);
// 选择长度为0,即不选择任何文本
Memo1.SelLength := 0;
// 在光标位置不换行,插入数字 0
Memo1.SelText := '0';
ShowMessage('没有按计算符 并且 结果也为空');
end;
// 已经有结果 并且 有运算符 并且 结果追加新数值
if (G = 1) and (C <> #0) then
begin
//计算器 数字 0 被点击
Edit4.text := Edit4.text + '0';
// 将光标移动到 Memo1 的末尾
Memo1.SelStart := Length(Memo1.Text);
// 选择长度为0,即不选择任何文本
Memo1.SelLength := 0;
// 在光标位置不换行,插入数字0
Memo1.SelText := '0';
ShowMessage('已经有结果 并且 有运算符 并且 结果追加新数值');
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
//计算器 数字 1 被点击
if (C <> #0) and (F = 0) then // 2,如果 已经按下 计算符 并且 结果为空时
begin
// 清空 编辑框4 中的 运算符
Edit4.Text := StringReplace(Edit4.Text, '+', '', [rfReplaceAll]);
Edit4.Text := StringReplace(Edit4.Text, '-', '', [rfReplaceAll]);
Edit4.Text := StringReplace(Edit4.Text, '×', '', [rfReplaceAll]);
Edit4.Text := StringReplace(Edit4.Text, '÷', '', [rfReplaceAll]);
// 增加 数字 1
Edit4.text := Edit4.text + '1';
// 将光标移动到 Memo1 的末尾
Memo1.SelStart := Length(Memo1.Text);
// 选择长度为0,即不选择任何文本
Memo1.SelLength := 0;
// 在光标位置不换行,插入数字 1
Memo1.SelText := '1';
ShowMessage('已经按下 计算符 并且 结果为空时');
end
else
if (F <> 0) and (C = #0) and (G = 1) then // 检测 已经计算过结果 并且 没有按计算符
begin
// 清空 编辑框4 中的 运算符
Edit4.Text := StringReplace(Edit4.Text, '+', '', [rfReplaceAll]);
Edit4.Text := StringReplace(Edit4.Text, '-', '', [rfReplaceAll]);
Edit4.Text := StringReplace(Edit4.Text, '×', '', [rfReplaceAll]);
Edit4.Text := StringReplace(Edit4.Text, '÷', '', [rfReplaceAll]);
//计算器 数字 1 被点击 插入数字 1
Edit4.text := Edit4.text + '1';
if H = 1 then
begin
// 将光标移动到 Memo1 的末尾
Memo1.SelStart := Length(Memo1.Text);
// 选择长度为0,即不选择任何文本
Memo1.SelLength := 0;
// 在光标位置不换行,插入编辑框4内容(同步MEmo1)
Memo1.SelText := Edit4.text;
H := 0;
ShowMessage('已经计算过结果 并且 没有按计算符');
end
else
begin
// 结果追加新数值,插入数字 1
Memo1.SelText := '1';
ShowMessage('结果追加新数值 并且 没有按计算符');
end;
end;
if (C = #0) and (F = 0) and (G = 0) then // 如果 没有按计算符 并且 结果也为空
begin
//计算器 数字 1 被点击
Edit4.text := Edit4.text + '1';
// 将光标移动到 Memo1 的末尾
Memo1.SelStart := Length(Memo1.Text);
// 选择长度为0,即不选择任何文本
Memo1.SelLength := 0;
// 在光标位置不换行,插入数字 1
Memo1.SelText := '1';
ShowMessage('没有按计算符 并且 结果也为空');
end;
// 已经有结果 并且 有运算符 并且 结果追加新数值
if (G = 1) and (C <> #0) then
begin
//计算器 数字 1 被点击
Edit4.text := Edit4.text + '1';
// 将光标移动到 Memo1 的末尾
Memo1.SelStart := Length(Memo1.Text);
// 选择长度为0,即不选择任何文本
Memo1.SelLength := 0;
// 在光标位置不换行,插入数字1
Memo1.SelText := '1';
ShowMessage('已经有结果 并且 有运算符 并且 结果追加新数值');
end;
end;
procedure TForm1.Button12Click(Sender: TObject);
begin
// 点击 +加号 按钮
if Edit4.Text = '' then // 1,检测编辑框内容,是否为空
begin
Exit;
end;
if C = #0 then // 2,如果 计算符 从来没有按过
begin
// {BANNED}中国第一次按下,计算符
try
B := StrToFloat(Edit4.Text); // 保存{BANNED}中国第一个操作数
C := '+'; // 设置当前运算符
// 先清空
Edit4.Text := '';
// 再写 + 号
Edit4.Text := '+';
// 将光标移动到 Memo1 的末尾
Memo1.SelStart := Length(Memo1.Text);
// 选择长度为0,即不选择任何文本
Memo1.SelLength := 0;
// 在光标位置插入文本,不换行
Memo1.SelText := '+';
ShowMessage('{BANNED}中国第一次按下,计算符 + ');
except
on E: EConvertError do
ShowMessage('输入无效,请输入有效数字');
end;
end
else
begin
ShowMessage('已经按过运算符 + ');
C := '+'; // 设置新运算符
// 如果已经按过,运算符,先给他计算结果
Button17Click(Sender); // 调用等号计算
end;
end;
procedure TForm1.Button13Click(Sender: TObject);
begin
// 点击 -减号 按钮
if Edit4.Text = '' then // 1,检测编辑框内容,是否为空
begin
Exit;
end;
if C = #0 then // 2,检测是否,已经按下了,计算符
begin
// 如果是{BANNED}中国第一次按下,计算符
try
B := StrToFloat(Edit4.Text); // 保存{BANNED}中国第一个操作数
C := '-'; // 设置当前运算符
Edit4.Text := '-';
// 将光标移动到 Memo1 的末尾
Memo1.SelStart := Length(Memo1.Text);
// 选择长度为0,即不选择任何文本
Memo1.SelLength := 0;
// 在光标位置插入文本,不换行
Memo1.SelText := '-';
except
on E: EConvertError do
ShowMessage('输入无效,请输入有效数字');
end;
end
else
begin
C := '-'; // 设置新运算符
// 如果已经按过,运算符,先给他计算结果
Button17Click(Sender); // 调用等号计算
end;
end;
procedure TForm1.Button16Click(Sender: TObject);
begin
// 点击 清空 按钮
Edit4.text := ''; // 清空 编辑框4
C := #0; // 重置运算符
F := 0; // 结果恢复为 0
G := 0; // 结果标记清空
H := 0; // 结果追加新数值 清空
end;
procedure TForm1.Button17Click(Sender: TObject);
begin
// 点击 等号 按钮
if C = #0 then Exit; // 如果没有 计算符 直接退出
减速带niecu.com
try
D := StrToFloat(Edit4.Text); // 把第二次输入的数字,放到 变量 D
case C of
'+': F := B + D;
'-': F := B - D;
'*': F := B * D;
'/': F := B / D;
end;
Edit4.Text := FloatToStr(F); // 计算结果 放到 编辑框4 显示
// 将光标移动到 Memo1 的末尾
Memo1.SelStart := Length(Memo1.Text);
// 选择长度为0,即不选择任何文本
Memo1.SelLength := 0;
// 在光标位置插入文本,不换行
Memo1.SelText := '=';
Memo1.SelText := FloatToStr(F) + #13#10; // 计算结果 放到 文本框
C := #0; // 重置运算符
G := 1; // G 表示,已经有计算结果
H := 1; // H 表示,结果追加新数值,追加到MEMO1用的
except
// ShowMessage('计算错误');
end;
end;
end.
代码没写完,不过基本也差不多了,剩下的你自己完善吧。Lazarus版本 4.0