unit Unit1;
// мій перший калькулятор
// + лабораторна робота 5: "Вивчення компонентів MainMenu, PopupMenu, SpeedButton,
// CheckBox, RadioButton, RadioGroup, BitBtn, Panel"
interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Buttons, Menus, Math;

type
  TForm1 = class(TForm)
    Edit1: TEdit;
    Label1: TLabel;
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    Button4: TButton;
    Button5: TButton;
    Button6: TButton;
    Button7: TButton;
    Button8: TButton;
    Button9: TButton;
    Button10: TButton;
    Button11: TButton;
    Button12: TButton;
    Button13: TButton;
    Button14: TButton;
    Button15: TButton;
    Button16: TButton;
    Button17: TButton;
    BitBtn1: TBitBtn;
    MainMenu1: TMainMenu;
    N1: TMenuItem;
    N2: TMenuItem;
    N3: TMenuItem;
    N4: TMenuItem;
    N5: TMenuItem;
    N6: TMenuItem;
    N7: TMenuItem;
    N8: TMenuItem;
    N9: TMenuItem;
    N10: TMenuItem;
    N11: TMenuItem;
    N12: TMenuItem;
    Button18: TButton;
    Button19: TButton;
    Button20: TButton;
    Button21: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button16Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button6Click(Sender: TObject);
    procedure Button8Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);
    procedure Button5Click(Sender: TObject);
    procedure Button7Click(Sender: TObject);
    procedure Button17Click(Sender: TObject);
    procedure Button19Click(Sender: TObject);
    procedure Button20Click(Sender: TObject);
    procedure Edit1KeyPress(Sender: TObject; var Key: Char);
    procedure Button15Click(Sender: TObject);
    procedure Button18Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure Button14Click(Sender: TObject);
    procedure Button13Click(Sender: TObject);
    procedure Button12Click(Sender: TObject);
    procedure Button11Click(Sender: TObject);
    procedure Button10Click(Sender: TObject);
    procedure Button9Click(Sender: TObject);
    procedure Button21Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
    rez: real;  // тут зберігається результат обчислень
    deistvie: byte; // ця зміна показує, яку останню дію вибрав користувач
    kilk: integer; // показує кількість виконаних дій - +, -, /, * і т. д.
    kn_dorivn: boolean; // показує чи була тільки що натиснуто "="
    act_chislo: real;
    dop_per: real;
  end;

var
  Form1: TForm1;


implementation

{$R *.dfm}

procedure Form1.Obchislennia(var deistvie:byte; kilk:integer; rez: real; act_chislo:real);
begin
  case deistvie of
    1:
      begin
        if kilk<>0 then
          begin
            rez:= rez+act_chislo;
            act_chislo:= StrToFloat(Edit1.Text);
          end;
      end;
    2:
      begin
        if kilk<>0 then
          begin
            rez:= rez-act_chislo;
            act_chislo:= StrToFloat(Edit1.Text);
          end;
      end;
    3:
      begin
        if kilk<>0 then
          begin
            rez:= rez*act_chislo;
            act_chislo:= StrToFloat(Edit1.Text);
          end;
      end;
    4:
      begin
        if kilk<>0 then
          begin
            rez:= rez/act_chislo;
            act_chislo:= StrToFloat(Edit1.Text);
          end;
      end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  Edit1.Text:= Edit1.Text+'1';
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  Edit1.Text:= Edit1.Text+'2';
end;

procedure TForm1.Button16Click(Sender: TObject);
begin
  Edit1.Text:= Edit1.Text+'3';
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
  Edit1.Text:= Edit1.Text+'4';
end;

procedure TForm1.Button6Click(Sender: TObject);
begin
  Edit1.Text:= Edit1.Text+'5';
end;

procedure TForm1.Button8Click(Sender: TObject);
begin
  Edit1.Text:= Edit1.Text+'6';
end;

procedure TForm1.Button4Click(Sender: TObject);
begin
  Edit1.Text:= Edit1.Text+'7';
end;

procedure TForm1.Button5Click(Sender: TObject);
begin
  Edit1.Text:= Edit1.Text+'8';
end;

procedure TForm1.Button7Click(Sender: TObject);
begin
  Edit1.Text:= Edit1.Text+'9';
end;

procedure TForm1.Button17Click(Sender: TObject);  // кнопка "0"
var
  i: integer;
  b, d: boolean;
