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:

Пример операции OnCanStartDrag
<pascal>
 selection.Controller.BeginDrag(false,8);
</pascal>

Создавать операцию OnCanStartDrag в режиме перетаскивания “Автоматичекий” не нужно.

Пример операции OnDragOver с использованием объекта TbtkScriptControllerObject.DragRecord
<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.