Урок №2 (Обробка подій, що тікає кнопка)
У цьому уроці я постараюся пояснити як створюється обробка подій. Почнемо з того що я поясню що така подія. Подія (англійське event) - це як ви напевно здогадалися це така ситуація, коли щось відбувається. Ось наприклад ви натиснули кнопку, і ось тут-то і відбувається обробка цієї події. У першому уроці як раз була обрабитка події натискання на кнопку, я спеціально не став вдаватися в подробиці. Тим більше відразу все запам'ятати неможливо.
Треба зробити відступ. Операційна система побудована таким чином, що вона постійно обробляє повідомлення, реагуючи на дії користувача, на його натискання на клавіатурі і мишці. Дуже часто виходить так що система чекає введення від користувача. А після цього починає виконувати певні дії прості або не дуже, може навіть вкрай складні операції.
Так ось, за певних діях користувача ваше додаток викликає певні підпрограми. Подій цих дуже багато, так що всі ми розглядати не будемо, а розглянемо як приклад простий приклад.

Тепер, після того як ми закінчили розробку дизайну програми необхідно вже переходити власне до програмування. Звичайно дизайн досить примітивний але поки обмежимося цим.

Тепер необхідно ще раз створити обробник подій для події 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;
Вихідний код проекту