begin
  b:= false;
  d:= false;
  if length(Edit1.Text)=0 then  // можемо писати "0" якщо це перший символ рядка
    Edit1.Text:= Edit1.Text+'0'
  else
    begin
      for i:= 1 to length(Edit1.Text) do
        begin  //  перевіряємо чи є в рядку ще символи крім "0", "-", ","
          if (Edit1.Text[i]<>'0') and (Edit1.Text[i]<>'-') and (Edit1.Text[i]<>',') then
            b:= true;
        end;
      for i:= 1 to length(Edit1.Text) do
        begin // перевіряємо чи є у рядку нулі
          if Edit1.Text[i]='0' then
            d:= true;
        end;
      // перевірки: пишемо нуль коли стоїть тільки "-", коли стоїть "-0," і коли b правда
      if ( (b=false) and (d=false) ) or ((b=false) and (d=true) and (Edit1.Text[length(Edit1.Text)]=',')) or b then
        Edit1.Text:= Edit1.Text+'0';
    end;
end;

procedure TForm1.Button19Click(Sender: TObject);
begin
  if length(Edit1.Text)=0 then  // мінус можемо ставити тільки на початку числа
    Edit1.Text:= Edit1.Text+'-';
end;

procedure TForm1.Button20Click(Sender: TObject);  // кнопка ","
var
  b: boolean;
  i: integer;
begin
  b:= false;
  if length(Edit1.Text)<>0 then  // кома не може бути на початку числа
    // кома не може бути сходу після "-"
    if ((length(Edit1.Text)=1) and (Edit1.Text[1]<>'-')) or (length(Edit1.Text)<>1) then
      begin
        for i:= 1 to length(Edit1.Text) do // не може бути більш ніж 1-єї коми
          begin
            if Edit1.Text[i]=',' then
              b:= true;  // логічна зміна, яка показує чи вже була введена кома
          end;
        if b=false then
          Edit1.Text:= Edit1.Text+',';
      end;
end;

procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
var
  i: integer;
  b, d: boolean;
begin
  case Key of
    '1'..'9', #13: ;
    #8:
      begin
      if StrToFloat(Edit1.Text)=rez then
        rez:= 0;
      end;
    '0':
      begin
        b:= false;
        d:= false;
        if length(Edit1.Text)=0 then  // можемо писати "0" якщо це перший символ рядка
          Key:= '0'
        else
          begin
            for i:= 1 to length(Edit1.Text) do
              begin  //  перевіряємо чи є в рядку ще символи крім "0", "-", ","
                if (Edit1.Text[i]<>'0') and (Edit1.Text[i]<>'-') and (Edit1.Text[i]<>',') then
                  b:= true;
              end;
            for i:= 1 to length(Edit1.Text) do
              begin // перевіряємо чи є у рядку нулі
                if Edit1.Text[i]='0' then
                  d:= true;
              end;
            // перевірки: пишемо нуль коли стоїть тільки "-", коли стоїть "-0," і коли b правда
            if ( (b=false) and (d=false) ) or ((b=false) and (d=true) and (Edit1.Text[length(Edit1.Text)]=',')) or b then
              Key:= '0'
            else
              Key:= Chr(0);
          end;
      end;
    '-':
      begin
        if length(Edit1.Text)=0 then  // мінус можемо ставити тільки на початку числа
          Key:= '-'
        else
          Key:= Chr(0);
      end;
    '.', ',':
      begin
        b:= false;
        if length(Edit1.Text)<>0 then  // кома не може бути на початку числа
          // кома не може бути сходу після "-"
          if ((length(Edit1.Text)=1) and (Edit1.Text[1]<>'-')) or (length(Edit1.Text)<>1) then
            begin
              for i:= 1 to length(Edit1.Text) do // не може бути більш ніж 1-єї коми
                begin
                  if Edit1.Text[i]=',' then
                    b:= true;  // логічна зміна, яка показує чи вже була введена кома
                end;
              if b=false then
                Key:= ','
              else
                Key:= Chr(0);
            end
          else
          Key:= Chr(0)
        else
          Key:= Chr(0);
      end
  else
    Key:= Chr(0);
  end;

end;

procedure TForm1.Button15Click(Sender: TObject); // кнопка "+"
var
  p: boolean;
  act_chislo: real;
