home *** CD-ROM | disk | FTP | other *** search
/ Chip 1999 January / Chip_1999-01_cd.bin / zkuste / delphi / D1 / COOLCALC.ZIP / CCALCDLG.PAS < prev    next >
Pascal/Delphi Source File  |  1995-09-18  |  10KB  |  274 lines

  1.     { Cool Calculator 1.3, 
  2.  
  3.   Copyright (c) 1995, Desmond F. Nolan, All Rights Reserved. }
  4.  
  5. unit Ccalcdlg;
  6.  
  7.     { This program uses tabs at every 3 spaces. }
  8.  
  9.   {BACKGROUND: The Cool Calculator Version 1.3 program is part of
  10.     the Pie Right family of software products produced by abc Systems. As
  11.   of August 20, 95 the Pie Right Software Family consists of a number of
  12.   small and relatively simple Delphi programs which we have been using
  13.   to develop our Delphi skills. All versions of these programs are
  14.   currently being made available for use by individuals and organizations
  15.   without charge through the Borland Delphi forums on CompuServe. 
  16.  
  17.     Cool Calculator 1.2 is a simple business calculator in which you
  18.   can either type your expressions (including use of parentheses)
  19.   are build them by clicking on a collection of buttons (1, 2, 3,
  20.   4, 5, 6, 7, 8, 9, 0, (, ), *, +, -, /, =). Pysically it is a simple
  21.   interface (Delphi Form) to an expression evaluation engine
  22.   originally written by James L. Dean in 1985, and overhauled and
  23.   enhanced by David J. Firth in 1991. 
  24.  
  25.   We have not surfaced all the functionality of David's program, but
  26.   it is not difficult to do so, if you are so inclined. Things left
  27.   unsurfaced are: ABS, ARCTAN, COS, EXP, LN, SQR, SQRT, and PI
  28.   functions, along with the ability to use variables.
  29.  
  30.     The code for David J. Wirth's version of the evaluation engine and
  31.   his additional RPN evaluation engine can be found on the Delphi
  32.   forum on CompuServe in the file called EEV10.ZIP. In extending the
  33.   Cool Calculator are using the calculation engine in your programs
  34.   you will want to download that file. We have included some of
  35.   David's information about his program below.
  36.  
  37.   We are also the producers of Yowser Browser Version 1.2 and
  38.   just in case you didn't know, Yowser Browser is a program
  39.   which allows you browse long descriptions of all files uploaded to 
  40.   CompuServe's Delphi forum (that is uploaded prior to the last data
  41.   update of Yowser Browser). Yowser Browser allows you set various
  42.   filters to focus in on datasets, sort by different keys, search
  43.   across all libraries, and the actual text of file descriptions
  44.   themselves (i.e. you are not restricted to just searching file titles
  45.   and keywords). Data for Yowser Browser is gathered by a program 
  46.   called Import File Descriptions Version 1.2.
  47.  
  48.     We are currently amusing ourselves with a statistical program that will
  49.   return variance, standard variance, average deviation, and some other
  50.   statistics for table based data. This done, we will probably move on to
  51.   other math programs and would appreciate hearing from others who are 
  52.   doing similar, and more importantly those who might like to exchange code.
  53.   It may seem strange to be doing these things in Delphi/Pascal instead of
  54.   C, C++, or FORTRAN, and probable is, but now and again we get upset
  55.   that we are not putting our years of math, statistical and econometrical
  56.   training to use and break done and practice some of our old lessons in
  57.   whatever language we are currently working with.
  58.  
  59.           ********************************************************
  60.  
  61.   IF YOU HAVE ANY QUESTIONS ASK:
  62.  
  63.       Des Nolan, Principal Consultant
  64.      Advanced Business Continuity Systems, Inc.
  65.      d/b/a abc Systems
  66.      Bridgeport, CT
  67.      Compuserve: 73150,350
  68.         Phone: (203) 373-1021
  69.  
  70.      "We are available for consulting assignments<g>."
  71.  
  72.           ********************************************************
  73.  
  74.   DISCLAIMER: This program is supplied free for individual use and is
  75.   supplied as-is. I Des Nolan and abc Systems explicitly disclaims
  76.   all responsibility for its use or misuse by anybody. Also, no
  77.   warranties whatsoever are offered for this program, including any
  78.   form of merchanability. Permission to use this program is given
  79.   to individuals and companies only if they are willing to assume
  80.   ALL risk for its use.
  81.  
  82.   This program may not be sold are incorporated in another product
  83.   or service without the prior permission of the author.
  84.  
  85.               ***************************************************
  86.  
  87.              "Thanks for downloading this program and taking a look."
  88.  
  89.               ***************************************************
  90.   }
  91.  
  92.  
  93.       {===========================================================
  94.                                  Interface
  95.       ===========================================================}
  96. interface
  97.  
  98. uses
  99.   SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls,
  100.   Forms, Dialogs, InFix, StdCtrls, ExtCtrls, IniFiles, AboutDlg;
  101.  
  102. type
  103.   TdlgCalculator = class(TForm)
  104.     edtExpression: TEdit;
  105.     btn3: TButton;
  106.     lblResult: TLabel;
  107.     btn1: TButton;
  108.     btn4: TButton;
  109.     btn7: TButton;
  110.     btn2: TButton;
  111.     btn5: TButton;
  112.     btn8: TButton;
  113.     btn9: TButton;
  114.     btn6: TButton;
  115.     btn0: TButton;
  116.     btnDecimal: TButton;
  117.     btnEquals: TButton;
  118.     btnDivide: TButton;
  119.     btnMultiply: TButton;
  120.     btnMinus: TButton;
  121.     btnPlus: TButton;
  122.     btnExampleA: TButton;
  123.     btnClear: TButton;
  124.     btnLeftBracket: TButton;
  125.     btnRightBracket: TButton;
  126.     btnBackSpace: TButton;
  127.     btnEnter: TButton;
  128.     shpLine: TShape;
  129.     btnAbout: TButton;
  130.     lblEqualSign: TLabel;
  131.     procedure btnExampleAClick(Sender: TObject);
  132.     procedure btn1Click(Sender: TObject);
  133.     procedure btnEqualsClick(Sender: TObject);
  134.     procedure btnClearClick(Sender: TObject);
  135.     procedure btnBackSpaceClick(Sender: TObject);
  136.     procedure edtExpressionKeyUp(Sender: TObject; var Key: Word;
  137.       Shift: TShiftState);
  138.     procedure btnAboutClick(Sender: TObject);
  139.     procedure FormCreate(Sender: TObject);
  140.     procedure EvaluateExp(Const MyExpr : string);
  141.     procedure addChar(Sender: TObject);
  142.   private
  143.     { Private declarations }
  144.   public
  145.     { Public declarations }
  146.   end;
  147.     real = extended;        { Used for compatibility with evaluation engine. }
  148.  
  149. var
  150.   dlgCalculator: TdlgCalculator;
  151.   vbFormatResult : Boolean;
  152.   vlWidth, vlNumOfDecs : LongInt;
  153.  
  154.       {===========================================================
  155.                                  Implementation
  156.       ===========================================================}
  157. implementation
  158.  
  159. {$R *.DFM}
  160.  
  161.     {------------------------------------------------------
  162.    Call function from evaluation engine and display result.
  163.      ------------------------------------------------------}
  164. procedure TdlgCalculator.EvaluateExp(Const MyExpr : string);
  165. var
  166.     MyErr    : Byte;
  167.   MyAddr : String[20];
  168.   vsResult : String;
  169.   MyResult : Real;
  170.   vlPadNumber : LongInt;
  171. begin
  172.     MyErr := 0;
  173.   MyResult := 0.0;
  174.   InFix.RawCalculate(MyExpr, MyResult, MyErr);
  175.   if vbFormatResult then
  176.       begin
  177.             Str(MyResult:vlWidth:vlNumOfDecs, vsResult);
  178.           lblResult.Caption := vsResult;
  179.      end
  180.   else
  181.         lblResult.Caption := FloatToStr(MyResult);
  182. end;
  183.  
  184.     {------------------------------------------------------
  185.    Add button label to expression field.
  186.      ------------------------------------------------------}
  187. procedure TdlgCalculator.addChar(Sender: TObject);
  188. var
  189.     btn : TButton;
  190. begin
  191.     btn := TButton(Sender);
  192.     edtExpression.Text := edtExpression.Text + btn.Caption;
  193. end;
  194.  
  195.     {-------------------------------------------------------
  196.    User clicked one of the calculators std buttons call the
  197.    method that adds the same character as the caption of
  198.    the button to the edit field for the expression.
  199.    -------------------------------------------------------}
  200. procedure TdlgCalculator.btn1Click(Sender: TObject);
  201. begin
  202.     addChar(Sender);
  203. end;
  204.  
  205.     {-------------------------------------------------------
  206.    "=" button was clicked so evaluate expression.
  207.    -------------------------------------------------------}
  208. procedure TdlgCalculator.btnEqualsClick(Sender: TObject);
  209. begin
  210.     EvaluateExp(edtExpression.Text);
  211. end;
  212.  
  213.     {-------------------------------------------------------
  214.    "Clear" button was clicked so erase expression & result.
  215.    -------------------------------------------------------}
  216. procedure TdlgCalculator.btnClearClick(Sender: TObject);
  217. begin
  218.     edtExpression.Clear;
  219.     lblResult.Caption := '';
  220. end;
  221.  
  222.     {-------------------------------------------------------
  223.    "Backspace" button was erase last character, (actually
  224.    the expression is redisplayed without the last character).
  225.    -------------------------------------------------------}
  226. procedure TdlgCalculator.btnBackSpaceClick(Sender: TObject);
  227. begin
  228.     edtExpression.Text := copy(edtExpression.Text, 1, length(edtExpression.Text) -1);            
  229. end;
  230.  
  231.     {-------------------------------------------------------
  232.    "Example A" button was clicked so insert sample expression
  233.    along with displaying result after evaulating it.
  234.    -------------------------------------------------------}
  235. procedure TdlgCalculator.btnExampleAClick(Sender: TObject);
  236. begin
  237.     edtExpression.Text := '((10*10)-50)/10';
  238.     EvaluateExp(edtExpression.Text);
  239. end;
  240.  
  241.     {-------------------------------------------------------
  242.    "Print" button was clicked so print expression & result.
  243.    -------------------------------------------------------}
  244. {-------------------------------------------------------
  245.    If "Enter" key is pressed while edit field has focus
  246.    evaluate the current expression and show the result.
  247.    -------------------------------------------------------}
  248. procedure TdlgCalculator.edtExpressionKeyUp(Sender: TObject; var Key: Word;
  249.   Shift: TShiftState);
  250. begin
  251.     if key = VK_Return then
  252.         EvaluateExp(edtExpression.Text);
  253. end;
  254.  
  255. procedure TdlgCalculator.btnAboutClick(Sender: TObject);
  256. begin
  257.     dlgAboutBox := TdlgAboutBox.Create(Self);
  258.   dlgAboutBox.ShowModal;
  259.   dlgAboutBox.Free;
  260. end;
  261.  
  262. procedure TdlgCalculator.FormCreate(Sender: TObject);
  263. var
  264.     Ini : TIniFile;
  265. begin
  266.     Ini := TIniFile.Create('CoolCalc.INI');
  267.     vbFormatResult := Ini.readBool('Calculator Options', 'Format Result', True);
  268.     vlWidth := Ini.readInteger('Calculator Options', 'Width', 1);
  269.     vlNumOfDecs := Ini.readInteger('Calculator Options', 'Number Of Decimals', 2);
  270.     Ini.Free;
  271. end;
  272.  
  273. end.
  274.