Создание калькулятора на delphi xe7 для Windows выпуск #209 урок 2
данный урок на видео с показом и объяснением
ниже представлено текстовое описание урока (если вам что-то вдруг
непонятно из видео или если удобнее именно работать с текстом,
но видео может дополнять текст демонстрацией того как выполняются
те или иные действия).
Итак, давайте начнем наш урок.
запускаем среду delphi xe 7 > File > New > VCL Forms Application
для главной формы задаем свойство
MainForm1.Position = poScreenCenter
Пусть наш калькулятор пока может выполнять 5 базовых действий:
+
*
/
-
и сброс отображаемого результата в 0 - кнопка C
также нам понадобится кнопка
=
еще понадобится текстовое поле для ввода исходных данных
и вывода результата
Добавляем на форму
текстовое поле -
TEdit из панели компонентов Standard
назовем его
CalcEdit1
и установим свойство
CalcEdit1.Text := 0;
и 6 кнопок
TButton
назовем
PlusButton1
MinusButton1
MultiplyButton1
DivisionButton1
ClearButton1
CalcButton1
установим для них такие свойства
делаем все через окно ObjectInspector
PlusButton1.Caption := '+';
MinusButton1 := '-';
MultiplyButton1 := 'х';
DivisionButton1 := '/'
ClearButton1 := 'C';
CalcButton1 := '=';
Сгенерируем события для этих кнопок
кликнем дважды кнопку
ClearButton1
на форме MainForm1
в результате будет сгенерирован такой обработчик события:
procedure TMainForm1.ClearButton1Click(Sender: TObject);
begin
end;
добавим в него такой код -
procedure TMainForm1.ClearButton1Click(Sender: TObject);
begin
CalcEdit1.Text := '0';
end;
Т. е. данная строка кода
в обработчике для клика по кнопке C
просто очищает значение в текстовом поле CalcEdit1
присваивая его свойству Text значение 0.
Обратите внимание, что 0 в кавычках. Т. к. свойство
CalcEdit1.Text может принимать значения только с типом string - строковые
значения, что мы и сделали задав 0 в кавычках.
если вы не добавите кавычки, то при компиляции приложения
получите ошибку.
[dcc32 Error] CalcUnit1.pas(52): E2010 Incompatible types: 'string' and 'Integer'
скомпилируем приложение и запустим.
Если вы ввели в текстовое поле какое-то значение, то при нажатии кнопки C
на форме калькулятора в текстовом поле должен получаться 0.
Таким образом мы реализовали первое простейшее действие нашего калькулятора -
очистку значения.
Теперь попробуем реализовать операцию сложения.
Также генерируем для кнопки + обработчик.
И тут нам уже нужно будет добавить немного больше кода.
пустой обработчик для кнопки +, сгеренированный средой delphi
procedure TMainForm1.PlusButton1Click(Sender: TObject);
begin
end;
тот же обработчик, но уже с добавленным кодом
procedure TMainForm1.PlusButton1Click(Sender: TObject);
begin
A_number := StrToInt(CalcEdit1.Text);
Operation := 1;
end;
Поясним что делает данный код.
A_number := StrToInt(CalcEdit1.Text); //значение введенного результата заносит в переменную A_number
переменную A_number
объявим как глобальную
в коде модуля CalcUnit1.pas, а у вас данный модуль (если вы его не сохраняли под другим именем)
может называться просто Unit1.pas
после строки
{$R *.dfm}
добавим объявление 3х переменных:
A_number, B_number, Operation: Integer;
т. е. будет выглядеть так -
{$R *.dfm}
var
A_number, B_number, Operation: Integer;
A_number - это будет первый введенный в калькулятор числовой параметр с которым нужно выполнить
арифметическое действие
B_number - соответственно второй
Operation - тип арифметического действия
Все переменные, как видим, объявлены Integer - т. е. имеющие тип Целое число.
В нашем обработчике кнопки +
procedure TMainForm1.PlusButton1Click(Sender: TObject);
begin
A_number := StrToInt(CalcEdit1.Text);
Operation := 1;
end;
Operation := 1; //будет задавать тип операции сложение
попробуем выполнить компиляцию нашего приложения и запустить.
Сейчас приложение обладает 1 недочетом
мы вводим число, затем нажимаем + и когда хотим ввести 2 число,
то фокус ввода у нас будет на кнопке +, нужно снова вернуть фокус
ввода на текстовое поле, чтобы при нажатии клавиш ввода 2-го числа
оно вводилось сразу в текстовое поле.
Также для калькулятора можно добавить кнопки от 0 до 9. Но это
вы уже сможете сделать самостоятельно по окончании нашего урока.
А пока идем дальше.
Как сделать чтобы после нажатия + в калькуляторе фокус ввода возвратился
к текстовому полю ?
для этого добавим строку
ActiveControl := CalcEdit1;
наш обработчик для нажатия + в итоге будет выглядеть так:
procedure TMainForm1.PlusButton1Click(Sender: TObject);
begin
A_number := StrToInt(CalcEdit1.Text);
Operation := 1;
ActiveControl := CalcEdit1;
end;
ActiveControl это свойство TForm
т. е. надо было бы написать
MainForm1.ActiveControl := CalcEdit1;
но поскольку мы вызываем свойство ActiveControl
внутри обработчика итак принадлежащего данной форме -
TMainForm1
то данную часть опускаем.
Поэтому и можно написать просто
ActiveControl := CalcEdit1;
Компилируем, запускаем - все работает как надо.
Осталось сделать обработчик для кнопки =.
вот его код
procedure TMainForm1.CalcButton1Click(Sender: TObject);
begin
B_number := StrToInt(CalcEdit1.Text);
case Operation of
1: begin
CalcEdit1.Text := IntToStr(A_number + B_number);
end;
end;
end;
То есть данный обработчик делает такие действия при нажатии в калькуляторе
кнопки =
B_number := StrToInt(CalcEdit1.Text);
//в переменную B_number заносит значение введенное в текстовое поле и из типа string преобразует
//в тип Integer
//если результат операции 1 - сложение
case Operation of
1: begin
CalcEdit1.Text := IntToStr(A_number + B_number);
//то выполняем сложение значений в переменных A_number - наше первое введенное
//значение которое было запомнено в данной переменной
//когда нажималась кнопка арифметического действия
//B_number - второе значение которое было запомнено в вышеуказанной строке кода
//ну и наконец выполнив сложение преобразуем результат
//из типа Integer в string и заносим в текстовое поле - чтобы отобразить
//результат вычисления
end;
end;
Компилируем, запускаем - все работает как надо.
Следует отметить, что использование в коде числовых значений для типа операций
хранимых в переменной Operation является не совсем правильной практикой программирования.
Вам нужно в этом случае помнить что означают эти числа.
Вместо этого можно объявить специальный тип, который будет сразу пояснять все неясности.
Давайте сделаем это.
type
TCalcOperationTypes = (cotNone, cotAdd, cotSub, cotMult, cotDiv);
в модуле CalcUnit1.pas (или Unit1.pas если у вас он называется так или как-то иначе)
найдем строку с ключевым словом type
и после него запишем строку
TCalcOperationTypes = (cotNone, cotAdd, cotSub, cotMult, cotDiv);
в итоге ваш код будет выглядеть как-то так:
type
TCalcOperationTypes = (cotNone, cotAdd, cotSub, cotMult, cotDiv);
TMainForm1 = class(TForm)
соответственно значения
cotNone = 0 //никакой операции нет
cotAdd = 1 //будет сложение
cotSub, cotMult, cotDiv
соответственно
2, 3, 4 - вычитание, умножение и деление
тогда везде, где используется Operation нужно внести
изменения
в методе
procedure TMainForm1.PlusButton1Click(Sender: TObject);
вместо
Operation := 1;
записать
Operation := cotAdd;
в методе
procedure TMainForm1.CalcButton1Click(Sender: TObject);
вместо
1: begin
записать
Operation := cotAdd;
также нужно изменить тип для переменной Operation
var
//A_number, B_number, Operation: Integer;
A_number, B_number: Integer;
Operation: TCalcOperationTypes;
т. е. теперь она будет иметь не целый тип, а целый тип, но производный от типа
TCalcOperationTypes
по сути это тоже самое, но вместо непонятных значений 0, 1, 2, 3, 4 которые еще
придется запоминать что означают, получим более понятные -
TCalcOperationTypes = (cotNone, cotAdd, cotSub, cotMult, cotDiv);
согласитесь это уже делает наш код более читабельным и понятным для постороннего.
Это является хорошей практикой, т. к. и Вы и кто-то другой могут читать код спустя
долгое время и тогда вам не придется вспоминать многие непонятные вещи - они
будут уже описаны в коде.
Идем дальше.
Если вы сделали и вам все понятно, приложение компилируется без ошибок
и при запуске нормально работает, т. е.
выполняет правильно сложение и очищает полученный результат по кнопке C,
тогда нам осталось реализовать еще 3 арифметических действия: вычитание, умножение и деление.
По аналогии с описанным для сложения сделаем это.
Создадим обработчики для кнопок -, x, /
procedure TMainForm1.MinusButton1Click(Sender: TObject);
begin
end;
procedure TMainForm1.MultiplyButton1Click(Sender: TObject);
begin
end;
procedure TMainForm1.DivisionButton1Click(Sender: TObject);
begin
end;
Кстати переключаться между формой MainForm1 и кодом её модуля CalcUnit1.pas
можно по клавише [F12], а не только используя пункт меню View > Forms
и
добавим в них код
A_number := StrToInt(CalcEdit1.Text);
Operation := cotSub;
ActiveControl := CalcEdit1;
код будет по сути везде одинаковым, отличаться будет только строчка
Operation := cotSub;
в которой нам нужно будет присваивать разные значения выполняемых операций.
Поэтому следуя хорошей практике программирования вынесем повторяющийся код
за пределы обработчиков, создав отдельный метод
Я назвал его
procedure SaveBOperandAndMakeOperation();
соответственно в объявление класса
TMainForm1 = class(TForm)
в секцию
private
я добавил
procedure SaveBOperandAndMakeOperation();
private
{ Private declarations }
procedure SaveBOperandAndMakeOperation();
А в секцию
implementation
в коде
(все что ниже строки implementation)
такой код
procedure TMainForm1.SaveBOperandAndMakeOperation();
begin
A_number := StrToInt(CalcEdit1.Text);
ActiveControl := CalcEdit1;
end;
Теперь в методе
procedure TMainForm1.PlusButton1Click(Sender: TObject);
begin
A_number := StrToInt(CalcEdit1.Text);
Operation := cotAdd;
ActiveControl := CalcEdit1;
end;
я внесу изменения и метод будет выглядеть так
procedure TMainForm1.PlusButton1Click(Sender: TObject);
begin
SaveBOperandAndMakeOperation();
Operation := cotAdd;
end;
Аналогично методы для обработки вычитания, умножения и деления примут
такой вид:
procedure TMainForm1.DivisionButton1Click(Sender: TObject);
begin
SaveBOperandAndMakeOperation();
Operation := cotDiv;
end;
procedure TMainForm1.MinusButton1Click(Sender: TObject);
begin
SaveBOperandAndMakeOperation();
Operation := cotSub;
end;
procedure TMainForm1.MultiplyButton1Click(Sender: TObject);
begin
SaveBOperandAndMakeOperation();
Operation := cotMult;
end;
Такие вещи, как видите являются хорошей практикой программирования потому что:
а) делают код более понятным и читабельным:
конечно вызов
SaveBOperandAndMakeOperation();
поначалу может быть непонятен, для того, кто только начал смотреть ваш код,
но как минимум уже понятно что данному вызову соответствует какая-то 1 атомарная логическая
операция.
вторая строчка каждого из методов
Operation := cotMult;
или
Operation := cotSub;
или что-то еще
сразу дает также информацию о неком атомарном и повторяющемся но логически отличном друг
от друга действии
б) код становится более унифицированным и легко изменяемым:
вам не нужно если вдруг поменяется логика использования внутри SaveBOperandAndMakeOperation
будет заходить в каждый из обработчиков и менять код, достаточно будет изменить лишь
код внутри
SaveBOperandAndMakeOperation
в) код пишется намного легче и быстрее
вместо того, чтобы копипастить строки
A_number := StrToInt(CalcEdit1.Text);
ActiveControl := CalcEdit1;
в каждый из методов Вы вставляете лишь вызов
SaveBOperandAndMakeOperation();
это и быстрее и требует в дальнейшем меньших изменений при модификациях и поддержке кода
вашего приложения
Вообщем обо всех этих преимуществах Вы как-нибудь можете поразмыслить на досуге.
Ну и конечно в процессе накопления опыта эти рекомендации становятся для новичков
более очевидными.
Идем дальше, нам осталось дополнить код кнопки =
также дополним код обработчика кнопки =
procedure TMainForm1.CalcButton1Click(Sender: TObject);
var
op_result: Integer;
begin
B_number := StrToInt(CalcEdit1.Text);
case Operation of
cotAdd: begin
CalcEdit1.Text := IntToStr(A_number + B_number);
end;
cotSub: begin
CalcEdit1.Text := IntToStr(A_number - B_number);
end;
cotMult: begin
CalcEdit1.Text := IntToStr(A_number * B_number);
end;
cotDiv: begin
op_result := Integer(Round(A_number / B_number));
//CalcEdit1.Text := IntToStr(A_number / B_number);
CalcEdit1.Text := IntToStr(op_result);
end;
end;
end;
С вычитанием и умножением думаю все понятно, а вот с реализацией деления двух целых чисел
может возникнуть загвоздка. Дело в том, что при делении целых чисел может получиться нецелое
число, а значит тип результата уже не будет иметь тип Integer.
Как быть ?
объявляем дополнительную переменную
var
op_result: Integer;
и вместо строки
//CalcEdit1.Text := IntToStr(A_number / B_number);
которая будет вызывать ошибку при компиляции
пишем такие строки
//будем выполнять деление, затем округлим результат Round и приведем к типу Integer
op_result := Integer(Round(A_number / B_number));
CalcEdit1.Text := IntToStr(op_result); //тут думаю все понятно - просто возвращаем результат
//в текстовом поле
Компилируем, запускаем и если все работает,
то значит Вы осилили создание первого несложного приложения в среде delphi.
Надо сказать, что это уже более ощутимый шаг вперед по сравнению
с приложением Hello, World ! которое Вы могли написать в самом начале
знакомства со средой Delphi.
Также несколько слов о тестировании нашего приложения.
Можно потестировать наше приложение и заметить, что оно имеет некоторые ограничения
и даже подводные камни.
Какие ?
Не поддерживается использование чисел отличных от целых.
Скажем если вы попробуете вычислить
2.5 + 3.3 =
то получите
сообщение об ошибке
2.5 is not valid integer value
также если вы будете вводить слишком большие значения или
попытаетесь делить на ноль - также будете получать сообщение об
ошибке
Как разрешить все эти проблемы Вы можете попробовать разобраться
самостоятельно, либо в нашем следующем уроке
я расскажу про это.
ЗАМЕЧАНИЕ К УРОКУ:
SaveBOperandAndMakeOperation
более правильно следовало бы назвать просто
SaveAOperand
Вы можете изучить также как создать аналогичный калькулятор, но на c#
Создание калькулятора на c# в Visual Studio 2013
Скачать приложение Калькулятор calculator с исходным кодом на delphi xe 7.
Дистрибутив представлен в виде zip архива.
Размер файла: 820 Kb.
Вы можете поддержать проект, так как без вашей поддержки вряд ли что-то
получится.
Спасибо !!!
Поддержав проект Вы получаете свое имя в титрах, а также новый эпизод игры,
из которого узнаете дальнейшие события и сможете в них поучаствовать сами.
Ну и конечно же Вы окажете автору поддержку и сможете рассчитывать увидеть
дальнейшие серии мульта и игры.
Еще раз спасибо !!!
Стань бронзовым пользователем и получи: свое имя в титрах и новый эпизод игры !
Стоимость: 200 руб.
Стань серебряным пользователем и получи: свое имя в титрах и текущий +1 новый эпизод игры
(когда он выйдет) !
Стоимость: 400 руб.
Стань золотым пользователем и получи: свое имя в титрах и текущий +2 новых эпизода игры
(когда они выйдут) !
Стоимость: 600 руб.
оцените статью:
0
0
игры, сервисы
играть
играть
случайный сайт
играть
видео-рассказ, уроки godot, виртуальный помощник по поиску информации
играть
читать
купить
скачать
игры Многоликий: dress - hordes эпизоды с 1 по 4
играть
скачать
купить
купить
игры, музыкальные клипы
скачать
скачать
смотреть
скачать/играть
музыкальный клип, игры
смотреть
играть
скачать
скачать
разработка игр, анимационный фильм, новогодняя дискотека 2020 - песни на итальянском, игра про лифт
смотреть
смотреть
смотреть
смотреть
игры, инструменты разработки, анимационный фильм, фильм.
купить
смотреть
смотреть
скачать
игры
скачать
скачать
скачать
купить
игры в браузере
играть
играть
играть
играть
игры в браузере
играть
играть
играть
играть
игры в браузере
играть
играть
играть
играть
игры в браузере
играть
играть
играть
играть
игры в браузере (3), создание музыки в браузере (1)
играть
играть
играть
играть
игры в браузере
играть
играть
играть
играть
игры в браузере
играть
играть
бк 0010.01 - играть!
играть
игры в браузере
играть
играть
играть
играть
игры в браузере (3), скачиваемые (1)
играть
играть
играть
скачать
игры в браузере
играть
играть
играть
играть
игры в браузере, скачиваемые игры
играть
скачать
играть
играть
игры в браузере
играть
играть
играть
играть
игры в браузере
Foxyland 2
quidget 2
играть
играть
полезный софт, игры в браузере
скачать
anova игра
A Knots Story
sabotage
сервисы, игры
24500 руб.
скачать
игра
играть
игры, программы
купить / скачать
купить
5500 руб.
скачать
поздравления, уроки рисования, уроки создания сайтов
читать
читать
читать
150 руб.
комиксы, музыка, рассказы
читать
читать
слушать
читать
игра для разработки, калькулятор услуг, cms, комикс
250 руб.
разработка на заказ
1250 руб.
350 руб.
игры для разработки, комиксы
скачать
читать
читать
скачать
игры шарики и ямки, комиксы про Костю Коробкина, ria xxl игра, fly snow 3d генератор эффектов снега, частиц и др. -
скачать
читать
150 руб.
350 руб.
Создай свою игру на fle game engine -
800 руб.
240 руб./скачать
скачать
скачать
Для создания сайта - модуль отзывов/комментариев для вашего сайта в составе megainformatic cms express files -
700 руб.
1250 руб.
150 руб.
500 руб.
Уроки Flash, бесплатные Flash - игры.
бесплатно
бесплатно
2500 руб.
14000 руб.
Поддержка сайтом нескольких языков (multi lang), создание собственной системы личных кабинетов, соц. сети или фриланс - биржи (megainformatic cms social), создание сервиса коллективных покупок на базе megainformatic cms groupon, онлайн сервис подсчёта статистики ключевых слов в статьях вашего сайта keywords gen + описание кода данного сервиса, с возможностью бесплатно реализовать его аналог на своём собственном сайте.
500 руб.
12000 руб.
14000 руб.
бесплатно
megainformatic.ru/webjob/ - сервис для фриланс проектов
- место встречи заказчиков и исполнителей
megainformatic.ru/webjob/ - сервис для фриланс проектов
- место встречи заказчиков и исполнителей
Системы управления сайтом, уроки
1250 руб.
бесплатно
550 руб.
500 руб.
megainformatic cms admin - простая и компактная система
для работы и управления сайтом
350 руб.
5800 руб.
3000 руб.
500 руб.
megainformatic cms free и серия продуктов - Уроки Photoshop
бесплатно
650 руб.
700 руб.
750 руб.
Данная серия посвящена описанию приемов и методов создания изображений,
с помощью инструментария программы Adobe Photoshop. Кроме того, многие
описанные средства могут вам помочь при освоении и многих других программ
для работы с растровой графикой - GIMP, Corel Photo Paint и других.
бесплатные игры 2d и 3d, а также эмулятор Ну, Погоди!
300 руб.
бесплатно
бесплатно
бесплатно
Это серия распространяемых бесплатно игр. Вы не только можете поиграть,
но и скачать исходники, получив тем самым возможность внести изменения
в игру или создать новую !!! (эмулятор Ну, Погоди! распространяется платно).
серия игр про Веселого Буквоежку, и бесплатно распространяемая игра
Нечто: Необъяснимое - в плену желаний
350 руб.
510 руб.
fle game engine
бесплатно
Здесь представлены новинки жанра - Говорящий Комикс, Настольная игра,
А также продукт, который позволит Вам научиться создавать игры самостоятельно.
Ну и конечно изюминка в своём роде - бесплатная игра - Нечто: Необъяснимое
- в плену желаний
Серия бесплатных онлайн уроков, посвященных 3ds max, photoshop, c++,
directx, delphi и php.
бесплатно
бесплатно
бесплатно
бесплатно
бесплатно
бесплатно
500 руб.
300 руб.
Описаны практические примеры решения различных задач, возникающих при
создании игр и сайтов.
Продукты Набор разработчика и Ваше Визуальное Шоу распространяются платно.
уроки и продукты различной тематики
бесплатно
бесплатно
бесплатно
400 руб.
Бесплатные Уроки Photoshop free, Бесплатные Уроки по программированию
на delphi directx - Как создать игру Ну, Погоди!, Бесплатная Авторская
музыка в формате mp3 - Музыкальные Миры, Платно распространяемый продукт
megainformatic cms express - система для быстрого создания Вашего сайта
на php + my sql.
Проекты игр, уроки
450 руб.
бесплатно
бесплатно
бесплатно
Игра Веселый Буквоежка, уроки delphi directx 8.1 для начинающих (описываются
основы 3d игр), моделируем девушку в 3d studio max, уроки музыки - пишем
музыку в Fruity Loops Studio
megainformatic
cms express files - это простое, быстрое и очень компактное решение
для создания первого вашего сайта. НЕ ИСПОЛЬЗУЕТ базы данных mysql.
Вместо этого используются файловые базы данных. Поэтому Вы
можете использовать систему даже на хостинге с поддержкой php, но
без поддержки баз данных my sql.
Очень
проста в установке - достаточно вам скопировать все файлы на ваш
хостинг и сайт готов к работе !!!
В комплект входят 3 готовых шаблона, модули поиска и карты сайта,
а также статьи по основам создания сайта.