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:
wp_xxyyzz 2020-12-16 23:29:40 +00:00
parent 2af62f1667
commit 34f46c21f3

View File

@ -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.