2017-01-14
02. Кнопочный калькулятор на PascalABC
На этом уроке мы воспользуемся знаниями о технологии ООП (Объектно-ориентированного программирования) создадим простой кнопочный калькулятор.
На вид наш калькулятор будет иметь примерно такой вид:
Итак начинаем
Как я уже отметил в преамбуле, нам понадобится ООП - подход, а значит будем использовать классы и их экземпляры.
В данном случае мы подключим модуль VCL, который отвечает за создание всевозможных форм и их элементов: кнопок, полей ввода, переключателей, текстовых полей.
Для каждого из вышеперечисленных элементов форм в модуле VCL уже имеются готовые классы, поэтому в отличие от предыдущей статьи (об основах ООП), мы сами классы уже создавать не будем, а будем создавать только экземпляры классов.
В блоке описания переменных мы должны перечислить имена всех этих будущих экземпляров:
Что здесь имеем: MainForm - это экземпляр класса Form, т.е. сама форма - сам "ящик" будущей формы,
Bsum - экземпляр класса Button, т.е. кнопки. Это будет кнопка суммирования,
Braz - экземпляр кнопки Разность
Bpr - экземпляр кнопки Произведение
Bdel - экземпляр кнопки Деление
Bres - экземпляр кнопки Результат
Bclean - экземпляр кнопки Очистить
Т1 - экземпляр поля ввода данных
Также нам потребуется переменная "operation" - она будет содержать в себе номер операции (станет ясно ниже), переменная rint - будет хранить целочисленный результат, переменная rr - будет хранить вещественный результат операции, x1, x2 - это операнды, которые над которыми будут производиться арифметические действия.
А теперь само тело программы:
Сначала создаем последовательно экзепляры всех необходимых нам объектов с нужными нам свойствами:
В скобках у экземпляра формы указыны 4 цифры: (отступ x, отступ y, ширина, высота), где отступ x и отступ y - это отступ левого верхнего угла формы от левого верхнего угла экрана.
Для поля ввода, и экземпляров кнопок отступ х и отступ у - это уже отступ от левого верхнего угла самой формы.
Для экземпляров кнопок сразу задаем свойство "Caption" - заголовок, для каждой кнопки задаем свою надпись.
Обработка методов экземпляров
В этой программе мы будем использовать для экземпляров кнопок методы щелчка мышки - "onClick" - дословно переводится при клике.
При возникновении события "Click" мы для каждого экземпляра вызываем свою процедуру:
Теперь осталось описать перечисленные 6 процедур в области описания процедур:
Для обработки щелчка на кнопке Bsum (суммирование):
В этой процедуре мы заносим в переменную x1 содержимое поля ввода (с одновременным переопределением типа из строкового в целочисленный), и сразу же очищаем это поле. Также переменной operation присваиваем код операции суммирования (в нашем случае это 1).
Для обработки щелчка на кнопке Braz (разность):
Аналогично заносим значение поля ввода в переменную х1, очищаем поле и даем код операции: 2.
Для обработки щелчка на кнопке Bpr (произведение):
Аналогично заносим значение поля ввода в переменную х1, очищаем поле и даем код операции: 3.
Для обработки щелчка на кнопке Bdel (деление):
Аналогично заносим значение поля ввода в переменную х1, очищаем поле и даем код операции: 4.
Для обработки щелчка на кнопке Bres (вычисление результата):
При щелчке на кнопке "=" в переменную x2 заносим содержимое поля ввода. К этому времени в переменной х1 уже хранится первое введенное число, поэтому далее производим вычисление заданного действия. Если код операции был равен 1, то делаем суммирование, если 2, то вычитание, если 3, то умножение, если 4, то деление. При этом результат операции будет находиться в вещественной переменной rr.
Но есть одна проблема: в текстовом поле может быть только строковая переменная. А как преобразовать число в строку. Есть в паскале такая функция: inttostr(x) - она превращает целочисленный тип в строковый. Но у нас результат вещественный (т.к. после операции деления результат всегда бывает только вещественным). Поэтому, нам приходится делать промежуточный перевод вещественной переменной в целую:
rint:=round(rr); - мы в данном случае для этого воспользовались функцией округления. При этом, конечно мы жертвуем результатом деления, отсекая его дробную часть. В этом состоит серъезный недостаток данной программы, который мы будем устранять на следующем уроке.
Осталась последняя процедура - процедура очистки текстового поля.
При обработке щелчка на кнопку Bclean (очистка):
Здесь комментарии излишни - и так все ясно.
Теперь программа полностью завершена.
Вот полный код программы:
На этом будем завершать этот урок. Надеюсь, все было достаточно понятно.
Успехов в написании программы.
Подготовка к тесту
Вопросы теста
-
Какой модуль в Паскале отвечает за создание форм?
-
Необходимо создать экземпляр Bsum класса Button. Выберите правильную запись этого оператора:
-
В операторе Bsum.Caption:='+',( где Bsum - экземпляр класса кнопки), за какое свойство отвечает "Caption"?
-
В операторе Braz:=Button.Create(80,60,40,40) что означает третья цифра в скобках?
-
В операторе Braz:=Button.Create(80,60,40,40) что означает четвертая цифра в скобках?
-
В операторе Bsum.OnClick:=BsumClick какое событие кнопки Bsum обрабатывается?
-
В операторе x1:=strtoint(T1.caption) для чего нужна функция strtoint ?
-
В операторе rint:=round(rr) что делает функция round?
-
В операторе T1.caption:=inttostr(rint) что делает функция inttostr ?
-
Экземпляр какого класса создается в этом операторе: T1:=TextBox.Create(30,25,200,25) ?