субота, 4 березня 2017 р.

Lazarus. Урок 16. Калькулятор як у Windows. Частина 2.

Вітаю усіх читачів мого блогу! Сьогодні ми продовжимо роботу над нашим "справжнім" калькулятором який я розпочав у попередньому пості. Минулого разу ми розглянули, простенький код який дозволить натискаючи кнопку "1" показувати на екрані 1, 11, 111,.. і тд.
Пригадаємо цей код: Edit1.Text:=Edit1.Text+'1';
Ця дія дуже схожа з тією, яку потрібно було використати в уроці №13, та й у багатьох проектах де потрібно до вже існуючого значення додати щось нове. 

Для закріплення знань подумайте, якою буде відстань від правого краю форми до правого краю екрану мого ноутбука, якщо роздільна здатність матриці 1366х768 а в проекті ми пропишемо наступний код?Form1.Left:=300;Form1.Width:=200;Form1.Left:=Form1.Left+200;Потрібна підказка? Пишіть у коментарях до посту!
Порахували? Тоді йдемо далі.


Повернемось до нашого калькулятора. Якщо число 111 ми вже можемо набрати то підійшов час для кнопки "+". А для більшої зрозумілості я пропоную скористатись веб-версією калькулятора і спробувати набрати 111 потім дію "+", зробити паузу, подумати і набрати 11. Що відразу впало в очі? Якщо нічого, скиньте калькулятор до 0 і спробуйте ще раз: 111 потім дію "+", зробити паузу і подумати, а потім набрати 1 яка буде першою цифрою нашого другого числа 11.

Побачили? Я впевнений, що так... Після того як ми клікнули "+", а потім клікнули по "1" наше перше число 111 зникло з екрану. Але ж  нам потрібно його пам'ятати! Запам'ятати щось можна звичайно ж в комірку пам'яті. Тому у розлілі var опишіть змінну назвавши її chislo1 або давайте скоротимо його до ch1.
А який тип даних на Вашу думку потрібно вказати для комірки ch1?
А тепер думаємо над типом даних. Очевидно, що якщо ми додали до нашого калькулятора кнопку "Кома", то мабуть ми плануємо виконувати обчислення і з дійсними числами. А отже тип даних для наших змінних буде як мінімум real

Завдання
Поцікавтесь на теренах мережі інтернет, які ще є типи даних для опису цілих та дійсних чисел

Тож повертаючись до нашої кнопки "+" ми скажемо, що саме в обробнику події OnClick для кнопки "+" ми повинні зберегти наше перше число (зараз воно у нас 111).
 І я також сподіваюсь, що Ви не забули, що для чисел потрібно перетворити текст записаний в текстовому полі у дійсне число. А тому наша дія буде описана так:
ch1:=StrToFloat(Edit1.Text);

І ця команда буде записна де? Правильно в обробнику OnClick для кнопки "+".
Отож створюємо обробник події для кнопки "+"  і вписуємо туди нашу команду для запам’ятовувавння першого введеного числа.

Запустимо нашу програму введемо 111, клікнемо кнопку "+" уявляємо як в змінну ch1 запишеться те саме число 111 і клацаємо знову по кнопці "1".......

Що вийшло? На екрані ми побачимо 1111. А повинні побачити? Звичайно ж просто 1. Бо ця 1 повинна вже відноситись до нашого наступного числа 11. Що ж трапилось?
Насправді нічого. Програма лише виконала той код, який ми їй вказали в обробнику OnClick для кнопки "1". А там у нас Edit1.Text:=Edit1.Text+'1';
Але ж нам потрібно, щоб на екрані з’явилась лише 1 яка "зітре" попереднє число. Цього можна добитися командою Edit1.Text:='1';
Якщо трішки подумати то виявляється, що коли ми не натискали ніякої дії у нас 1 повинна дописуватись до того числа, яке вже є в текстовому полі, а коли клікнули по кнопці, що означає дію - повинна виконатись команда Edit1.Text:='1';
Отже нам потрібно запам’ятати, що ми клацнули по кнопці "+"
І знову нам допоможе змінна. Давайте створимо змінну назвавши її op (від слова операція) або можете назвати її як хочеться Вам. Після слова var допишіть ім’я цієї змінної вказавши тип даних byte. 
op:byte;
То як же нам допоможе ця змінна? Дуже просто. Тоді коли ми клацнемо по кнопці "+" виконається обробник події OnClick, а там уже лежить команда  ch1:=StrToFloat(Edit1.Text);
і ми допишемо туди ще одну команду. 
op:=1;
Отже в обробнику події для кнопки "+" вже буде дві команди.
ch1:=StrToFloat(Edit1.Text);
op:=1;
Але як скористатись змінною для нашої кнопки "1" так, щоб дописувати 1 до вже існуючого числа чи заміняти старе число новим?

Тепер черга за оператором розгалуження! Тепер у обробнику події OnClick для кнопки "1" ми перевіримо яке значення  в даний момент має змінна op. Якщо вона дорівнює 1 то це значить, що кнопку "+" ми натиснули, а отже треба заміняти старе число. В іншому випадку дописувати одиницю до старого числа.
IF op=1 THEN Edit1.Text:='1' ELSE Edit1.Text:=Edit1.Text+'1';

І ми знову запускаємо програму клікаємо тричі по "1", щоб отримати 111, клікаємо по "+", клікаємо по "1", радіємо, що у нас почалось введення "нового" числа, клікаємо знову по "1", щоб побачити на екрані 11 і.......... побачиом 1. Клацаємо ще раз і знову 1. Ще раз і знову 1! ЧОМУ????   Програма лише виконала той код, який ми їй вказали в обробнику OnClick для кнопки "1". А там у нас IF op=1 THEN Edit1.Text:='1' ELSE Edit1.Text:=Edit1.Text+'1';
І що? Давайте повернемось до моменту коли ми клікнули "+". Змінна ор стала рівною 1. Правильно? А отже клацаючи по "1" висловлювання ор=1 буде істинним завжди.
Значить нам потрібно позбутись цієї істинності. Де? Звичайно там де ми її перевіряли і отримавши істину заміняли вміст текстового поля 1. А простіше кажучи після слова THEN ми повинні вимкнути змінну ор. Вимкнути - це значить надати їй значення відмінного від 1.
Отже тепер після THEN у нас повинно бути дві операції, а тому ми пригадуючи урок №14 повинні використати операторні дужки. Тому матимемо наступний код:
IF op=1 THEN begin 
                                 op:=0; //так ми вимкнули змінну
                                Edit1.Text:='1'; 
                         end 
ELSE Edit1.Text:=Edit1.Text+'1';
І знову зберігши внесені дані запускаємо нашу програму, щоб переконатись, що наші дії є правильними.

Друге число внесене - залишилось клікнути кнопку "дорівнює". Але це ми зробимо вже в наступному пості.