Операційна система Windows у цілому та Delphi зокрема побудовані на концепції подій та їхнього опрацювання. Подія – це певна ситуація під час роботи (прикладної програми, комп‘ютера, операційної системи), яку фіксують, вона формує повідомлення про своє виникнення. І яку опрацьовує програма чи система, що вміє це робити. Програма чи система повинні бути відповідно налаштовані на можливе опрацювання певних подій. Один з принципів програмування для Windows – розробка програм, виконання яких ініціюють події. Якщо нема подій, то нема й виконання. Отже, важливими є правильний вибір подій, пов‘язаних з програмною системою, тобто задачею, та правильна взаємодія програм реагування на події. Зазначу, що опрацювання подій у загальному випадку може відбуватися паралельно.
Візуальні компоненти спроможні генерувати й опрацьовувати достатньо велике число (декілька десятків) подій різноманітних видів. До найбільш загальних груп подій можна віднести такі:
· вибір керуючого елемента
· переміщення покажчика миші
· натискання клавіш клавіатури
· одержання і втрата керуючим елементом фокуса введення
· переміщення об'єктів методом drag-and-drop
Нагадаємо, що події також є властивостями і належать до відповідного типу. Більшість подій має нотиіикаційнний (повідомляючий) характер і належить типу TnotifyEvent.
При виборі керуючого елемента виникає подія OnClick типу TNotifyEvent, що також називають подією натискання. Звичайно вона виникає при натискуванні кнопкою миші на компоненті. При розробці додатків подія OnClick є одною із найбільш використовуваних.
Приклад. Процедура опрацювання події вибору елемента Label1.
procedure TForml.LabellClick(Sender: TObject);
begin
// Функція Time повертає поточний час
// Функція TimeToStr перетворює час у стрічковий тип
Label1.Caption:=TimeToStr(Time);
end;
При клацанні мишею на написі в її заголовку відображається поточний час.
Для деяких компонентів подія OnClick може виникати і при інших способах натискання на керуючий елемент, що знаходиться у фокусі введення, наприклад, для компонента Button - за допомогою клавіш <пробіл> або <Enter>, а для компонента СheckBox - клавіша <пробіл>.
При натискуванні будь-якої кнопки миші генерируются ще дві події:
OnMouseDown типу TMouseEvent, що возникає при натисканні кнопки миші, і ОnMouseUp типу TMouseEvent, що возникає при відпусканні кнопки.
При натисканні кнопки миші генеруются події, показані в порядку їх виникнення:
· OnMouseDown
· OnСlick (для лівої кнопки)
· OnMouseUp
При подвійному натискуванні лівою кнопкою миші в області компонента, крім того, генерується подія ОnDbСlick типу TNotifyEvent. Події виникають у такому порядку: OnMouseDown, OnClick, OnMouseUp, ОnDbСlick, OnMouseDown, OnMouseUp.
Delphi дозволяє приведені події генерувати вручну за допомогою методу Сlick. Наприклад, оператор
Button2.Click; — імітує натискання кнопки Button2.
При переміщенні покажчика миші над візуальним компонентом безупинно виробляється подія ОnMouseMove типу TMouseMoveEvent. Останній описаний у такий спосіб: 1
TMouseMoveEvent = procedure(Sender: TObject; Shift: TShiftState; X, Y: Integer) of object;
При опрацюванні події параметр Sender вказує, над яким елементом знаходиться покажчик миші, а параметри х и y типу integer визначають позицію покажчика в системі координат елемента керування Sender. Параметр shift указує на стан клавіш <Alt>, <Ctrl> і <Shift> клавіатури і кнопок миші. Цей параметр може приймати комбінації таких значень:
ssShift - натиснута клавіша <Shift>
ssAlt - натиснута клавіша <Alt>
ssCtrl - натиснута клавіша <Ctrl>
ssLeft - натиснута ліва кнопка миші
ssMiddle - натиснута середня кнопка миші
ssDouble - виконаний подвійне натискування
При натисканні будь-якої із показаних клавіш до параметра shift добавляється відповідне значення. Наприклад, якщо натиснута комбінація клавіш <Shift> і <Ctrl>, то значенням параметра shift є [ssShift, ssCtrl]. Якщо не натиснута жодна клавіша, то параметр shift приймає порожнє значення [].
При роботі з клавіатурою генерируются події ОnKeyРress і ОnKeyDown, що виникают при натисканні клавіші, а також подія OnKeyUp, що виникає при відпусканні клавіші. При натисканні клавіші події виникають у наступному порядку: OnKeyDown,OnKeyPress,OnKeyUp.
При фіксуванні натиснутої клавіші безупинно генерується подія KeyDown, подія OnKeyUp настає тільки після відпускання клавіші.
Подія ОnKeyРress типу TKeyРressEvent генерується при кожному натискуванні алфавітно-цифрових клавіш. Звичайно воно опрацьовується тоді, коли потрібно реакція на натискання однієї клавіші.
Оброблювач події ОnKeyPress не реагує на натискання керуючих клавіш.
Для опрацювання керуючих клавіш, що не мають ASCII-кодів, можна програмно використовувати події OnKeyDown і OnKeyUp типу TKeyEvent, які виникають при натисканні на будь-яку клавішу.
При одержанні фокуса віконним елементом керування виникає подія OnEnter типу TNotifyEvent. Вона виникає при активізації керуючого елемента будь-яким способом, наприклад, натискуванням кнопки миші або за допомогою клавіші <Tab>. У випадку втрати фокуса введення віконним елементом керування виникає подія ОnExit типу TNotifyEvent.
Технологія drag-and-drop (перетягнути і залишити) дозволяє користувачу переміщати різноманітні об'єкти, наприклад, елементи з одного місця в інший. При цьому використовуються два елементи керування: джерело і приймач. Джерело містить об'єкт, який перетягують, а приймач - елемент керування, на який поміщається елемент-джерело.
З даним методом переміщення об'єктів пов'язані такі події, перераховані в порядку виникнення:
OnStartDrag типу TStartDragEvent генерується джерелом на початку виконання операції переміщення. Оброблювачу події передаються такі параметри: об'єкт-джерело Source типу TObject і адресат операції DragObject типу TDragObject.
OnDragOver типу TDragOverEvent визивається приймачем, коли об'єкт, який переміщають знаходиться над ним. Оброблювачу події передаються такі параметри: об'єкт-джерело Source типу TObject, об'єкт-приймач Sender типу TObject, поточні координати х і y типу Іnteger покажчика миші, стан переміщення State типу TDragState і ознака Accept типу Boolean підтвердження операції переміщення. Параметр стана переміщення показує, чи ввійшов об'єкт, який переміщають, в область приймача, чи пересувається він у цій області чи покинув її і не був відпущений. Аналіз переданих параметрів дозволяє елементу-приймачу прийняти або відхилити елемент-джерело. Якщо операція переміщення прийнята, то параметру Accept потрібно задати значення True, в іншому випадку - False.
ОnDragDrop типу TDragDropEvent визивається приймачем, коли об‘єкт поміщається на нього. Для опрацювання операції переміщення оброблювачу події передається така інформація: вихідний об'єкт Sourse типу TObject, об'єкт-приймач Sender і поточні координати х та y вказівника миші.
OnEndDrag типу TEndDragEvent генерується джерелом, коли операція переміщення завершується. Оброблювачу події передаються об‘єкт-приймач Target типу TObject і координати х та y точки, у якій був відпущений об'єкт-джерело Sender.
Для подій OnDragDrop і OnDragOver параметр Sender являє собою адресат операції, тобто приймач, а для події OnEndDrag параметр Sender є перетягуваним об'єктом-джерелом.
Для реалізації переміщення методом drag-and-drop потрібно написати процедуру опрацювання показаних подій. Звичайно достатньо опрацювати дві події, OnDragDrop і OnDragOver. Для об'єкта-джерела, що перетягується, властивість DragMode бажано встановити в значення dmAutomatic, при цьому початок операції переміщення буде відбувається автоматично, інакше необхідно програмно викликати метод BeginDrag.
У процедура опрацьовуння події OnDragOver виконується аналіз на допустимість операція переміщення. Якщо операцію переміщення можна прийняти, то ознаці Accept установлюється значення True, в іншому випадку - False.
У процедурі опрацьовування події OnDragDrop здійснюється прийом і опрацювання переміщеного об'єкта.
Приклад. Переміщення напису Label1 у межах форми Form1.
//Для напису Label1 необхідно встановити властивість DragMode у значення dmAutomatic
procedure Tform1.FormDragOver (Sender, Source: TObject; X, Y: Integer; State: TDragState; var Accept: Boolean);
begin
if Source=Label1 then Accept:=true else Accept:=false;
end;
procedure TForm1.FormDragDrop(Sender, Source: TObject; X, Y: Integer);
begin
Label1.Left:=X; Label1.Top:=Y;
end;
Переміщення віконних елементів керування під час виконання додатку можна виконати без застосування технології drag-and-drop. Для цього використовується подія ОnMouseDown, пов'язана з натисканням кнопки мишки.
Якщо курсор якийсь час нерухомий в області компонента, то виникає подія onHint типу TNotifyEvent, яку можна використовувати для написання процедур опрацьовування, пов'язаних із виведенням контекстної допомоги.