I got such a calculator:
First we declare the global variables in the var section.
First, Second: Extended; Operation, OldOperation: Char; WasCount, Selected, Count, Counted: Boolean;
Then we declare 2 procedures in the private section:
private { private declarations } Procedure AddDigit(Sender: TObject); // для добавления цифры Procedure SelectOperation(Sender: TObject); // для выбора операции
Let's write their code. Add a number to Edit:
procedure TCalculatorForm.AddDigit(Sender: TObject); begin If (EditCalc.Text='0') Then If ((Sender As TButton).Caption=DecimalSeparator) Then Begin If (Selected) Then Begin EditCalc.Text:='0,'; Selected:=False; End Else EditCalc.Text:=EditCalc.Text+DecimalSeparator; (Sender As TButton).Enabled:=False; End Else EditCalc.Text:=(Sender As TButton).Caption Else If (((Sender As TButton).Caption=DecimalSeparator)) Then Begin If (Selected) Then Begin EditCalc.Text:=(Sender As TButton).Caption; Selected:=False; End Else EditCalc.Text:=EditCalc.Text+(Sender As TButton).Caption; (Sender As TButton).Enabled:=False; End Else If (Selected) Then Begin EditCalc.Text:=(Sender As TButton).Caption; Selected:=False; End Else EditCalc.Text:=EditCalc.Text+(Sender As TButton).Caption; end;
Choose an action:
procedure TCalculatorForm.SelectOperation(Sender: TObject); Var StrText: String; begin If (Selected) Then Exit; If Not(ButtonDot.Enabled) Then ButtonDot.Enabled:=True; If (Counted) Then Begin Operation:=(Sender As TButton).Caption[1]; Selected:=True; Counted:=False; Exit; End; If (Count) Then Begin Second:=StrToFloat(EditCalc.Text); If (WasCount) Then Begin OldOperation:=Operation; Operation:=(Sender As TButton).Caption[1]; Case OldOperation Of '+': First:=First+Second; '-': First:=First-Second; '*': First:=First*Second; '/': First:=First/Second; End; End Else Begin Case Operation Of '+': First:=First+Second; '-': First:=First-Second; '*': First:=First*Second; '/': First:=First/Second; End; WasCount:=True; Operation:=(Sender As TButton).Caption[1]; End; EditCalc.Text:=FloatToStr(First); EditCalc.Repaint; Selected:=True; End Else Begin Operation:=(Sender As TButton).Caption[1]; StrText:=EditCalc.Text; EditCalc.Text:=''; EditCalc.Repaint; Sleep(200); EditCalc.Text:=StrText; EditCalc.Repaint; First:=StrToFloat(EditCalc.Text); Selected:=True; Count:=True; WasCount:=False; End; end;
Create an OnCreate handler for the form to set flag values.
procedure TCalculatorForm.FormCreate(Sender: TObject); begin Counted:=False; // равно ещё не нажимали WasCount:=False; // первое действие ещё не выбрано {ставим разделитель: точка или запятая - это зависит от настроек системы, поэтому используем переменную DecimalSeparator (объявлять не надо!)} ButtonDot.Caption:=DecimalSeparator; end;
Now let's connect our procedures with buttons. To do this, on one of the buttons, add a number (or a separator) to write it in the OnClick event and pass this event to the other buttons. For example, for a button that adds 0:
procedure TCalculatorForm.Button0Click(Sender: TObject); begin AddDigit(Sender); end;
We do the same with all buttons for actions (+, -, *, /). I chose a plus:
procedure TCalculatorForm.ButtonPlusClick(Sender: TObject); begin SelectOperation(Sender); end;
Handler for the equal button:
procedure TCalculatorForm.ButtonResultClick(Sender: TObject); begin If Not (Counted) Then Begin Second:=StrToFloat(EditCalc.Text); Counted:=True; End; Case Operation Of '+': First:=First+Second; '-': First:=First-Second; '*': First:=First*Second; '/': First:=First/Second; End; EditCalc.Text:=FloatToStr(First); EditCalc.Repaint; If (Selected) Then Selected:=False; end;
And finally, the handler for the reset button:
procedure TCalculatorForm.ButtonCeClick(Sender: TObject); begin EditCalc.Text:='0'; If Not(ButtonDot.Enabled) Then ButtonDot.Enabled:=True; First:=0; Second:=0; If (WasCount) Then WasCount:=False; If (Selected) Then Selected:=False; If (Counted) Then Counted:=False; If (Count) Then Count:=False; end;