begin
  if length(Edit1.Text)=0 then   // якщо користувач натискає "+" а поле вводу порожнє
    begin
      p:= false;
      rez:= 0;
      act_chislo:= 0;
      if kilk=0 then
        ShowMessage('Нічого не введено!')  // і виводимо відповідне повідомлення
    end
  else
    p:= true;

    if p then
    if StrToFloat(Edit1.Text)<>rez then
      {цей код буде виконуватись, якщо користувач додає декілька чисел і
       перед цим не була натиснута кнопка "="}
      begin
        act_chislo:= StrToFloat(Edit1.Text);
        rez:= rez+act_chislo;
        Edit1.Text:= '';
        deistvie:= 1
      end
    else
      if kn_dorivn then
        {программа буде викогнувати цей код, якщо була натиснута кнопка "=",
         а потім натискається "+" і вводиться число}
        begin
          rez:= 0;
          act_chislo:= StrToFloat(Edit1.Text);
          rez:= act_chislo;
          Edit1.Text:= '';
        end
      else
        {цей код виконується коли підряд додається багато чисел
         і не перед цим не використовується "="}
        begin
          act_chislo:= StrToFloat(Edit1.Text);
          rez:= rez+act_chislo;
          Edit1.Text:= '';
          deistvie:= 1
        end;
  kilk:= kilk+1;
  kn_dorivn:= false;

end;

procedure TForm1.Button18Click(Sender: TObject);  // кнопка "="
begin
  if kn_dorivn then
    begin
      case deistvie of
        1: // кнопка "+"
          begin

            rez:= rez+dop_per;
            Edit1.Text:= FloatToStr(rez);
          end;
        2: // кнопка "-"
          begin
            rez:= rez-dop_per;
            Edit1.Text:= FloatToStr(rez);
          end;
        3: // кнопка "*"
          begin
            rez:= rez*dop_per;
            Edit1.Text:= FloatToStr(rez);
          end;
        4: // кнопка "/"
          begin
            rez:= rez/dop_per;
            Edit1.Text:= FloatToStr(rez);
          end
      else

      end;
    end
  else
    begin
      if length(Edit1.Text)=0 then
        {вивести результат як є, якщо рядок вводу пустий,
        а він пустий якщо нічого не введено або перед цим була натиснена кнопка дії}
        Edit1.Text:= FloatToStr(rez)
      else
        case deistvie of
          1: // кнопка "+"
            begin
              dop_per:=StrToFloat(Edit1.Text);
              rez:= rez+StrToFloat(Edit1.Text);
              Edit1.Text:= FloatToStr(rez);

            end;
          2: // кнопка "-"
            begin
              dop_per:=StrToFloat(Edit1.Text);
              rez:= rez-StrToFloat(Edit1.Text);
              Edit1.Text:= FloatToStr(rez);
            end;
          3: // кнопка "*"
            begin
              dop_per:=StrToFloat(Edit1.Text);
              rez:= rez*StrToFloat(Edit1.Text);
              Edit1.Text:= FloatToStr(rez);
            end;
          4: // кнопка "/"
            begin
              dop_per:=StrToFloat(Edit1.Text);
              rez:= rez/StrToFloat(Edit1.Text);
              Edit1.Text:= FloatToStr(rez);
            end
        else
          ShowMessage('Не виконувалась жодна дія (наприклад, +, -, /, *)');
        end;

    end;
  kn_dorivn:= true;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  rez:= 0;
  deistvie:= 0;
  kilk:= 0;
  dop_per:=0;
end;

procedure TForm1.Button14Click(Sender: TObject);  // кнопка "-"(дія)
var
  p: boolean;
  act_chislo: real;
begin
  if length(Edit1.Text)=0 then   // якщо користувач натискає "-" а поле вводу порожнє
    begin
      p:= false;
      rez:= 0;
      act_chislo:= 0;
    end
  else
    p:= true;
  if p=false then
    ShowMessage('Нічого не введено!')  // і виводимо відповідне повідомлення
  else
    if StrToFloat(Edit1.Text)<>rez then
      {цей код буде виконуватись, якщо користувач віднімає декілька чисел і
       перед цим не була натиснута кнопка "="}
      begin
        if kilk<>0 then
          {цей код буде виконуватись, якщо користувач уже виконував якісь обчислення}
          begin
            act_chislo:= StrToFloat(Edit1.Text);
            rez:= rez-act_chislo;
            Edit1.Text:= '';
            deistvie:= 2;
          end
        else
          {цей код буде виконуватись якщо користувач виконує обчислення вперше}
          begin
            act_chislo:= StrToFloat(Edit1.Text);
            rez:= act_chislo;
            Edit1.Text:= '';
            deistvie:= 2;
          end
      end
    else
      if kn_dorivn then
        {программа буде викогнувати цей код, якщо була натиснута кнопка "=",
         а потім натискається "-" і вводиться число}
        begin
          rez:= 0;
          act_chislo:= StrToFloat(Edit1.Text);
          rez:= act_chislo;
          Edit1.Text:= '';
        end
      else
        {цей код виконується коли підряд додається багато чисел
         і не перед цим не використовується "="}
        begin
          act_chislo:= StrToFloat(Edit1.Text);
          rez:= rez-act_chislo;
          Edit1.Text:= '';
          deistvie:= 2
        end;
  kilk:= kilk+1;
  kn_dorivn:= false;   
