diff --git a/applications/lazstats/source/forms/tools/calculatorunit.pas b/applications/lazstats/source/forms/tools/calculatorunit.pas index 0bc950837..08d30e9c9 100644 --- a/applications/lazstats/source/forms/tools/calculatorunit.pas +++ b/applications/lazstats/source/forms/tools/calculatorunit.pas @@ -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.