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,14 +149,16 @@ end;
procedure TCalculatorForm.log10btnClick(Sender: TObject);
begin
X := StrToFloat(XEdit.Text);
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);
if TryStrToFloat(XEdit.Text, Xmemory) then
XEdit.Text := '';
end;
@ -161,34 +168,46 @@ begin
end;
procedure TCalculatorForm.MemPlusBtnClick(Sender: TObject);
var
value: Double;
begin
stack[NoStack] := stack[NoStack] + StrToFloat(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);
if TryStrToFloat(XEdit.Text, TempX) then
begin
XEdit.Text := '';
operation := 2; // multiply
end;
end;
procedure TCalculatorForm.natlogbtnClick(Sender: TObject);
begin
X := StrToFloat(XEdit.Text);
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
if TryStrToInt(XEdit.Text, n) then
begin
n := StrToInt(XEdit.Text);
n := factorial(n);
XEdit.Text := IntToStr(n);
end;
end;
procedure TCalculatorForm.ninebtnClick(Sender: TObject);
begin
@ -196,11 +215,13 @@ begin
end;
procedure TCalculatorForm.nPrbtnClick(Sender: TObject);
begin
if TryStrToInt(XEdit.Text, Xint) then
begin
operation := 7;
Xint := StrToInt(XEdit.Text);
XEdit.Text := '';
end;
end;
procedure TCalculatorForm.onebtnClick(Sender: TObject);
begin
@ -224,10 +245,12 @@ end;
procedure TCalculatorForm.sinbtnClick(Sender: TObject);
begin
X := StrToFloat(XEdit.Text);
if TryStrToFloat(XEdit.Text, X) then
begin
X := sin(DegToRad(X));
XEdit.Text := FloatToStr(X);
end;
end;
procedure TCalculatorForm.sixbtnClick(Sender: TObject);
begin
@ -236,38 +259,48 @@ end;
procedure TCalculatorForm.sqrbtnClick(Sender: TObject);
begin
X := StrToFloat(XEdit.Text);
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);
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);
if TryStrToFloat(XEdit.Text, TempX) then
begin
XEdit.Text := '';
operation := 3; // subtract
end;
end;
procedure TCalculatorForm.tanbtnClick(Sender: TObject);
begin
X := StrToFloat(XEdit.Text);
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);
if TryStrToFloat(XEdit.Text, X) then
begin
X := power(10,X);
XEdit.Text := FloatToStr(X);
end;
end;
procedure TCalculatorForm.threebtnClick(Sender: TObject);
begin
@ -285,11 +318,13 @@ begin
end;
procedure TCalculatorForm.ytopowerxbtnClick(Sender: TObject);
begin
if TryStrToFloat(XEdit.Text, tempX) then
begin
operation := 5;
tempX := StrToFloat(XEdit.Text);
XEdit.Text := '';
end;
end;
procedure TCalculatorForm.ZeroBtnClick(Sender: TObject);
begin
@ -302,39 +337,49 @@ begin
end;
procedure TCalculatorForm.CombobtnClick(Sender: TObject);
begin
if TryStrToFloat(XEdit.Text, tempX) then
begin
operation := 6;
tempX := StrToFloat(XEdit.Text);
XEdit.Text := '';
end;
end;
procedure TCalculatorForm.cosbtnClick(Sender: TObject);
begin
X := StrToFloat(XEdit.Text);
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);
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;
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);
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);
begin
@ -344,24 +389,28 @@ end;
procedure TCalculatorForm.absbtnClick(Sender: TObject);
begin
X := StrToFloat(XEdit.Text);
if TryStrToFloat(XEdit.Text, X) then
begin
X := abs(X);
XEdit.Text := FloatToStr(X);
end;
end;
procedure TCalculatorForm.VarBtnClick(Sender: TObject);
VAR
var
Sum, SSQ: double;
Ncount : 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,10 +487,12 @@ end;
procedure TCalculatorForm.dividebtnClick(Sender: TObject);
begin
TempX := StrToFloat(XEdit.Text);
if TryStrToFloat(XEdit.Text, TempX) then
begin
XEdit.Text := '';
operation := 1; // //divide
end;
end;
procedure TCalculatorForm.eightbtnClick(Sender: TObject);
begin
@ -445,61 +500,66 @@ 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);
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);
if TryStrToFloat(XEdit.Text, X) then
begin
X := exp(X);
XEdit.Text := FloatToStr(X);
end;
end;
procedure TCalculatorForm.fivebtnClick(Sender: TObject);
begin
XEdit.Text := XEdit.Text + '5';
end;
initialization
{$I calculatorunit.lrs}
end.