Назва технології drag and drop перекладається як. Технологія перетягування (drag and drop)
Для бібліотеки VCL фірмою Borland реалізована власна версія інтерфейсу Drag & Drop (перекладається як "перетягнути"). Інтерфейс цей внутрішній - передавати і приймати можна будь-які керуючі елементи Delphi всередині форми "(крім самої форми). Він реалізований без використання відповідних функцій API Windows - їх потрібно застосовувати при організації спілкування з іншими завданнями шляхом перетягування.
Натиснувши ліву кнопку миші над елементом управління, ми можемо "перетягнути" його на будь-який інший елемент. З точки зору програміста це означає, що в моменти перетягування і відпускання клавіші генеруються певні події, якими передається вся необхідна інформація - покажчик на перетаскується, поточні координати курсору і ін. Одержувачем подій є той елемент, на якому в даний момент знаходиться курсор. Оброблювач такої події має повідомити системі, чи приймає данньш елемент управління "посилку" чи ні. При відпуску кнопки над приймаючим елементом управління генерується ще одне або два події, в залежності від готовності приймача.
CancelDrag Скасовує поточну drag-and-drop або drag-and-dock операцію.
Функція FindDragTarget (const Pos: TPoint; AllowDisabled: Boolean): TControl;
Функція повертає об'єкт базового класуTControl , До якого належить позиція екрану з координатами, визначеними параметром Pos. Призначений для визначення потенційного одержувача drag-and-drop або drag-and-dock операції. Якщо для зазначеної позиції не існує ніякого віконного засоби управління, то функція повертаєnil . Параметр AllowDisabled визначає, чи будуть враховуватися заблоковані (disabled) об'єкти.
Функція IsDragObject (Sender: TObject): Boolean;
Функція визначає, чи є об'єкт, визначений в параметрі Sender, нащадком класуTDragObject . Дану функцію можна використовувати в якості параметра Source в обробниках подій OnDragOver і OnDockOver для того, щоб визначити чи буде прийнятий перетаскується. також функціюIsDragObject можна використовувати в якості параметра Source в обробниках подій OnDragDrop і OnDockDrop для того, щоб правильно інтерпретувати перетаскується.
Властивості DragMode, DragCursor, методи BeginDrag, OnDragOver, OnDragDrop, OnEndDrag, OnStartDrag, параметр Accept
Процес перетягування за допомогою миші інформації з одного об'єкта в інший широко використовується в Widows.Можно переміщати файли між папками, переміщати самі папки і ін.
Всі властивості, методи і події, пов'язані з процесом перетягування, визначені в класі TControl, що є прабатьком всіх візуальних компонентів Delphi. Тому вони є загальними для всіх компонентів.
Починайте перетягувати визначається властивістю DragMode, яке може встановлюватися в процесі проектування або програмно рівним dmManual або dmAutomatic. Значення dmAutomatic (автоматичне) визначає автоматичне початок процесу перетягування при натисканні користувачем кнопки миші над компонентом. Однак в цьому випадку подія OnMouseDown, пов'язане з натисканням користувачем кнопки миші, для цього компонента взагалі не настає.
Інтерфейс перенесення і прийому компонентів з'явився досить давно. Він забезпечує взаємодію двох елементів управління під час виконання програми. При цьому можуть виконуватися будь-які необхідні операції. Незважаючи на простоту реалізації і давність розробки, багато програмістів (особливо новачки) вважають цей механізм малозрозумілим і екзотичним. Проте використання Drag-and-Drop може виявитися дуже корисним і простим в реалізації. Зараз ми в цьому переконаємося.
Для того щоб механізм запрацював, потрібно налаштувати відповідним чином два елементи управління. Один повинен бути джерелом (Source), другий - приймачем (Target). При цьому джерело нікуди не переміщається, а тільки реєструється в цій іпостасі в механізмі.
Повірте, досить просто перетворити X, Y координати, передаються в параметрах подій OnDragOver і OnDragDrop, в координати форми.
Працюйте з властивостями Left і Top компонента, над яким переміщається курсор. Наведу простий приклад. Помістіть на форму компонент Memo і надайте властивості Align значення alTop. Помістіть на форму панель, також прісвойсте властивості Align значення alTop і задайте невелике значення властивості Height, скажімо 6 або 7 пікселів. Встановіть DragMode на dmAutomatica і DragCursor на crVSplit. Помістіть інший Memo-компонент і встановите Align на alClient. Одночасно виберіть обидва Memo-компонента, панель і створіть загальний обробник події OnDragOver як показано нижче:
182
У цьому прикладі ми вибираємо елемент div і робимо його переміщуються шляхом виклику для нього методу draggable (). Як показано на малюнку нижче, в відкритому документі елемент займає своє звичайне позицію, але після цього його можна перемістити за допомогою покажчика миші в будь-яке місце в вікні браузера:
Можливість перетягування елементів корисна вже сама по собі, але вона приносить ще більше користі, якщо застосовується в поєднанні з взаємодією Droppable, яке описано далі.
Взаємодія Draggable реалізується виключно за рахунок використання специфічної HTML-розмітки і CSS-стилів. Це означає, що дана функціональність буде працювати практично в будь-якому браузері, але наділені нею елементи не зможуть працювати з аналогічними власними коштами Drag-and-drop операційних систем.
Обумовлені специфікацією HTML5 операції Drag-and-drop зазвичай реалізуються з використанням власних механізмів операційних систем. Якщо ви використовуєте механізм Drag-and-drop jQuery UI, то щоб уникнути виникнення конфліктних ситуацій еквівалентні засоби HTML5 краще відключити. З цією метою встановіть для атрибута draggable елемента body документа значення false.
Налаштування взаємодії Draggable
Існує безліч опцій налаштування для взаємодії Draggable. Найбільш важливі властивості, розгляду яких присвячені наступні розділи, наведені в таблиці нижче:
властивість | опис |
---|---|
axis | Обмежує можливості переміщення певними напрямками. Значення за замовчуванням - false, воно означає відсутність обмежень, але можна також вказати значення "x" (переміщення тільки уздовж осі X) або "y" (переміщення тільки уздовж осі Y) |
containment | Обмежує розташування переміщуваного елемента певної областю екрану. Типи підтримуваних значень описані в таблиці нижче, при розгляді відповідного прикладу. Значення за замовчуванням - false, воно означає відсутність обмежень |
delay | Визначає час, протягом якого має здійснюватися перетягування елемента, перш ніж він переміститься. Значення за замовчуванням - 0, воно означає відсутність затримки |
distance | Визначає відстань, на яку користувач повинен перетягнути елемент з його початкової позиції, перш ніж він дійсно переміститься. Значення за замовчуванням - 1 піксель |
grid | Здійснює примусову прив'язку переміщуваного елемента до осередків сітки. Значення за замовчуванням - false, воно означає відсутність прив'язки |
Обмеження напрямків переміщення
Існують кілька способів, за допомогою яких можна обмежити переміщення елемента певними напрямками. Перший з них полягає у використанні опції axis, що дозволяє обмежити напрямок переміщення віссю X або Y. Відповідний приклад наведено нижче:
...