LazStats: prevent numerical input error in calculatorUnit.
git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@7934 8e941d3f-bd1b-0410-a28a-d453659cc2b4
This commit is contained in:
parent
2af62f1667
commit
34f46c21f3
@ -5,7 +5,7 @@ unit CalculatorUnit;
|
||||
interface
|
||||
|
||||
uses
|
||||
Classes, SysUtils, FileUtil, LResources, Forms, Controls, Graphics, Dialogs,
|
||||
Classes, SysUtils, Forms, Controls, Graphics, Dialogs,
|
||||
StdCtrls, Math,
|
||||
FunctionsLib, Globals;
|
||||
|
||||
@ -123,6 +123,11 @@ var
|
||||
|
||||
implementation
|
||||
|
||||
{$R *.lfm}
|
||||
|
||||
uses
|
||||
Utils;
|
||||
|
||||
{ TCalculatorForm }
|
||||
|
||||
procedure TCalculatorForm.FormShow(Sender: TObject);
|
||||
@ -144,15 +149,17 @@ end;
|
||||
|
||||
procedure TCalculatorForm.log10btnClick(Sender: TObject);
|
||||
begin
|
||||
X := StrToFloat(XEdit.Text);
|
||||
X := log10(X);
|
||||
XEdit.Text := FloatToStr(X);
|
||||
if TryStrToFloat(XEdit.Text, X) then
|
||||
begin
|
||||
X := log10(X);
|
||||
XEdit.Text := FloatToStr(X);
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure TCalculatorForm.MemInBtnClick(Sender: TObject);
|
||||
begin
|
||||
Xmemory := StrToFloat(XEdit.Text);
|
||||
XEdit.Text := '';
|
||||
if TryStrToFloat(XEdit.Text, Xmemory) then
|
||||
XEdit.Text := '';
|
||||
end;
|
||||
|
||||
procedure TCalculatorForm.MemOutBtnClick(Sender: TObject);
|
||||
@ -161,33 +168,45 @@ begin
|
||||
end;
|
||||
|
||||
procedure TCalculatorForm.MemPlusBtnClick(Sender: TObject);
|
||||
var
|
||||
value: Double;
|
||||
begin
|
||||
stack[NoStack] := stack[NoStack] + StrToFloat(XEdit.Text);
|
||||
NoStack := NoStack + 1;
|
||||
NEdit.Text := IntToStr(NoStack);
|
||||
XEdit.Text := '';
|
||||
if TryStrToFloat(XEdit.Text, value) then
|
||||
begin
|
||||
stack[NoStack] := stack[NoStack] + value;
|
||||
NoStack := NoStack + 1;
|
||||
NEdit.Text := IntToStr(NoStack);
|
||||
XEdit.Text := '';
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure TCalculatorForm.multbtnClick(Sender: TObject);
|
||||
begin
|
||||
TempX := StrToFloat(XEdit.Text);
|
||||
XEdit.Text := '';
|
||||
operation := 2; // multiply
|
||||
if TryStrToFloat(XEdit.Text, TempX) then
|
||||
begin
|
||||
XEdit.Text := '';
|
||||
operation := 2; // multiply
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure TCalculatorForm.natlogbtnClick(Sender: TObject);
|
||||
begin
|
||||
X := StrToFloat(XEdit.Text);
|
||||
X := ln(X);
|
||||
XEdit.Text := FloatToStr(X);
|
||||
if TryStrToFloat(XEdit.Text, X) then
|
||||
begin
|
||||
X := ln(X);
|
||||
XEdit.Text := FloatToStr(X);
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure TCalculatorForm.nfactorialbtnClick(Sender: TObject);
|
||||
var n : integer;
|
||||
var
|
||||
n : integer;
|
||||
begin
|
||||
n := StrToInt(XEdit.Text);
|
||||
n := factorial(n);
|
||||
XEdit.Text := IntToStr(n);
|
||||
if TryStrToInt(XEdit.Text, n) then
|
||||
begin
|
||||
n := factorial(n);
|
||||
XEdit.Text := IntToStr(n);
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure TCalculatorForm.ninebtnClick(Sender: TObject);
|
||||
@ -197,14 +216,16 @@ end;
|
||||
|
||||
procedure TCalculatorForm.nPrbtnClick(Sender: TObject);
|
||||
begin
|
||||
operation := 7;
|
||||
Xint := StrToInt(XEdit.Text);
|
||||
XEdit.Text := '';
|
||||
if TryStrToInt(XEdit.Text, Xint) then
|
||||
begin
|
||||
operation := 7;
|
||||
XEdit.Text := '';
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure TCalculatorForm.onebtnClick(Sender: TObject);
|
||||
begin
|
||||
XEdit.Text := XEdit.Text + '1';
|
||||
XEdit.Text := XEdit.Text + '1';
|
||||
end;
|
||||
|
||||
procedure TCalculatorForm.PeriodBtnClick(Sender: TObject);
|
||||
@ -224,9 +245,11 @@ end;
|
||||
|
||||
procedure TCalculatorForm.sinbtnClick(Sender: TObject);
|
||||
begin
|
||||
X := StrToFloat(XEdit.Text);
|
||||
X := sin(DegToRad(X));
|
||||
XEdit.Text := FloatToStr(X);
|
||||
if TryStrToFloat(XEdit.Text, X) then
|
||||
begin
|
||||
X := sin(DegToRad(X));
|
||||
XEdit.Text := FloatToStr(X);
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure TCalculatorForm.sixbtnClick(Sender: TObject);
|
||||
@ -236,37 +259,47 @@ end;
|
||||
|
||||
procedure TCalculatorForm.sqrbtnClick(Sender: TObject);
|
||||
begin
|
||||
X := StrToFloat(XEdit.Text);
|
||||
X := X * X;
|
||||
XEdit.Text := FloatToStr(X);
|
||||
if TryStrToFloat(XEdit.Text, X) then
|
||||
begin
|
||||
X := X * X;
|
||||
XEdit.Text := FloatToStr(X);
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure TCalculatorForm.sqrtbtnClick(Sender: TObject);
|
||||
begin
|
||||
X := StrToFloat(XEdit.Text);
|
||||
X := sqrt(X);
|
||||
XEdit.Text := FloatToStr(X);
|
||||
if TryStrToFloat(XEdit.Text, X) then
|
||||
begin
|
||||
X := sqrt(X);
|
||||
XEdit.Text := FloatToStr(X);
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure TCalculatorForm.subtractbtnClick(Sender: TObject);
|
||||
begin
|
||||
TempX := StrToFloat(XEdit.Text);
|
||||
XEdit.Text := '';
|
||||
operation := 3; // subtract
|
||||
if TryStrToFloat(XEdit.Text, TempX) then
|
||||
begin
|
||||
XEdit.Text := '';
|
||||
operation := 3; // subtract
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure TCalculatorForm.tanbtnClick(Sender: TObject);
|
||||
begin
|
||||
X := StrToFloat(XEdit.Text);
|
||||
X := tan(DegToRad(X));
|
||||
XEdit.Text := FloatToStr(X);
|
||||
if TryStrTofloat(XEdit.Text, X) then
|
||||
begin
|
||||
X := tan(DegToRad(X));
|
||||
XEdit.Text := FloatToStr(X);
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure TCalculatorForm.tentoxbtnClick(Sender: TObject);
|
||||
begin
|
||||
X := StrToFloat(XEdit.Text);
|
||||
X := power(10,X);
|
||||
XEdit.Text := FloatToStr(X);
|
||||
if TryStrToFloat(XEdit.Text, X) then
|
||||
begin
|
||||
X := power(10,X);
|
||||
XEdit.Text := FloatToStr(X);
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure TCalculatorForm.threebtnClick(Sender: TObject);
|
||||
@ -286,14 +319,16 @@ end;
|
||||
|
||||
procedure TCalculatorForm.ytopowerxbtnClick(Sender: TObject);
|
||||
begin
|
||||
operation := 5;
|
||||
tempX := StrToFloat(XEdit.Text);
|
||||
XEdit.Text := '';
|
||||
if TryStrToFloat(XEdit.Text, tempX) then
|
||||
begin
|
||||
operation := 5;
|
||||
XEdit.Text := '';
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure TCalculatorForm.ZeroBtnClick(Sender: TObject);
|
||||
begin
|
||||
XEdit.text := XEdit.Text + '0';
|
||||
XEdit.text := XEdit.Text + '0';
|
||||
end;
|
||||
|
||||
procedure TCalculatorForm.ClearEntryBtnClick(Sender: TObject);
|
||||
@ -303,37 +338,47 @@ end;
|
||||
|
||||
procedure TCalculatorForm.CombobtnClick(Sender: TObject);
|
||||
begin
|
||||
operation := 6;
|
||||
tempX := StrToFloat(XEdit.Text);
|
||||
XEdit.Text := '';
|
||||
if TryStrToFloat(XEdit.Text, tempX) then
|
||||
begin
|
||||
operation := 6;
|
||||
XEdit.Text := '';
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure TCalculatorForm.cosbtnClick(Sender: TObject);
|
||||
begin
|
||||
X := StrToFloat(XEdit.Text);
|
||||
X := cos(DegToRad(X));
|
||||
XEdit.Text := FloatToStr(X);
|
||||
if TryStrToFloat(XEdit.Text, X) then
|
||||
begin
|
||||
X := cos(DegToRad(X));
|
||||
XEdit.Text := FloatToStr(X);
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure TCalculatorForm.AddbtnClick(Sender: TObject);
|
||||
begin
|
||||
TempX := StrToFloat(XEdit.Text);
|
||||
XEdit.Text := '';
|
||||
operation := 4; // add
|
||||
if TryStrToFloat(XEdit.Text, TempX) then
|
||||
begin
|
||||
XEdit.Text := '';
|
||||
operation := 4; // add
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure TCalculatorForm.ChangeSignBtnClick(Sender: TObject);
|
||||
begin
|
||||
X := StrToFloat(XEdit.Text);
|
||||
X := -1.0 * X;
|
||||
XEdit.Text := FloatToStr(X);
|
||||
if TryStrToFloat(XEdit.Text, X) then
|
||||
begin
|
||||
X := -X;
|
||||
XEdit.Text := FloatToStr(X);
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure TCalculatorForm.etoxbtnClick(Sender: TObject);
|
||||
begin
|
||||
X := StrToFloat(XEdit.Text);
|
||||
X := power(2.71828182845905,X);
|
||||
XEdit.Text := FloatToStr(X);
|
||||
if TryStrToFloat(XEdit.Text, X) then
|
||||
begin
|
||||
X := exp(X); //power(2.71828182845905, X);
|
||||
XEdit.Text := FloatToStr(X);
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure TCalculatorForm.PiBtnClick(Sender: TObject);
|
||||
@ -344,24 +389,28 @@ end;
|
||||
|
||||
procedure TCalculatorForm.absbtnClick(Sender: TObject);
|
||||
begin
|
||||
X := StrToFloat(XEdit.Text);
|
||||
X := abs(X);
|
||||
XEdit.Text := FloatToStr(X);
|
||||
if TryStrToFloat(XEdit.Text, X) then
|
||||
begin
|
||||
X := abs(X);
|
||||
XEdit.Text := FloatToStr(X);
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure TCalculatorForm.VarBtnClick(Sender: TObject);
|
||||
VAR
|
||||
Sum, SSQ : double;
|
||||
Ncount : double;
|
||||
i, index : integer;
|
||||
var
|
||||
Sum, SSQ: double;
|
||||
NCount: double;
|
||||
i, index: integer;
|
||||
begin
|
||||
Ncount := StrToFloat(NEdit.Text);
|
||||
index := StrToInt(NEdit.Text);
|
||||
if not TryStrToFloat(NEdit.Text, NCount) then // wp: why read the same Edit into two variables?
|
||||
exit;
|
||||
if not TryStrToInt(NEdit.Text, index) then
|
||||
exit;
|
||||
Sum := 0.0;
|
||||
SSQ := 0.0;
|
||||
if Ncount < 1 then
|
||||
if NCount < 1 then
|
||||
begin
|
||||
ShowMessage('No values in stack memory');
|
||||
ErrorMsg('No values in stack memory');
|
||||
exit;
|
||||
end
|
||||
else
|
||||
@ -385,12 +434,14 @@ Var
|
||||
Ncount : double;
|
||||
i, index : integer;
|
||||
begin
|
||||
Ncount := StrToFloat(NEdit.Text);
|
||||
index := StrToInt(NEdit.Text);
|
||||
if not TryStrToFloat(NEdit.Text, NCount) then // wp: why two variables?
|
||||
exit;
|
||||
if not TryStrToInt(NEdit.Text, index) then
|
||||
exit;
|
||||
Sum := 0.0;
|
||||
if Ncount < 1 then
|
||||
begin
|
||||
ShowMessage('No values in stack memory');
|
||||
ErrorMsg('No values in stack memory');
|
||||
exit;
|
||||
end
|
||||
else
|
||||
@ -407,8 +458,10 @@ VAR
|
||||
Ncount : double;
|
||||
i, index : integer;
|
||||
begin
|
||||
Ncount := StrToFloat(NEdit.Text);
|
||||
index := StrToInt(NEdit.Text);
|
||||
if not TryStrToFloat(NEdit.Text, NCount) then // wp: why two variables?
|
||||
exit;
|
||||
if not TryStrToInt(NEdit.Text, index) then
|
||||
exit;
|
||||
Sum := 0.0;
|
||||
SSQ := 0.0;
|
||||
if Ncount < 1 then
|
||||
@ -434,9 +487,11 @@ end;
|
||||
|
||||
procedure TCalculatorForm.dividebtnClick(Sender: TObject);
|
||||
begin
|
||||
TempX := StrToFloat(XEdit.Text);
|
||||
XEdit.Text := '';
|
||||
operation := 1; // //divide
|
||||
if TryStrToFloat(XEdit.Text, TempX) then
|
||||
begin
|
||||
XEdit.Text := '';
|
||||
operation := 1; // //divide
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure TCalculatorForm.eightbtnClick(Sender: TObject);
|
||||
@ -445,52 +500,59 @@ begin
|
||||
end;
|
||||
|
||||
procedure TCalculatorForm.EqualBtnClick(Sender: TObject);
|
||||
Var x1, x2 : double;
|
||||
var
|
||||
x1, x2: double;
|
||||
editVal: Double;
|
||||
begin
|
||||
if not TryStrToFloat(XEdit.Text, editVal) then
|
||||
exit;
|
||||
|
||||
case (operation) of
|
||||
1 : begin // divide operation
|
||||
x1 := tempX;
|
||||
x2 := x1 / StrToFloat(XEdit.Text);
|
||||
x2 := x1 / editVal;
|
||||
XEdit.Text := FloatToStr(x2);
|
||||
end;
|
||||
2 : begin // nultiply operation
|
||||
x1 := tempX;
|
||||
x2 := x1 * StrToFloat(XEdit.Text);
|
||||
x2 := x1 * editVal;
|
||||
XEdit.Text := FloatToStr(x2);
|
||||
end;
|
||||
3 : begin
|
||||
x1 := tempX; // subtract operation
|
||||
x2 := x1 - StrToFloat(XEdit.Text);
|
||||
x2 := x1 - editVal;
|
||||
XEdit.Text := FloatToStr(x2);
|
||||
end;
|
||||
4 : begin
|
||||
x1 := tempX; // Add operation
|
||||
x2 := x1 + StrToFloat(XEdit.Text);
|
||||
x2 := x1 + editVal;
|
||||
XEdit.Text := FloatToStr(x2);
|
||||
end;
|
||||
5 : begin // y to the X power (Y stored in tempx first, x in register)
|
||||
X := StrToFloat(XEdit.Text);
|
||||
X := power(tempX,X);
|
||||
X := power(tempX, editVal);
|
||||
XEdit.Text := FloatToStr(X);
|
||||
end;
|
||||
6 : begin // combinations of x things out of N
|
||||
X := StrToFloat(XEdit.Text);
|
||||
X := combos(X,tempX);
|
||||
X := combos(editVal,tempX);
|
||||
XEdit.Text := FloatToStr(X);
|
||||
end;
|
||||
7 : begin // permutations of x things out of N
|
||||
Xint2 := StrToInt(XEdit.Text);
|
||||
Xint := factorial(Xint) div (factorial(Xint - Xint2));
|
||||
XEdit.Text := IntToStr(Xint);
|
||||
if TryStrToInt(XEdit.Text, XInt2) then
|
||||
begin
|
||||
Xint := factorial(Xint) div (factorial(Xint - Xint2));
|
||||
XEdit.Text := IntToStr(Xint);
|
||||
end;
|
||||
end;
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure TCalculatorForm.expbtnClick(Sender: TObject);
|
||||
begin
|
||||
X := StrToFloat(XEdit.Text);
|
||||
X := exp(X);
|
||||
XEdit.Text := FloatToStr(X);
|
||||
if TryStrToFloat(XEdit.Text, X) then
|
||||
begin
|
||||
X := exp(X);
|
||||
XEdit.Text := FloatToStr(X);
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure TCalculatorForm.fivebtnClick(Sender: TObject);
|
||||
@ -498,8 +560,6 @@ begin
|
||||
XEdit.Text := XEdit.Text + '5';
|
||||
end;
|
||||
|
||||
initialization
|
||||
{$I calculatorunit.lrs}
|
||||
|
||||
end.
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user