Урок №2 (Обробка подій, що тікає кнопка)
У цьому уроці я постараюся пояснити як створюється обробка подій. Почнемо з того що я поясню що така подія. Подія (англійське event) - це як ви напевно здогадалися це така ситуація, коли щось відбувається. Ось наприклад ви натиснули кнопку, і ось тут-то і відбувається обробка цієї події. У першому уроці як раз була обрабитка події натискання на кнопку, я спеціально не став вдаватися в подробиці. Тим більше відразу все запам'ятати неможливо.
Треба зробити відступ. Операційна система побудована таким чином, що вона постійно обробляє повідомлення, реагуючи на дії користувача, на його натискання на клавіатурі і мишці. Дуже часто виходить так що система чекає введення від користувача. А після цього починає виконувати певні дії прості або не дуже, може навіть вкрай складні операції.
Так ось, за певних діях користувача ваше додаток викликає певні підпрограми. Подій цих дуже багато, так що всі ми розглядати не будемо, а розглянемо як приклад простий приклад.
Для цього відкриємо Delphi з новим проектом. Зменшимо розміри головної форми. Пропоную зробити наступні установки. Для цього у властивостях форми встановимо її розміри ширина (Width) і висота (Height)) призначимо значення 300, цього цілком достатньо. У нас вийшло квадратне вікно. У ньому ми розмістимо кнопку. Властивість напис (Caption) пропоную поміняти на "вихід". Ще ви освоїте команду закрити програму. Ви можете так само поміняти заголовок форми на такий який хочете, що б не псувати вигляд нашого застосування. І у вас повинно вийти приблизно те ж саме, що у мене на зображенні зліва.Тепер, після того як ми закінчили розробку дизайну програми необхідно вже переходити власне до програмування. Звичайно дизайн досить примітивний але поки обмежимося цим.
Програмування почнемо з того що необхідно виділити нашу єдину кнопку далі переходимо в інспектор об'єктів. в ньому вибираємо вкладку Events - це і є список подій у кнопки, так що вибирати кнопку обов'язково. Кнопку можна вибрати декількома способами. Можна це зробити в випадаючому списку у інспектора об'єктів. Дуже часто доводиться робити саме таким чином коли компонент загубився на формі. Причина може бути його невеликі розміри або перекриття його іншим, більш великим, компонентом. Нас цікавить подія OnClick. У першому прикладі ми вже користувалися подіями, але Ви швидше за все цього ще не знали. Необхідно Вам зробити подвійне клацання мишки на порожньому полі праворуч від поля з написом OnClick. Delphi відразу відкриє вам вікно з кодом програми, в якому вже підготовлені заголовок і закінчення і Вам залишається тільки написати той код який Ви хочете що б виконувався. Зверніть увагу, що на тому місці в інспекторові об'єктів куди ви клацнули мишкою з'явився напис Button1Click це означає що додано подія і йому присвоєно це назва. Пропоную Вам рас кнопка називається вихід, то і зробити що б відбувався вихід з програми. Якщо ви зараз запустіть ваш додаток зробити це можна або кнопкою, або просто натиснувши кнопку F9 на клавіатурі. Після того як Delphi створить готовий проект і запустить його, а створить вона такою простою проект моментально, ви можете переконатися що при натисканні на кнопку нічого не відбувається. Закрийте Вашу програму і давайте продовжимо програмувати. Знову подивіться в Інспектор об'єктів, там ви помітите що поле де був напис Button1Click пусте. Так відбувається завжди, якщо ви не додали виконуваний код, то Delphi прибирає порожні підпрограми. Ваша програма виглядала б мало читається, якби в ній були присутні всі заголовки для всіх подій у всіх об'єктів.Тепер необхідно ще раз створити обробник подій для події OnClick. сподіваюся Ви ще пам'ятаєте як це робиться. У який з'явився тексті підпрограми.
.
procedure TForm1.Button1Click (Sender: TObject);
begin
Між операторами begin і end записуємо команду Close;
Після цього давайте додамо ще один обробник події. На цей раз це буде OnMouseMove це події виникає при русі мишки над кнопкою, причому крім просто викликупідпрограми цієї події туди передаються ще й координати мишки щодо лівого верхнього краю кнопки. Створивши обробник події допишіть в нього наступний програмний код. Трохи пізніше я поясню що воно означає.
procedure TForm1.Button1MouseMove (Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
if abs (Y - Button1.Height div 2)
else Button1.Left: = Button1.Left - (Button1.Width - X)
else
if Y - Button1.Height div 2 <0 then Button1.Top := Button1.Top + Y
else Button1.Top: = Button1.Top - (Button1.Height - Y)
end;
Після того як додасте цей код запустіть ваш додаток і поспостерігайте як кнопка буде тікати від мишки, по полю форми. курсор практично неможливо навести на кнопку. Тепер невеликі пояснення.
У даній підпрограмі дуже ефективно застосовується умовні оператор if. про нього можна прочитати в словнику, до нього ж відноситься else. Так само застосовуються властивості кнопок, а саме Button1.Width визначення ширини кнопкі1, і Button1.Height - визначення її висоти. Оператор div служить для поділу. Координати X і Y - це координати мишки які передаються в програму. abs - функція обчислює модуль
У циклах відбуваються не складні математичні обчислення, які з першого погляду виглядають дуже страшнувато. Але зрозумівши що робить кожна функція можна без праці розібратися. В даному прикладі я спеціально застосовував читання властивостей кнопки (Button1.Top. Button1.Left. Button1.Height. Button1.Width) що б зробити програму більш універсальною. Можна було замість них ввести і точні значення. Це виглядало б дуже добре ось порівняйте:
procedure TForm1.Button1MouseMove (Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
if abs (Y - 12)
else Button1.Left: = Button1.Left - (75 - X)
else
if Y - 12 <0 then Button1.Top := Button1.Top + Y
else Button1.Top: = Button1.Top - (25 - Y)
end;
Вихідний код проекту