end;



procedure TForm1.Button13Click(Sender: TObject);  // кнопка "*"
begin
  if length(Edit1.Text)=0 then
    begin  // поле вводу пусте
      if kilk=0 then
        ShowMessage('Нічого не введено!')


    end
  else  //  поле вводу НЕ порожнє
    begin
      if kilk=0 then  // ніяких дій ще не виконувалось
        begin
          rez:=1;
          act_chislo:= StrToFloat(Edit1.Text);
          rez:= act_chislo;
          Edit1.Text:= '';
          kilk:= kilk+1;
        end
      else  // якісь дії вже виконувались
        begin
          if StrToFloat(Edit1.Text)= rez then  // після показу результату натискається "*"
            begin
              act_chislo:= StrToFloat(Edit1.Text);
              rez:=act_chislo;
              Edit1.Text:= '';
            end
          else  // дорівнює не натискалось щойно - в полі вводу не результат
            begin
              act_chislo:= StrToFloat(Edit1.Text);
              rez:= rez*act_chislo;
              kilk:= kilk+1;
              Edit1.Text:= '';
            end;
        end;
    end;
  deistvie:= 3;
  kilk:= kilk+1;
end;

procedure TForm1.Button12Click(Sender: TObject); // кнопка "/"
begin
  if length(Edit1.Text)=0 then  // поле вводу пусте
    begin
     if kilk=0 then
        ShowMessage('Нічого не введено!')


    end
  else  //  поле вводу НЕ порожнє
    begin
      if kilk=0 then  // ніяких дій ще не виконувалось
        begin
          rez:=1;
          act_chislo:= StrToFloat(Edit1.Text);
          rez:= act_chislo;
          Edit1.Text:= '';
          kilk:= kilk+1;
        end
      else  // якісь дії вже виконувались
        begin
          if StrToFloat(Edit1.Text)= rez then  // після показу результату натискається "/"
            begin
              act_chislo:= StrToFloat(Edit1.Text);
              rez:=act_chislo;
              Edit1.Text:= '';
            end
          else  // дорівнює не натискалось щойно - в полі вводу не результат
            begin
              act_chislo:= StrToFloat(Edit1.Text);
              rez:= rez/act_chislo;
              kilk:= kilk+1;
              Edit1.Text:= '';
            end;
        end;
    end;
  deistvie:= 4;
end;


procedure TForm1.Button11Click(Sender: TObject);  // кнопка "арктангенс"
begin
  if length(Edit1.Text)=0 then
    begin
      if kilk=0 then
        begin
          ShowMessage('Нічого не введено!');
        end
      {else
        begin

        end;}
    end
  else
    begin
      rez:= arctan(StrToFloat(Edit1.Text));
      Edit1.Text:= FloatToStr(rez)
    end;
end;

procedure TForm1.Button10Click(Sender: TObject);  // кнопка "куб"
begin
  if length(Edit1.Text)=0 then
    begin
      if kilk=0 then
        begin
          ShowMessage('Нічого не введено!');
        end
      {else
        begin

        end;}
    end
  else
    begin
      rez:= power(StrToFloat(Edit1.Text), 3);
      Edit1.Text:= FloatToStr(rez)
    end;
end;

procedure TForm1.Button9Click(Sender: TObject);  // кнопка "модуль"
begin
  if length(Edit1.Text)=0 then
    begin
      if kilk=0 then
        begin
          ShowMessage('Нічого не введено!');
        end
      {else
        begin

        end;}
    end
  else
    begin
      rez:= abs(StrToFloat(Edit1.Text));
      Edit1.Text:= FloatToStr(rez)
    end;
end;

procedure TForm1.Button21Click(Sender: TObject);  // кнопка "Видалити"
begin
  rez:=0;
  act_chislo:=0;
  kilk:=0;
  deistvie:=0;
  kn_dorivn:=false;
  Edit1.Text:='';
end;

end.                                                  