V8 Глобальне перетягування, Книга знань
Як тільки я дізнався про існування перетягування, я дуже здивувався тому факту, що воно так мало використовується в типових конфігураціях. І я вирішив реалізувати свій погляд на ефективне використання цього механізму.
Для початку трохи загальних моментів про сам механізм.
Саме поняття "перетягування" (Drag&Drop) передбачає інтерактивну передачу значення від джерела приймачеві. Події перетягування всього 4: - ПочатокПеретягування - ЗакінченняПеретягування - ПеревіркаПеретягування - Перетягування Для першої пари подій необхідно встановити прапорець у налаштуваннях елемента керування "Дозволити початок перетягування". Для другої пари - "Дозволити перетягування". Перетягування реалізовано для двох видів елементів управління: ТабличнеПоле та ПолеТабличногоДокумента. Для поля табличного документа є певні обмеження. По-перше, у режимі ТількиПерегляд обробляються лише перша пара подій, тобто. у цьому випадку воно не може виступати як приймач. По-друге, початок перетягування може бути викликано лише однієї прямокутної області.
У кожного типу обробника події перетягування є параметр Параметри Перетягування. Цей параметр є структурою з 3-х елементів: - Дія - ДопустиміДії - Значення
Почнемо з останнього параметра - Значення. Він при стандартному початку перетягування у різних випадках має різний тип. Якщо джерелом є елемент керування типу ТабличнеПоле , то значення перетягування матиме тип рядка значення табличного поля в одиночному режимі виділення та тип Масив у разі множинного режиму виділення, де елементами масиву будуть рядки значення табличного поля. У разі поля табличного документа тип значеннябуде ТабличнийДокумент і міститиме одну виділену прямокутну область.
Параметр Дія відповідає за зовнішній вигляд курсору та використовується для керування типом перетягування. Він може приймати 4 значення: - Вибір - Копіювання - Скасування - Переміщення При перетягуванні лівою кнопкою миші за умовчанням Дія містить Переміщення . Якщо користувача додатково утримує клавішу , Дія містить Копіювання . Якщо перетягування здійснюється правою кнопкою миші, то за замовчуванням Дія містить вибір незалежно від стану клавіші . При цьому, коли ви звільните праву кнопку миші в приймачі, за замовчуванням буде виведено спливаюче меню вибору, що містить всі доступні дії перетягування та його скасування.
Параметр ДопустиміДії призначений для передачі приймачеві допустимих типів перетягування і може приймати також 4, але вже інших значення: - Копіювання - КопіюванняІПереміщення - Необробляти - Переміщення
Схема виникнення подій така. Як тільки користувач почав переміщати курсор миші із затиснутою лівою або правою кнопкою, виникає подія Початок Перетягування . При вході курсору з як і раніше затиснутою кнопкою в область нового осередку елемента управління виникає подія Перевірка Перетягування . Залежно від того, яке значення параметра Дія поверне цю подію, змінюється іконка курсору. Коли користувач нарешті звільняє затиснуту кнопку миші, виникає подія Перетягування в приймачі і відразу після нього Закінчення Перетягування в джерелі.
Як перетягувати з табличного документа?
Для початку переконайтеся, що для потрібного поля табличного документа встановлено прапорець "Дозволити початок перетягування". Тепер виділіть ОДНУ будь-яку прямокутну областьтабличного документа і підведіть курсор миші до її будь-якої межі так, щоб курсор набув форми стрілки (звичайного покажчика). Ось тільки з цієї миті можна перетягувати.
Основні ідеї глобального перетягування.
По-перше, необхідно створити загальну форму з маленьким табличним полем та зробити її вікно прикріплюємо. Вона буде використовуватися як кишеня, в яку і з якого користувач буде перетягувати значення з різних елементів управління. По-друге, необхідно створити глобальні обробники для необхідних типів подій перетягування. Бажано також створити відповідні уніцифовані обробники типів подій для поміщення їх у модуль потрібних форм. По-третє, потрібно продумати саму дію, яка буде виконуватися в кожному поєднанні типів джерела та приймача при кожній дії перетягування. По-четверте, слід придумати, як найбільш ефективно відловити подію Привідкритті у якомога більшої кількості форм конфігурації для встановлення дозволу початку перетягування.
Опис мого прикладу реалізації
1) При відкритті кожної форми, елементи якої мають виступати в ролі джерела перетягування, потрібно викликати загальну процедуру ЛксПрі Відкриття Форми, яка дозволить елементам форми виступати в ролі джерела перетягування. Але це стосується тільки випадків, коли прапорець "Дозволити початок перетягування" не встановлено хоча б у одного з потрібних елементів управління.
2) У модуль кожної форми, елементи якої повинні виступати в ролі приймача перетягування, слід помістити уніфіковані обробники подій
У події ПріВідкриття таких форм вже обов'язково потрібно викликати ЛксПріВідкриттяФорми , яка крім установки прапорця "Дозволити перетягування" ще підключить ці обробники для всіхелементів управління форми типу Табличне поле. Поле табличного документа має вже згадані обмеження, через які довелося відмовитися від використання його як приймач перетягування.
3) Перед використанням значення перетягування розгортається масив посилань на об'єкти БД (надалі - масив перетягування). Якщо при розгортанні зустрічається рядок таблиці значень або дерева значень (або табличної частини), то вона замінюється значенням першої знайденої колонки з масиву ключових колонок перетягування.
4) Якщо перетягування відбувається на табличне поле, яке є списком посилань, то намагається знайти в цьому списку перший елемент масиву перетягування, що має відповідний тип. Якщо в приймачі не можна додавати рядки або не затиснута клавіша , то робиться спроба пошуку по всіх колонках зв'язку значення табличного поля. Після виявлення посилання курсор у табличному полі встановлюється на знайдений рядок. Інші елементи масиву перетягування ігноруються.
5) Якщо затиснута клавіша і в табличному полі дозволено додавання рядків і воно не є списком, то спроба додати кожен елемент масиву перетягування до нового рядка. Колонка для ключа перетягування підбирається за типом. Через додатковий параметр можна увімкнути перевірку унікальності перед додаванням рядка.