home *** CD-ROM | disk | FTP | other *** search
Text File | 1999-07-07 | 26.5 KB | 1,131 lines |
- {: Main Unit of ESBCalc v1.4 - Requires Delphi 4 Pro or C/S
- as it uses the Math Unit and Dynamic Arrays.
-
- (c) 1998-1999 ESB Consultancy <p>
-
- These routines are used by ESB Consultancy within the
- development of their Customised Application. <p>
-
- ESB Consultancy retains full copyright. <p>
-
- ESB Consultancy grants users of this code royalty free rights
- to do with this code as they wish. <p>
-
- The Source code is made Freely available to users of LMD Tools
- and we thank them for making such a great suite. LMD Tools v4.0
- is required to compile the source. <p>
-
- ESB Consultancy makes no guarantees nor excepts any liabilities
- due to the use of these routines. <p>
-
- We do ask that if this code helps you in you development
- that you send as an email mailto:esb@gold.net.au or even
- a local postcard. It would also be nice if you gave us a
- mention in your About Box or Help File. <p>
-
- ESB Consultancy Home Page: http://www.esbconsult.com.au<p>
-
- Mail Address: PO Box 2259, Boulder, WA 6432 AUSTRALIA <p>
-
- Reference:
- Handbook of Mathematical Functions by Abramowitz & Stegun, Dover, 1965
-
- History
- 1.4 7 July 1999
- Now uses LMD 4.5
- Add Constants SubMenu containing various Physical Constraints
- Added an Internal UseConstant Routine
- Added a Minimize Button to Caption with Aleksey Xacker's CaptBtn
- Freeware Component - Zipped Unit Included in Source Dir
- Stopped using LMDHideNonVC
-
- 1.3 5 April 1999
- Added Percentage Operator
- Added Exit & Minimize to Option Button
- Fixed up some of the Hints
-
- 1.2.1 12 March 1999
- Minor updates to LMD and ASPACK.
- Updated About Box
-
- 1.2 2 February 1999
- Added Option Button Next to Memory at the bottom
- Added Option to display thousands separator - on by Default
- Exe now ASPacked
- Source now uses a LMDHideNonVC to make the form a little more manageable.
-
- 1.1 Fixed problems with Hints Flickering
- Added 10 Most Recent results (i.e. when equals was pressed)
-
- 1.0.2 Added support for Radians or Degrees in Trig
- Added Saving of Radians Status to Registry
- Added Saving of Number of Decimals to Registry
- Added Saving of Memory to Registry
- 1.0.1 Added Backspace.
- Changed the Maximum number of Decimals to 18.
- Added About Box.
- Improved Exception Handling.
- 1.0 Initial Release
- }
-
- unit ESBCalcs;
-
- interface
-
- uses
- Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
- lmdclass, lmdcont, StdCtrls, lmdstdcA, lmdctrl, lmdstdcS, lmdbtn,
- ESBExtra, lmddlgS, Menus, lmdnonvS, lmdnonvA, lmdcompo, lmdcctrl,
- lmdformA, CaptBtn;
-
- type
- TESBCalcForm = class(TForm)
- CalcPanel: TLMDSimplePanel;
- ZeroBtn: TLMDSpeedButton;
- PointBtn: TLMDSpeedButton;
- ChangeSignBtn: TLMDSpeedButton;
- OneBtn: TLMDSpeedButton;
- TwoBtn: TLMDSpeedButton;
- ThreeBtn: TLMDSpeedButton;
- FourBtn: TLMDSpeedButton;
- FiveBtn: TLMDSpeedButton;
- SixBtn: TLMDSpeedButton;
- SevenBtn: TLMDSpeedButton;
- EightBtn: TLMDSpeedButton;
- NineBtn: TLMDSpeedButton;
- EqualsBtn: TLMDSpeedButton;
- SubtractBtn: TLMDSpeedButton;
- AddBtn: TLMDSpeedButton;
- DivideBtn: TLMDSpeedButton;
- MultiplyBtn: TLMDSpeedButton;
- LeftBracketBtn: TLMDSpeedButton;
- RightBracketBtn: TLMDSpeedButton;
- Decimals: TLMDSpinEdit;
- ValueDisplay: TLMDLabel;
- AllClearBtn: TLMDSpeedButton;
- ClearBtn: TLMDSpeedButton;
- MemoryClearBtn: TLMDSpeedButton;
- MemoryAddBtn: TLMDSpeedButton;
- MemorySubtractBtn: TLMDSpeedButton;
- MemoryRecall: TLMDSpeedButton;
- PowerBtn: TLMDSpeedButton;
- PiButton: TLMDSpeedButton;
- EBtn: TLMDSpeedButton;
- SquareBtn: TLMDSpeedButton;
- SqRootBtn: TLMDSpeedButton;
- InverseBtn: TLMDSpeedButton;
- LogBtn: TLMDSpeedButton;
- LNBtn: TLMDSpeedButton;
- ExitBtn: TLMDSpeedButton;
- CopyBtn: TLMDSpeedButton;
- PasteBtn: TLMDSpeedButton;
- SinBtn: TLMDSpeedButton;
- CosBtn: TLMDSpeedButton;
- TanBtn: TLMDSpeedButton;
- InvBtn: TLMDSpeedButton;
- Bmps: TLMDBitmapList;
- BackSpaceBtn: TLMDSpeedButton;
- AboutBtn: TLMDSpeedButton;
- ESBCalcAbout: TLMDAboutDlg;
- RadBtn: TLMDSpeedButton;
- RegCtrl: TLMDIniCtrl;
- PopupMenu1: TPopupMenu;
- MRU: TLMDMRUList;
- HistoryBtn: TLMDSpeedButton;
- tempitem: TMenuItem;
- MemoryDisplay: TLMDLabel;
- OptionsBtn: TLMDSpeedButton;
- OptionsPM: TPopupMenu;
- ThouSepItem: TMenuItem;
- N1: TMenuItem;
- MinItem: TMenuItem;
- ExitItem: TMenuItem;
- PercentBtn: TLMDSpeedButton;
- N2: TMenuItem;
- C1: TMenuItem;
- GammaItem: TMenuItem;
- LightItem: TMenuItem;
- GravityItem: TMenuItem;
- CaptionButton1: TCaptionButton;
- procedure SevenBtnClick(Sender: TObject);
- procedure ZeroBtnClick(Sender: TObject);
- procedure OneBtnClick(Sender: TObject);
- procedure TwoBtnClick(Sender: TObject);
- procedure ThreeBtnClick(Sender: TObject);
- procedure FourBtnClick(Sender: TObject);
- procedure FiveBtnClick(Sender: TObject);
- procedure SixBtnClick(Sender: TObject);
- procedure EightBtnClick(Sender: TObject);
- procedure NineBtnClick(Sender: TObject);
- procedure PointBtnClick(Sender: TObject);
- procedure AddBtnClick(Sender: TObject);
- procedure FormCreate(Sender: TObject);
- procedure MultiplyBtnClick(Sender: TObject);
- procedure DivideBtnClick(Sender: TObject);
- procedure SubtractBtnClick(Sender: TObject);
- procedure EqualsBtnClick(Sender: TObject);
- procedure DecimalsChange(Sender: TObject);
- procedure ChangeSignBtnClick(Sender: TObject);
- procedure LeftBracketBtnClick(Sender: TObject);
- procedure RightBracketBtnClick(Sender: TObject);
- procedure AllClearBtnClick(Sender: TObject);
- procedure ClearBtnClick(Sender: TObject);
- procedure PowerBtnClick(Sender: TObject);
- procedure PiButtonClick(Sender: TObject);
- procedure EBtnClick(Sender: TObject);
- procedure MemoryClearBtnClick(Sender: TObject);
- procedure MemoryAddBtnClick(Sender: TObject);
- procedure MemorySubtractBtnClick(Sender: TObject);
- procedure MemoryRecallClick(Sender: TObject);
- procedure SquareBtnClick(Sender: TObject);
- procedure InverseBtnClick(Sender: TObject);
- procedure SqRootBtnClick(Sender: TObject);
- procedure ExitBtnClick(Sender: TObject);
- procedure LogBtnClick(Sender: TObject);
- procedure LNBtnClick(Sender: TObject);
- procedure SinBtnClick(Sender: TObject);
- procedure CosBtnClick(Sender: TObject);
- procedure TanBtnClick(Sender: TObject);
- procedure InvBtnClick(Sender: TObject);
- procedure PasteBtnClick(Sender: TObject);
- procedure CopyBtnClick(Sender: TObject);
- procedure FormKeyPress(Sender: TObject; var Key: Char);
- procedure FormKeyDown(Sender: TObject; var Key: Word;
- Shift: TShiftState);
- procedure BackSpaceBtnClick(Sender: TObject);
- procedure AboutBtnClick(Sender: TObject);
- procedure RadBtnClick(Sender: TObject);
- procedure FormDestroy(Sender: TObject);
- procedure MRUClick(Sender: TObject; const aValue: String;
- var Remove: Boolean);
- procedure ThouSepItemClick(Sender: TObject);
- procedure MinItemClick(Sender: TObject);
- procedure ExitItemClick(Sender: TObject);
- procedure PercentBtnClick(Sender: TObject);
- procedure GammaItemClick(Sender: TObject);
- procedure LightItemClick(Sender: TObject);
- procedure GravityItemClick(Sender: TObject);
- procedure CaptionButton1Click(Sender: TObject);
- private
- { Private declarations }
- public
- { Public declarations }
- Inv: Boolean;
- OperandN: Integer;
- OperandStack: TDynFloatArray;
- OperatorN: Integer;
- OperatorStack: TDynCharArray;
- Radians: Boolean;
- Memory: Extended;
- ThouSep: Boolean;
- Value: String;
- procedure Arithmetic (Ch: Char);
- procedure EqualsPressed;
- procedure DisplayMemory;
- procedure DisplayValue (X: Extended);
- function HigherPrecedence (Op1, Op2: Char): Boolean;
- procedure StackManipulation;
- procedure UseConstant (const CValue: Extended);
- end;
-
- var
- ESBCalcForm: TESBCalcForm;
-
- implementation
-
- {$R *.DFM}
-
- uses
- Math,
- Clipbrd;
-
- procedure TESBCalcForm.FormCreate(Sender: TObject);
- begin
- PointBtn.Caption := DecimalSeparator;
-
- Inv := False;
- Radians := True;
- ThouSep := True;
- OperandN := -1;
- SetLength (OperandStack, 10);
- OperatorN := -1;
- SetLength (OperatorStack, 10);
- Value := '';
- ValueDisplay.Caption := '0';
- Memory := 0.0;
-
- Radians := RegCtrl.ReadBool('Properties', 'Radians', Radians);
- Decimals.Value := RegCtrl.ReadInteger ('Properties', 'Decimals', Decimals.Value);
- Memory := RegCtrl.ReadFloat ('Properties', 'Memory', Memory);
- ThouSep := RegCtrl.ReadBool('Properties', 'UseThousandsSep', ThouSep);
-
- ThouSepItem.Checked := ThouSep;
-
- if Radians then
- RadBtn.Caption := 'rad'
- else
- RadBtn.Caption := 'deg';
-
- Application.HintPause := 500;
- Application.HintHidePause := 5000;
- Application.HintShortPause := 200;
-
- DisplayMemory
- end;
-
- procedure TESBCalcForm.DisplayValue (X: Extended);
- begin
- if ThouSep then
- ValueDisplay.Caption := LeftStr (Ext2CEStr (X, Decimals.Value), 16)
- else
- ValueDisplay.Caption := LeftStr (Ext2EStr (X, Decimals.Value), 16);
- end;
-
- procedure TESBCalcForm.UseConstant (const CValue: Extended);
- begin
- DisplayValue (CValue);
- Value := '';
- if OperandN >= High (OperandStack) then
- SetLength (OperandStack, OperandN + 5);
- Inc (OperandN);
- OperandStack [OperandN] := CValue;
- end;
-
- procedure TESBCalcForm.DisplayMemory;
- begin
- if ThouSep then
- MemoryDisplay.Caption := LeftStr (Ext2CEStr (Memory, Decimals.Value), 16)
- else
- MemoryDisplay.Caption := LeftStr (Ext2EStr (Memory, Decimals.Value), 16)
- end;
-
- function TESBCalcForm.HigherPrecedence (Op1, Op2: Char): Boolean;
- begin
- Result := ((Op1 in ['*', '/']) and (Op2 in ['+', '-']))
- or ((Op1 in ['^', '@', '%']) and (Op2 in ['*', '/', '+', '-']))
- or (Op2 = '(');
- end;
-
- procedure TESBCalcForm.StackManipulation;
- begin
- try
- case OperatorStack [OperatorN] of
- '+' :
- begin
- OperandStack [OperandN - 1] :=
- OperandStack [OperandN - 1] + OperandStack [OperandN];
- Dec (OperandN);
- end;
- '-' :
- begin
- OperandStack [OperandN - 1] :=
- OperandStack [OperandN - 1] - OperandStack [OperandN];
- Dec (OperandN);
- end;
- '*' :
- begin
- OperandStack [OperandN - 1] :=
- OperandStack [OperandN - 1] * OperandStack [OperandN];
- Dec (OperandN);
- end;
- '/' :
- begin
- if OperandStack [OperandN] = 0 then
- raise Exception.Create ('Division by Zero')
- else
- begin
- OperandStack [OperandN - 1] :=
- OperandStack [OperandN - 1] / OperandStack [OperandN];
- Dec (OperandN);
- end;
- end;
- '^' :
- begin
- OperandStack [OperandN - 1] :=
- Power (OperandStack [OperandN - 1], OperandStack [OperandN]);
- Dec (OperandN);
- end;
- '%' :
- begin
- OperandStack [OperandN - 1] :=
- OperandStack [OperandN - 1] * OperandStack [OperandN] / 100.0;
- Dec (OperandN);
- end;
- '@' :
- begin
- OperandStack [OperandN - 1] :=
- Power (OperandStack [OperandN - 1], 1 / OperandStack [OperandN]);
- Dec (OperandN);
- end;
- end;
- Dec (OperatorN);
- except
- AllClearBtn.Click;
- ValueDisplay.Caption := 'Error!';
- raise;
- end;
- end;
-
- procedure TESBCalcForm.Arithmetic (Ch: Char);
- begin
- try
- if Value <> '' then
- begin
- if OperandN >= High (OperandStack) then
- SetLength (OperandStack, OperandN + 5);
- Inc (OperandN);
- OperandStack [OperandN] := Str2Ext (Value);
- Value := '';
- end;
-
- while (OperatorN > -1) and not HigherPrecedence (Ch, OperatorStack [OperatorN]) do
- StackManipulation;
- if OperatorN >= High (OperatorStack) then
- SetLength (OperandStack, OperatorN + 5);
- Inc (OperatorN);
- OperatorStack [OperatorN] := Ch;
-
- if OperandN >= 0 then
- DisplayValue (OperandStack [OperandN])
- else
- ValueDisplay.Caption := '0';
- except
- AllClearBtn.Click;
- ValueDisplay.Caption := 'Error!';
- end;
- Inv := False;
- end;
-
- procedure TESBCalcForm.EqualsPressed;
- begin
- try
- if Value <> '' then
- begin
- if OperandN >= High (OperandStack) then
- SetLength (OperandStack, OperandN + 5);
- Inc (OperandN);
- OperandStack [OperandN] := Str2Ext (Value);
- Value := '';
- end;
-
- while (OperatorN >= 0) do
- StackManipulation;
- if OperandN > 0 then
- begin
- OperandStack [0] := OperandStack [OperandN];
- OperandN := 0;
- end;
-
- if OperandN >= 0 then
- DisplayValue (OperandStack [OperandN])
- else
- ValueDisplay.Caption := '0';
- Inv := False;
- except
- AllClearBtn.Click;
- ValueDisplay.Caption := 'Error!';
- end;
- end;
-
- procedure TESBCalcForm.ZeroBtnClick(Sender: TObject);
- begin
- Value := Value + '0';
- DisplayValue (Str2Ext (Value));
- Inv := False;
- end;
-
- procedure TESBCalcForm.OneBtnClick(Sender: TObject);
- begin
- Value := Value + '1';
- DisplayValue (Str2Ext (Value));
- Inv := False;
- end;
-
- procedure TESBCalcForm.TwoBtnClick(Sender: TObject);
- begin
- Value := Value + '2';
- DisplayValue (Str2Ext (Value));
- Inv := False;
- end;
-
- procedure TESBCalcForm.ThreeBtnClick(Sender: TObject);
- begin
- Value := Value + '3';
- DisplayValue (Str2Ext (Value));
- Inv := False;
- end;
-
- procedure TESBCalcForm.FourBtnClick(Sender: TObject);
- begin
- Value := Value + '4';
- DisplayValue (Str2Ext (Value));
- Inv := False;
- end;
-
- procedure TESBCalcForm.FiveBtnClick(Sender: TObject);
- begin
- Value := Value + '5';
- DisplayValue (Str2Ext (Value));
- Inv := False;
- end;
-
- procedure TESBCalcForm.SixBtnClick(Sender: TObject);
- begin
- Value := Value + '6';
- DisplayValue (Str2Ext (Value));
- Inv := False;
- end;
-
- procedure TESBCalcForm.SevenBtnClick(Sender: TObject);
- begin
- Value := Value + '7';
- DisplayValue (Str2Ext (Value));
- Inv := False;
- end;
-
- procedure TESBCalcForm.EightBtnClick(Sender: TObject);
- begin
- Value := Value + '8';
- DisplayValue (Str2Ext (Value));
- Inv := False;
- end;
-
- procedure TESBCalcForm.NineBtnClick(Sender: TObject);
- begin
- Value := Value + '9';
- DisplayValue (Str2Ext (Value));
- Inv := False;
- end;
-
- procedure TESBCalcForm.PointBtnClick(Sender: TObject);
- begin
- if Pos (DecimalSeparator, Value) = 0 then
- Value := Value + DecimalSeparator
- else
- Beep;
- DisplayValue (Str2Ext (Value));
- Inv := False;
- end;
-
- procedure TESBCalcForm.AddBtnClick(Sender: TObject);
- begin
- Arithmetic ('+');
- end;
-
- procedure TESBCalcForm.MultiplyBtnClick(Sender: TObject);
- begin
- Arithmetic ('*');
- end;
-
- procedure TESBCalcForm.DivideBtnClick(Sender: TObject);
- begin
- Arithmetic ('/');
- end;
-
- procedure TESBCalcForm.SubtractBtnClick(Sender: TObject);
- begin
- Arithmetic ('-');
- end;
-
- procedure TESBCalcForm.EqualsBtnClick(Sender: TObject);
- begin
- EqualsPressed;
- MRU.Add (ValueDisplay.Caption);
- end;
-
- procedure TESBCalcForm.DecimalsChange(Sender: TObject);
- begin
- if Value <> '' then
- DisplayValue (Str2Ext (Value))
- else
- DisplayValue (OperandStack [OperandN])
- end;
-
- procedure TESBCalcForm.ChangeSignBtnClick(Sender: TObject);
- var
- X: Extended;
- begin
- if Value <> '' then
- X := -1 * (Str2Ext (Value))
- else if OperandN > - 1 then
- X := -1 * (OperandStack [OperandN])
- else
- X := 0;
-
- DisplayValue (X);
- Value := '';
- if OperandN >= High (OperandStack) then
- SetLength (OperandStack, OperandN + 5);
- Inc (OperandN);
- OperandStack [OperandN] := X;
- end;
-
- procedure TESBCalcForm.LeftBracketBtnClick(Sender: TObject);
- begin
- Value := '';
- if OperatorN >= High (OperatorStack) then
- SetLength (OperatorStack, OperatorN + 5);
- Inc (OperatorN);
- OperatorStack [OperatorN] := '(';
-
- if OperandN >= 0 then
- DisplayValue (OperandStack [OperandN])
- else
- ValueDisplay.Caption := '0';
- end;
-
- procedure TESBCalcForm.RightBracketBtnClick(Sender: TObject);
- begin
- if Value <> '' then
- begin
- if OperandN >= High (OperandStack) then
- SetLength (OperandStack, OperandN + 5);
- Inc (OperandN);
- OperandStack [OperandN] := Str2Ext (Value);
- Value := '';
- end;
-
- while (OperatorN > -1) and (OperatorStack [OperatorN] <> '(') do
- StackManipulation;
- if OperatorN > -1 then
- Dec (OperatorN);
-
- if OperandN >= 0 then
- DisplayValue (OperandStack [OperandN])
- else
- ValueDisplay.Caption := '0';
- end;
-
- procedure TESBCalcForm.AllClearBtnClick(Sender: TObject);
- begin
- OperandN := -1;
- OperatorN := -1;
- Value := '';
- ValueDisplay.Caption := '0';
- end;
-
- procedure TESBCalcForm.ClearBtnClick(Sender: TObject);
- begin
- Value := '';
- ValueDisplay.Caption := '0';
- end;
-
- procedure TESBCalcForm.PowerBtnClick(Sender: TObject);
- begin
- if Inv then
- Arithmetic ('@')
- else
- Arithmetic ('^');
- Inv := False;
- end;
-
- procedure TESBCalcForm.PiButtonClick(Sender: TObject);
- begin
- UseConstant (Pi);
- end;
-
- procedure TESBCalcForm.EBtnClick(Sender: TObject);
- begin
- UseConstant (Exp (1));
- end;
-
- procedure TESBCalcForm.MemoryClearBtnClick(Sender: TObject);
- begin
- Memory := 0;
- DisplayMemory;
- Inv := False;
- end;
-
- procedure TESBCalcForm.MemoryAddBtnClick(Sender: TObject);
- begin
- if Value <> '' then
- Memory := Memory + Str2Ext (Value)
- else if OperandN > - 1 then
- Memory := Memory + OperandStack [OperandN];
- DisplayMemory;
- Inv := False;
- end;
-
- procedure TESBCalcForm.MemorySubtractBtnClick(Sender: TObject);
- begin
- if Value <> '' then
- Memory := Memory - Str2Ext (Value)
- else if OperandN > -1 then
- Memory := Memory - OperandStack [OperandN];
- DisplayMemory;
- Inv := False;
- end;
-
- procedure TESBCalcForm.MemoryRecallClick(Sender: TObject);
- begin
- DisplayValue (Memory);
- Value := '';
- if OperandN >= High (OperandStack) then
- SetLength (OperandStack, OperandN + 5);
- Inc (OperandN);
- OperandStack [OperandN] := Memory;
- Inv := False;
- end;
-
- procedure TESBCalcForm.SquareBtnClick(Sender: TObject);
- var
- X: Extended;
- begin
- if Inv then
- begin
- Inv := False;
- SqRootBtn.Click;
- end;
- try
- if Value <> '' then
- X := Sqr (Str2Ext (Value))
- else if OperandN > - 1 then
- X := Sqr (OperandStack [OperandN])
- else
- X := 0;
-
- DisplayValue (X);
- Value := '';
- if OperandN >= High (OperandStack) then
- SetLength (OperandStack, OperandN + 5);
- Inc (OperandN);
- OperandStack [OperandN] := X;
- except
- AllClearBtn.Click;
- ValueDisplay.Caption := 'Error!'
- end;
- end;
-
- procedure TESBCalcForm.InverseBtnClick(Sender: TObject);
- var
- X: Extended;
- begin
- Inv := False;
- try
- if Value <> '' then
- begin
- X := Str2Ext (Value);
- if X = 0 then
- raise Exception.Create ('Division by Zero')
- else
- X := 1 / X;
- end
- else if OperandN > - 1 then
- begin
- if OperandStack [OperandN] = 0 then
- raise Exception.Create ('Division by Zero')
- else
- X := 1 / OperandStack [OperandN]
- end
- else
- raise Exception.Create ('Invalid Inverse');
-
- DisplayValue (X);
- Value := '';
- if OperandN >= High (OperandStack) then
- SetLength (OperandStack, OperandN + 5);
- Inc (OperandN);
- OperandStack [OperandN] := X;
- except
- AllClearBtn.Click;
- ValueDisplay.Caption := 'Error!'
- end;
- end;
-
- procedure TESBCalcForm.SqRootBtnClick(Sender: TObject);
- var
- X: Extended;
- begin
- if Inv then
- begin
- Inv := False;
- SquareBtn.Click;
- end;
-
- try
- if Value <> '' then
- begin
- X := Str2Ext (Value);
- if X < 0 then
- raise Exception.Create ('Square Root of Negative')
- else
- X := Sqrt (X)
- end
- else if OperandN > - 1 then
- begin
- if OperandStack [OperandN] < 0 then
- raise Exception.Create ('Square Root of Negative')
- else
- X := Sqrt (OperandStack [OperandN])
- end
- else
- X := 0;
-
- DisplayValue (X);
- Value := '';
- if OperandN >= High (OperandStack) then
- SetLength (OperandStack, OperandN + 5);
- Inc (OperandN);
- OperandStack [OperandN] := X;
- except
- AllClearBtn.Click;
- ValueDisplay.Caption := 'Error!'
- end;
- end;
-
- procedure TESBCalcForm.ExitBtnClick(Sender: TObject);
- begin
- Close;
- end;
-
- procedure TESBCalcForm.LogBtnClick(Sender: TObject);
- var
- X: Extended;
- begin
- try
- if Value <> '' then
- begin
- if Inv then
- X := Power (10, Str2Ext (Value))
- else
- X := Log10 (Str2Ext (Value))
- end
- else if OperandN > - 1 then
- begin
- if Inv then
- X := Power (10, OperandStack [OperandN])
- else
- X := Log10 (OperandStack [OperandN])
- end
- else
- X := 0;
- Inv := False;
-
- DisplayValue (X);
- Value := '';
- if OperandN >= High (OperandStack) then
- SetLength (OperandStack, OperandN + 5);
- Inc (OperandN);
- OperandStack [OperandN] := X;
- except
- AllClearBtn.Click;
- ValueDisplay.Caption := 'Error!'
- end;
- end;
-
- procedure TESBCalcForm.LNBtnClick(Sender: TObject);
- var
- X: Extended;
- begin
- try
- if Value <> '' then
- begin
- if Inv then
- X := Exp (Str2Ext (Value))
- else
- X := Ln (Str2Ext (Value))
- end
- else if OperandN > - 1 then
- begin
- if Inv then
- X := Exp (OperandStack [OperandN])
- else
- X := Ln (OperandStack [OperandN])
- end
- else
- X := 0;
- Inv := False;
-
- DisplayValue (X);
- Value := '';
- if OperandN >= High (OperandStack) then
- SetLength (OperandStack, OperandN + 5);
- Inc (OperandN);
- OperandStack [OperandN] := X;
- except
- AllClearBtn.Click;
- ValueDisplay.Caption := 'Error!'
- end;
- end;
-
- procedure TESBCalcForm.SinBtnClick(Sender: TObject);
- var
- X: Extended;
- begin
- try
- if Value <> '' then
- X := Str2Ext (Value)
- else if OperandN > - 1 then
- X := OperandStack [OperandN]
- else
- X := 0;
-
- if Inv then
- begin
- X := ArcSin (X);
- if not Radians then
- X := X * 180.0 / Pi;
- end
- else
- begin
- if not Radians then
- X := X * Pi / 180.0;
- X := Sin (X)
- end;
- Inv := False;
-
- DisplayValue (X);
- Value := '';
- if OperandN >= High (OperandStack) then
- SetLength (OperandStack, OperandN + 5);
- Inc (OperandN);
- OperandStack [OperandN] := X;
- except
- AllClearBtn.Click;
- ValueDisplay.Caption := 'Error!'
- end;
- end;
-
- procedure TESBCalcForm.CosBtnClick(Sender: TObject);
- var
- X: Extended;
- begin
- try
- if Value <> '' then
- X := Str2Ext (Value)
- else if OperandN > - 1 then
- X := OperandStack [OperandN]
- else
- X := 0;
-
- if Inv then
- begin
- X := ArcCos (X);
- if not Radians then
- X := X * 180.0 / Pi;
- end
- else
- begin
- if not Radians then
- X := X * Pi / 180.0;
- X := Cos (X)
- end;
- Inv := False;
-
- DisplayValue (X);
- Value := '';
- if OperandN >= High (OperandStack) then
- SetLength (OperandStack, OperandN + 5);
- Inc (OperandN);
- OperandStack [OperandN] := X;
- except
- AllClearBtn.Click;
- ValueDisplay.Caption := 'Error!'
- end;
- end;
-
- procedure TESBCalcForm.TanBtnClick(Sender: TObject);
- var
- X: Extended;
- begin
- try
- if Value <> '' then
- X := Str2Ext (Value)
- else if OperandN > - 1 then
- X := OperandStack [OperandN]
- else
- X := 0;
-
- if Inv then
- begin
- X := ArcTan (X);
- if not Radians then
- X := X * 180.0 / Pi;
- end
- else
- begin
- if not Radians then
- X := X * Pi / 180.0;
- X := Tan (X)
- end;
- Inv := False;
-
- DisplayValue (X);
- Value := '';
- if OperandN >= High (OperandStack) then
- SetLength (OperandStack, OperandN + 5);
- Inc (OperandN);
- OperandStack [OperandN] := X;
- except
- AllClearBtn.Click;
- ValueDisplay.Caption := 'Error!'
- end;
- end;
-
- procedure TESBCalcForm.InvBtnClick(Sender: TObject);
- begin
- Inv := not Inv;
- end;
-
- procedure TESBCalcForm.PasteBtnClick(Sender: TObject);
- var
- X: Extended;
- begin
- if Clipboard.HasFormat (CF_Text) then
- begin
- X := Str2Ext (Clipboard.AsText);
- DisplayValue (X);
- Value := '';
- if OperandN >= High (OperandStack) then
- SetLength (OperandStack, OperandN + 5);
- Inc (OperandN);
- OperandStack [OperandN] := X;
- end;
- end;
-
- procedure TESBCalcForm.CopyBtnClick(Sender: TObject);
- begin
- Clipboard.AsText := ValueDisplay.Caption;
- end;
-
- procedure TESBCalcForm.FormKeyPress(Sender: TObject; var Key: Char);
- begin
- case Key of
- #8: BackSpaceBtn.Click;
- #13: EqualsBtn.Click;
- #27: ExitBtn.Click;
- '(': LeftBracketBtn.Click;
- ')': RightBracketBtn.Click;
- '*': MultiplyBtn.Click;
- '+': AddBtn.Click;
- '-': SubtractBtn.Click;
- '/': DivideBtn.Click;
- '0': ZeroBtn.Click;
- '1': OneBtn.Click;
- '2': TwoBtn.Click;
- '3': ThreeBtn.Click;
- '4': FourBtn.Click;
- '5': FiveBtn.Click;
- '6': SixBtn.Click;
- '7': SevenBtn.Click;
- '8': EightBtn.Click;
- '9': NineBtn.Click;
- 'A': AllClearBtn.Click;
- 'C': ClearBtn.Click;
- end;
- if Key = DecimalSeparator then
- PointBtn.Click;
- end;
-
- procedure TESBCalcForm.FormKeyDown(Sender: TObject; var Key: Word;
- Shift: TShiftState);
- begin
- if ssCtrl in Shift then
- begin
- case Key of
- VK_C, VK_Insert: CopyBtn.Click;
- VK_V: PasteBtn.Click;
- VK_X: ExitBtn.Click;
- end;
- end;
- if ssShift in Shift then
- begin
- case Key of
- VK_Insert: PasteBtn.Click;
- end;
- end;
- end;
-
- procedure TESBCalcForm.BackSpaceBtnClick(Sender: TObject);
- begin
- if Value <> '' then
- begin
- Value := Copy (Value, 1, Length (Value) - 1);
- DisplayValue (Str2Ext (Value));
- end;
- Inv := False;
- end;
-
- procedure TESBCalcForm.AboutBtnClick(Sender: TObject);
- begin
- ESBCalcAbout.Execute
- end;
-
- procedure TESBCalcForm.RadBtnClick(Sender: TObject);
- begin
- Radians := not Radians;
- if Radians then
- RadBtn.Caption := 'rad'
- else
- RadBtn.Caption := 'deg';
- end;
-
- procedure TESBCalcForm.FormDestroy(Sender: TObject);
- begin
- RegCtrl.WriteBool('Properties', 'Radians', Radians);
- RegCtrl.WriteInteger ('Properties', 'Decimals', Decimals.Value);
- RegCtrl.WriteFloat ('Properties', 'Memory', Memory);
- RegCtrl.WriteBool('Properties', 'UseThousandsSep', ThouSep);
- end;
-
- procedure TESBCalcForm.MRUClick(Sender: TObject; const aValue: String;
- var Remove: Boolean);
- var
- X: Extended;
- begin
- X := Str2Ext (aValue);
- DisplayValue (X);
- Value := '';
- if OperandN >= High (OperandStack) then
- SetLength (OperandStack, OperandN + 5);
- Inc (OperandN);
- OperandStack [OperandN] := X;
- Inv := False;
- end;
-
- procedure TESBCalcForm.ThouSepItemClick(Sender: TObject);
- begin
- ThouSep := not ThouSep;
- ThouSepItem.Checked := ThouSep;
- DisplayMemory;
- Inv := False;
- end;
-
- procedure TESBCalcForm.MinItemClick(Sender: TObject);
- begin
- Application.Minimize;
- end;
-
- procedure TESBCalcForm.ExitItemClick(Sender: TObject);
- begin
- Close;
- end;
-
- procedure TESBCalcForm.PercentBtnClick(Sender: TObject);
- begin
- Arithmetic ('%');
- Inv := False;
- end;
-
- procedure TESBCalcForm.GammaItemClick(Sender: TObject);
- begin
- UseConstant (0.577215664901532860606512);
- end;
-
- procedure TESBCalcForm.LightItemClick(Sender: TObject);
- begin
- UseConstant (299792.500);
- end;
-
- procedure TESBCalcForm.GravityItemClick(Sender: TObject);
- begin
- UseConstant (9.80665);
- end;
-
- procedure TESBCalcForm.CaptionButton1Click(Sender: TObject);
- begin
- Application.Minimize;
- end;
-
- end.
-