{ Private declarations }
protected
// procedure CreateParams(var Params: TCreateParams);override;
public
{ Public declarations }
end;
TRightEdit = class(TEdit)
protected
procedure CreateParams(var Params : TCreateParams);override;
end;
type
operator = (Emp,add,sub,mul,divid); //空、加、减、乘、除
var
FrmCounter: TFrmCounter;
MyRightEdit: TRightEdit;
operate: Operator = emp;
operate1: Operator = emp; //记录上一次用户按下的运算符
Pointed: Boolean = False; //是否输入小数点
temp: string = '';
tempnum: Real = 0.0;
implementation
{$R *.dfm}
//重载 TRightEdit的CreateParams自定义编辑框的一些样式
procedure TRightEdit.CreateParams(var Params : TCreateParams);
begin
inherited;
Params.Style := params.Style + ES_Right;
end;
//创建窗体时初始化一些参数
procedure TFrmCounter.FormCreate(Sender: TObject);
begin
MyRightEdit := TrightEdit.Create(nil);
with MyRightEdit do
begin
parent := panel1;
text := '0.';
MyRightEdit.Height := 100;
Align := alTop;
Enabled := False;
ReadOnly := True;
show;
end;
end;
//清零的响应函数
procedure TFrmCounter.SBClearClick(Sender: TObject);
begin
Pointed := False;
MyRightEdit.Text := '0.';
TempNum := 0.0;
Operate := emp;
temp := '';
end;
//数字键输入响应函数
procedure TFrmCounter.SpeedButton1Click(Sender: TObject);
var
StrWidth: Integer;
begin
if (temp = '')or(Operate <> emp) then
TempNum := StrToFloat(MyRightEdit.Text);
if Operate <> emp then
MyRightEdit.Text := '0.';
Temp := Trim(MyRightEdit.Text);
StrWidth := Length(temp);
if Sender is TSpeedButton then
begin
if Operate <> emp then
begin
MyRightEdit.Text := '0.';
Operate := emp;
end;
if Pointed = False then
begin
if StrToFloat(MyRightEdit.Text) = 0 then
MyRightEdit.Text := FloatToStr(StrToFloat(MyRightEdit.Text)+
StrToInt(TSpeedButton(Sender).Caption))+'.'
else begin
Insert(Trim(TspeedButton(Sender).Caption),temp,StrWidth);
MyRightEdit.Text := temp;
end;
end
else begin
Insert(Trim(TSpeedButton(Sender).Caption),temp,StrWidth+1);
MyRightEdit.Text := temp;
end;
end;
end;
//正负符号响应函数
procedure TFrmCounter.SpeedButton13Click(Sender: TObject);
begin
if Operate <> emp then
begin
TempNum := StrToFloat(MyRightEdit.Text);
MyRightEdit.Text := '0.';
Operate := emp;
end;
if StrToFloat(MyRightEdit.Text) > 0 then
begin
MyRightEdit.Text := FloatToStr(-StrToFloat(MyRightEdit.Text));
if Pos('.',Trim(MyRightEdit.Text))=0 then
MyRightEdit.Text := FloatToStr(StrToFloat(MyRightEdit.Text))+'.';
end
else if StrToFloat(MyRightEdit.Text)<0 then
begin
MyRightEdit.Text := FloatToStr(abs(StrToFloat(MyRightEdit.Text)));
if Pos('.',Trim(MyRightEdit.Text))=0 then
MyRightEdit.Text := FloatToStr(StrToFloat(MyRightEdit.Text))+'.';
end;
end;
//小数点的输入
procedure TFrmCounter.SpeedButton14Click(Sender: TObject);
begin
if Operate <> emp then
begin
Operate := emp;
MyRightEdit.Text := '0';
end;
if Pointed = True then
Beep
else
Pointed := True;
end;
//显示运算结果
procedure TFrmCounter.SpeedButton19Click(Sender: TObject);
begin
if (Operate = emp)and(Trim(temp)<>'') then
begin
case Operate1 of
add: begin
MyRightEdit.Text := FloatToStr(StrToFloat(MyRightEdit.Text)+TempNum);
end;
sub: begin
MyRightEdit.Text := FloatToStr(TempNum-StrToFloat(MyRightEdit.Text));
end;
mul: begin
MyRightEdit.Text := FloatToStr(TempNum*StrToFloat(MyRightEdit.Text));
end;
divid: begin
if StrToFloat(MyRightEdit.Text)<>0 then
MyRightEdit.Text := FloatToStr(TempNum/StrToFloat(MyRightEdit.Text))
else
Application.MessageBox('除数不能为零。','提示',);
end;
end;
end;
Operate1 := emp;
Pointed := False;
if Pos('.',Trim(MyRightEdit.Text))=0 then
MyRightEdit.Text := Trim(MyRightEdit.Text)+'.';
end;
procedure TFrmCounter.SpeedButton12Click(Sender: TObject);
begin
SpeedButton19.OnClick(Sender);
Operate := add;
Operate1 := add;
end;
procedure TFrmCounter.SpeedButton17Click(Sender: TObject);
begin
SpeedButton19.OnClick(Sender);
Operate := sub;
Operate1 := sub;
end;
procedure TFrmCounter.SpeedButton6Click(Sender: TObject);
begin
SpeedButton19.OnClick(Sender);
Operate := mul;
Operate1 := mul;
end;
procedure TFrmCounter.SpeedButton10Click(Sender: TObject);
begin
SpeedButton19.OnClick(Sender);
Operate := divid;
Operate1 := divid;
end;
procedure TFrmCounter.SBBackspaceClick(Sender: TObject);
var
StrWidth: Integer;
temp: string;
begin
if Operate = emp then
begin
if Trim(MyRightEdit.Text)<>'0.' then
begin
if Length(Trim(MyRightEdit.Text))>2 then
begin
Temp := Trim(MyRightEdit.Text);
StrWidth := Length(Trim(MyRightEdit.Text));
if (StrToFloat(MyRightEdit.Text)<9)and(StrWidth = 3) then
begin
MyRightEdit.Text := '0.';
Pointed := False;
end
else begin
if Pointed = False then
Delete(Temp,StrWidth-1,1)
else begin
if Copy(temp,StrWidth,1)='.' then
Pointed := False
else
Delete(Temp,StrWidth,1);
end;
if Trim(temp) = '.' then
Pointed := False;
MyRightEdit.Text := temp;
end;
end
else begin
Pointed := False;
MyRightEdit.Text := '0.';
end;
end;
end
else
Beep;
end;
end.下载本文