Hope this helps Delphi users just starting out. JMcSub 18:34, June 14, 2010 (UTC)
JMcSub, thank you for your article. Some things I would do different is use enumerations instead of string indicators. i.e.
Type TMathCalculation = (mcNone, mcAddition, mcSubtraction, mcDivision, mcMultplication);
This will help with any typo's.
Also try prevent code repetition.
To prevent this I use procedure InputNumber with the same parameters as an onclick event. in there i use the caption of the button to fill the edit. Instead of 11 onclick events there is just 1.
Also to prevent the error which you can get when the program is used on a pc with a different decimal seperator then the '.'
mind you i used some different names for some of the components and functions
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Math, StrUtils; Type TMathCalculation = (mcNone, mcAddition, mcSubtraction, mcDivision, mcMultiplication); type TCalculatorForm = class(TForm) edtNumber: TEdit; btn1: TButton; btn2: TButton; btn3: TButton; btn4: TButton; btn5: TButton; btn6: TButton; btn7: TButton; btn8: TButton; btn9: TButton; btn0: TButton; btnNegativePositive: TButton; btnClear: TButton; btnReset: TButton; btnEnter: TButton; lblOutcome: TLabel; btnAddition: TButton; btnSubtraction: TButton; btnDivision: TButton; btnMultiplication: TButton; btnDecimal: TButton; procedure InputNumber(Sender: TObject); procedure btnNegativePositiveClick(Sender: TObject); procedure btnClearClick(Sender: TObject); procedure btnResetClick(Sender: TObject); procedure btnAdditionClick(Sender: TObject); procedure btnSubtractionClick(Sender: TObject); procedure btnDivisionClick(Sender: TObject); procedure btnMultiplicationClick(Sender: TObject); procedure btnEnterClick(Sender: TObject); procedure FormCreate(Sender: TObject); private FMath: TMathCalculation; FNumber: Real; procedure SetCalculationType(CalcType: TMathCalculation); public { Public declarations } end; var CalculatorForm: TCalculatorForm; implementation {$R *.dfm} procedure TCalculatorForm.InputNumber(Sender: TObject); begin edtNumber.Text := edtNumber.Text + (Sender as TButton).Caption; end; procedure TCalculatorForm.btnNegativePositiveClick(Sender: TObject); var OriginalNumber: Real; TextNumber: string; begin edtNumber.Text := FloatToStr(-(StrToFloat(edtNumber.Text))); end; procedure TCalculatorForm.btnClearClick(Sender: TObject); begin edtNumber.Clear; end; procedure TCalculatorForm.btnResetClick(Sender: TObject); begin lblOutcome.Caption := ''; edtNumber.Clear; FNumber := 0; FMath := mcNone; end; procedure TCalculatorForm.SetCalculationType(CalcType: TMathCalculation); begin FMath := CalcType; FNumber := StrToFloat(edtNumber.Text); edtNumber.Clear; end; procedure TCalculatorForm.btnAdditionClick(Sender: TObject); begin SetCalculationType(mcAddition); end; procedure TCalculatorForm.btnSubtractionClick(Sender: TObject); begin SetCalculationType(mcSubtraction); end; procedure TCalculatorForm.btnDivisionClick(Sender: TObject); begin SetCalculationType(mcDivision); end; procedure TCalculatorForm.btnMultiplicationClick(Sender: TObject); begin SetCalculationType(mcMultiplication); end; procedure TCalculatorForm.btnEnterClick(Sender: TObject); const CalcOperators: String= '+-/*'; var Answer, SNumber: real; FNumberText,SNumberText,OutComeText: string; CalcOperator: Char; begin SNumber := StrToFloat(edtNumber.Text); case FMath of mcAddition: Answer := FNumber + SNumber; mcSubtraction: Answer := FNumber - SNumber; mcDivision: Answer := FNumber / SNumber; mcMultiplication: Answer := FNumber * SNumber; else Answer := NaN; end; OutComeText := FormatFloat('0.#####', Answer); FNumberText := FormatFloat('0.#####', FNumber); CalcOperator := CalcOperators[Integer(FMath)]; SNumberText := FormatFloat('0.#####', SNumber); lblOutcome.Caption := FNumberText + ' ' + CalcOperator + ' ' + SNumberText + ' = ' + OutComeText; edtNumber.Clear; end; procedure TCalculatorForm.FormCreate(Sender: TObject); begin btnDecimal.Caption := DecimalSeparator; end; end.
Maybe I will change some things in your article later when I get home Xsintill 08:37, June 15, 2010 (UTC)
Yep, those look like great changes! Thanks! JMcSub 13:36, June 15, 2010 (UTC)
I tried to implement your "InputNumber" procedure into my code, but I could not get it to work. Do I need to create an OnClick event that calls this procedure as a sub-routine for every number button? Thanks. JMcSub 13:31, June 16, 2010 (UTC)
- what you should do is put the InputNumber procedure in the same section as where delphi puts it's generated code. After that you can go to the onclick event in the object inspector and use the combobox to select the InputNumber procedure. i am building up a new machine at home. haven't got delphi here. Xsintill 15:56, June 16, 2010 (UTC)
- --------Okay, I gotch'a. I changed that portion of the article, too. I'll try to implement the other changes, too. JMcSub 16:07, June 16, 2010 (UTC)