1.2.12. Перетаскивание объектов мышью (Drag & Drop)¶
Между фреймами содержащими список, древовидный список или диаграмму возможно организовать перетаскивание элементов (Drag & Drop). Возможность перетаскивания и режим перетаскивания определяются свойствами фреймов.
New in version 5.4.0.3745: Возможность перетаскивания на диаграмму.
1.2.12.1. Свойства фреймов¶
- CanDragRows
Перетаскивание строк c фрейма.
Разрешает перетаскивать строки с данного фрейма.
- CanDropRows
Перетаскивание строк на фрейм.
Разрешает перетаскивать строки на данный фрейм с других фреймов.
- DragAndDropRows.DragMode
Начало перетаскивания.
Начало перетаскивания определяет как будет запускаться процесс перетаскивания:
dmAutomatic (автоматический режим): перетаскивание начинается после начала перемещения указателя мыши в “нажатом” состоянии. dmManual (ручной режим): при нажатии на кнопку мыши вызывается операция-триггер OnCanStartDrag, в которой программист самостоятельно включает режим перетаскивания. - DragAndDropRows.AutoDropTo
Автоматическое перемещение записи при перетаскивание.
Компонент древовидный список обладает функциональностью позволяющей без написания дополнительной логики выполнять перемещение записи между узлами. Если свойство установлено в True, то будем выполняться автоматическое перемещение записи, если в False - тогда в операции onDragDrop необходим пользовательский код, который выполнит перемещение родительской записи. По умолчанию при автоматическом перемещении после завершения перетаскивания записи, запись становиться дочерней по отношений к той над которой было закончено перетаскивание. Для управления поведением (переместить в качестве потомка, или на тот же уровень) при бросании записи используется метод
TbtkScriptControllerObject.SetDropAsChild
.
1.2.12.2. События фреймов¶
В процессе перетаскивания, в выборке срабатывают следующие события (вызываются операции-тригеры, если они существуют в выборке)
- OnCanStartDrag
- срабатывает перед началом перетаскивания, если выбран “ручной режим” перетаскивания.
- OnDragOver
вызывается при перемещение указателя мыши в режиме перетаскивания.
Операция позволяет оперировать свойством
TbtkScriptControllerObject.AcceptDragObject
. Свойство определяет может принять данный фрейм перетаскиваемый объект или нет.- OnDragDrop
- операция вызывается при “бросании” перетаскиваемого объекта.
1.2.12.3. Методы и свойства паскаль скриптера¶
TbtkScriptControllerObject.BeginDrag
- Метод запускающий перетаскивание в ручном режиме.
TbtkScriptControllerObject.DragObject
- Источник инициировавший перетаскивание.
TbtkScriptControllerObject.AcceptDragObject
- Возможность «принятия» перетаскиваемого объекта объектом, над которым находится курсор мыши.
TbtkScriptControllerObject.DragRecord
- Ссылка на обёртку записи списка или древовидного списка, либо элемента диаграммы, над которой находится курсор мыши.
TbtkScriptControllerObject.SetDropAsChild
- Метод определяющий как нужно перенести запись.
TbtkScriptRecordObject.ValueByName
- Значение ячейки по имени поля.
TbtkScriptRecordObject.Values
- Значение ячейки по индексу.
Используя Выделение нескольких записей (мультиселект) можно перетаскивать несколько записей.
1.2.12.4. Пример использования Drag & Drop.¶
Рассмотрим пример настройки перетаскивания записей из списка “источника” в список “приёмник”.
Для органицации перетаскивания записей в свойствах фрейма выборки-источника установим флаг “Перетаскивание строк c фрейма”. Свойство “Режим перетаскивания” изменять не будем, оставив его равным значению “Автоматический”. Если мы установим свойство “Режим перетаскивания” в “Ручной”, то в выборке-источнике потребуется создать операцию OnCanStartDrag:
<pascal>
selection.Controller.BeginDrag(false,8);
</pascal>
Создавать операцию OnCanStartDrag в режиме перетаскивания “Автоматичекий” не нужно.
<pascal>
selObj := selection.Controller.DragObject;
if Assigned(selObj) and (selObj.representation <> selection.Representation) then
selection.Controller.AcceptDragObject := True
else
selection.Controller.AcceptDragObject := False;
if Assigned(selection.Controller.dragRecord) then
SetVar('Caption', selection.Controller.dragRecord.valueByName['sCaption']);
</pascal>
1.2.12.5. Межпроцессовый Drag & Drop¶
Возможность принимать файлы доступна во фреймах TbtkLookupGridFrame, TbtkLookupTreeFrame и их наследниках, при этом в качестве цели для бросания выступают непосредственно список и древовидный список, а не фреймы вцелом. В свойствах фреймов добавлен раздел “Параметры межпроцессового Drag-and-Drop для файлов”, со следующими свойствами:
- FileDropEnabled
- Разрешить бросание. Позволяет включать и отключать обработку бросаемых файлов.
- FileDropOperation
- Операция вызываемая на бросание. Определяет имя операции, которая будет обрабатывать событие бросания.
Для включения возможности приёма бросаемых файлов, необходимо чтобы оба свойства были заполнены.
У операции-обработчика доступны следующие аргументы:
- Args.FileNames
- Массив имен файлов;
- Args.DropEffect
In/out параметр определяющий выполняемые/выполненные действия при бросании. Может принимать следующие значения:
deCopy: копирование файлов; deLink: создание ссылок на файлы; deMove: перемещение файлов; deNone: отсутствие какого-либо действия;
В зависимости от типа файлов и активных клавиатурных модификаторов (клавиши Shift, Ctrl и Alt) входное значение флага Args.DropEffect может меняться. Для корректного взаимодействия с приложением из которого были брошены файлы, после выполнения операций над файлами необходимо установить соответствующее произведённым действиям значение свойства Args.DropEffect.