V8 Global Drag, Книга на знанието

След като научих за съществуването на плъзгане и пускане, бях много изненадан от факта, че се използва толкова малко в типичните конфигурации. И реших да приложа моето виждане за ефективното използване на този механизъм.

Първо, няколко общи точки за самия механизъм.

Самата концепция за "плъзгане и пускане" предполага интерактивно прехвърляне на стойност от източника към получателя. Има общо 4 събития за плъзгане: -StartDrag -EndDrag -CheckDrag -Drag За първата двойка събития поставете отметка в квадратчето „Разрешаване на стартиране на плъзгане“ в настройките на контролата. За втората двойка - "Разрешаване на плъзгане и пускане". Плъзгане и пускане се прилага за два типа контроли: TableField и TableDocumentField. Има някои ограничения за поле на електронна таблица. Първо, в режим ViewOnly се обработват само първата двойка събития, т.е. в този случай той не може да действа като приемник. Второ, началното плъзгане може да се извика само за една правоъгълна област.

Всеки тип манипулатор на събития за плъзгане има параметър за опции за плъзгане. Този параметър е структура от 3 елемента: - Действие - ValidActions - Стойност

Да започнем с последния параметър – Value. Има различен тип при стандартното начало на влачене в различните случаи. Ако източникът е контрола от тип TableField, тогава стойността на плъзгане ще бъде от тип ред стойност на поле на таблица в режим на единичен избор и тип Array в случай на режим на множествен избор, където елементите на масива ще бъдат редове със стойност на поле на таблица. В случай на поле на документ от електронна таблица, типът стойностще бъде SpreadDocument и ще съдържа една избрана правоъгълна област.

Параметърът Action контролира външния вид на курсора и се използва за управление на типа плъзгане. Може да приема 4 стойности: - Избор - Копиране - Отказ - Преместване Когато плъзгате с левия бутон на мишката, действието по подразбиране съдържа Преместване . Ако потребителят допълнително задържи клавиша, действието съдържа Копиране. Ако плъзгането се извършва с десния бутон на мишката, тогава по подразбиране действието съдържа Избор, независимо от състоянието на клавиша. Въпреки това, когато пуснете десния бутон на мишката върху приемника, по подразбиране ще се покаже изскачащо меню за избор, съдържащо всички налични действия за плъзгане и пускане.

Параметърът AllowedActions има за цел да предаде приемливите типове плъзгане към приемника и може също да приеме 4, но вече различни стойности: - Копиране - CopyAndMove - Не обработвай - Преместване

Схемата на възникване на събитията е следната. Веднага щом потребителят започне да движи курсора на мишката, докато държи натиснат левия или десния бутон, се задейства събитието DragStart. Когато курсорът, докато все още държи бутона, влезе в зоната на нова контролна клетка, събитието ValidateDrag се повдига. В зависимост от това каква стойност на параметъра Action ще върне това събитие, иконата на курсора се променя. Когато потребителят най-накрая пусне бутона на мишката, който е задържан, събитието Drag and Drop се задейства на приемника, последвано веднага от събитието Drag End на източника.

Как да плъзгате и пускате от документ с електронна таблица?

Първо се уверете, че флагът „Разрешаване на стартиране на плъзгане“ е зададен за необходимото поле на документа с електронна таблица. Сега изберете ЕДНА произволна правоъгълна областдокумент с електронна таблица и преместете курсора на мишката до някоя от неговите граници, така че курсорът да приеме формата на стрелка (обикновен показалец). Отсега нататък можете да плъзгате и пускате.

Основни идеи за глобално плъзгане и пускане.

Първо, трябва да създадете общ формуляр с малко таблично поле и да направите прозореца му закрепващ се. Той ще се използва като джоб, в който и от който потребителят ще плъзга стойности от и към различни контроли. Второ, трябва да създадем глобални манипулатори за типовете събития на плъзгане, от които се нуждаем. Също така е желателно да се създадат подходящи унифицирани манипулатори на типове събития, които да се поставят в модула на необходимите форми. Трето, трябва да помислите за действието, което ще бъде извършено върху всяка комбинация от типове източник и дестинация за всяко действие на плъзгане. Четвърто, трябва да разберете как най-ефективно да улавяте събитието OnOpen на възможно най-много конфигурационни форми, за да зададете разрешение за стартиране на плъзгане.

Описание на моя пример за внедряване

1) Когато отваряте всяка форма, чиито елементи трябва да действат като източник на плъзгане, трябва да извикате общата процедура LxOnFormOpen, която ще позволи на елементите на формуляра да действат като източник на плъзгане. Но това се отнася само за случаите, когато квадратчето „Разрешаване на стартиране на плъзгане“ не е отметнато за поне един от желаните контроли.

2) В модула на всяка форма, чиито елементи трябва да действат като приемник за плъзгане, трябва да поставите унифицирани манипулатори на събития

В събитието OnOpening на такива форми вече е необходимо да се извика LksOnFormOpening, което в допълнение към настройката на флага „Разрешаване на плъзгане и пускане“ също ще свърже тези манипулатори за всичкиконтроли на формата от тип TableField. Полето на документа на електронната таблица има вече споменатите ограничения, които доведоха до отхвърлянето на използването му като цел за изхвърляне.

3) Преди употреба стойността на плъзгане се разширява в масив от връзки към обекти на база данни (наричан по-долу масив плъзгане). Ако по време на разширяването се срещне ред от таблица със стойности или дърво със стойности (или таблична част), той се заменя със стойността на първата намерена колона от масива от колони за плъзгане на ключ.

4) Ако плъзгането се случи на таблично поле, което е списък от връзки, тогава се прави опит да се намери в този списък първият елемент от масива за плъзгане, който има подходящия тип. Ако не е възможно да се добавят редове в приемника или клавишът не е натиснат, тогава се прави опит за търсене във всички референтни колони за стойността на полето на таблицата. След като връзката бъде намерена, курсорът в полето на таблицата се поставя на намерения ред. Останалите елементи от масива за плъзгане се игнорират.

5) Ако е натиснат клавишът и е разрешено добавянето на редове в полето на таблицата и то не е списък, тогава се прави опит за добавяне на всеки елемент от масива за плъзгане към нов ред. Колоната за клавиша за плъзгане се избира по тип. Чрез допълнителен параметър можете да активирате проверка за уникалност преди добавяне на ред.

Специална реализация на плъзгане и пускане върху стандартна форма за избор на 1C конфигурации.