Перетаскивание во время выполнения программы

Все простые графические объекты, а также некоторые комплексные графические объекты поддерживают перетаскивание (Drag & Drop).

Для реализации функции перетаскивания пользователь должен указать объекту, может ли данный объект быть перетаскиваемым и может ли объект принимать перетаскиваемые объекты. Для настройки поддержки перетаскивания используются атрибуты «Перетаскиваемый» («Draggable») и «Принимает перетаскиваемые объекты» («Accept Drops») в Редакторе свойств или поддерживающий чтение и запись атрибут «acceptDrops» в сценарии на языке CONTROL. Данный атрибут позволяет в режиме выполнения устанавливать или опрашивать, обрабатывает ли интересующий объект события сброса (Drop).

Существует три обработчика событий, доступных для всех простых графических объектов:

1) DragStart ( main(int keys) )

Данный обработчик события (сценарий) запускается, если значение атрибута «Перетаскиваемый» «Draggable» равно «TRUE».

ПараметрОписание
keysСодержит комбинацию клавиш модификатора клавиатуры, которые пользователь должен держать нажатыми в начале операции перетаскивания. Константы для обозначения клавиш в языке CONTROL и их комбинации уже были описаны в руководстве: KEY_SHIFT,  KEY_CONTROL, KEY_ALT, KEY_META.

В сценарии для данного события определяется, какая информация должна быть предоставлена для операции перетаскивания. В зависимости от передаваемого параметра «keys» также принимается решение о типе операции перетаскивания, подлежащей выполнению. Для начала операции перетаскивания сценарий должен вызвать функцию dragStart() языка  CONTROL

ПРИМЕЧАНИЕ

Графические объекты внутри панели-ссылки являются исключением: они предоставляют свои $-параметры в качестве информации о перетаскивании по умолчанию, когда они не используют функцию dragStart() в скрипте. $-параметры передаются в формате «$name:value» или «n$name:value» и т.д. Например:
$DPE:Motor1.runs
$color:green

2) DragEnter  ( main(string information, int dragType) )

ПараметрОписание
информация«information» является принятым от операции перетаскивания текстом в формате «text/plain» (неформатированный текст)
dragType«dragType» является одной из констант операции перетаскивания: DRAG_COPYDRAG_MOVE или DRAG_LINK. Более подробная информация о константах приводится в описании параметров функции dragStart()

Данное событие запускается только, если графический объект принимает перетаскиваемые объекты и не был отключен. Графическим объектом определяется его готовность принять перетаскиваемую информацию. Если объект готов, то он должен вызвать функцию dropAccept() языка CTRL.

3) DragDrop ( main(string information, int dragType) )

Данный обработчик события (сценарий) запускается при сбросе информации пользователем, и графический объект ранее сообщил системе через функцию «dropAccept()» о готовности приема перетаскиваемой информации. Передаваемые аргументы совпадают с аргументами события DragEnter.

Комплексные графические объекты

Перетаскивание в «КАСКАД Цифра» также поддерживается некоторыми комплексными графическими объектами:

Таблица

Таблица может принимать сбрасываемую информацию (drop information), если значение атрибута «Принимает перетаскиваемые объекты» («Accept Drops») установлено в Редакторе свойств как «TRUE». При сбросе информации на таблицу, сброс вызывает сценарий обработки события «DragDrop» со следующими аргументами:

main(string information, int dragType, int row, string column)

Данные из ячейки таблицы можно перетаскивать на другие объекты, например на текстовые поля. Для этого необходимо установить атрибут «Перетаскиваемый» («Draggable») в Редакторе свойств. Если перетаскивание разрешено, то оно инициирует сценарий обработки события «DragStart» со следующими аргументами:

main(int keys, int row, string column)

Если в сценарии обработки события «DragStart» не указывается особый порядок обработки, по умолчанию передается содержимое выделенных ячеек таблицы в следующем формате:

  R1C1\tR1C2\tR1C3\n

  R2C1\tR2C2\tR2C3

и так далее. Содержимое ячеек, находящихся в одной строке таблицы, разделяется знаком табуляции (\t), а строки разделяются символом новой строки (\n).

ПРИМЕЧАНИЕ

ОБРАТИТЕ ВНИМАНИЕ, что для поддержки перетаскивания информации для таблицы необходимо задать значение как «mode != TABLE_SELECT_NOTHING» (см. «selectByClick»).

ВНИМАНИЕ

По умолчанию возможно перетаскивание ячеек таблицы, например, на Текстовое поле (textWidget). В случае изменения события «DragStart» и добавления кода с последующим удалением кода, но не всего сценария, включая элемент «mail{}», перетаскивание ячеек становится невозможным. Для восстановления работоспособности перетаскивания по умолчанию необходимо удалить весь сценарий.

Сценарий DragEnter не применим для таблицы, в связи с чем нет необходимости вызывать dropAccept(). Если значение «acceptDrops» равно «TRUE», разрешаются все перетаскивания на объект.

Дерево точек данных

Дерево точек данных может принимать перетаскиваемую информацию, если атрибуту «Принимает перетаскиваемые объекты» («Accept Drops») в Редакторе свойств присвоено значение «TRUE». При сбросе информации вызывается сценарий обработки события «DragDrop» со следующими аргументами:

  main(string information, int dragType, string id)

ПараметрОписание
idСоответствует идентификатору элемента, на который было осуществлено перетаскивание информации, или равен «», если элементы в иерархическом списке самостоятельно разрешают перетаскивание и/или сброс. Используются следующие методы иерархического списка:

  tree.setDragEnabled(string id, bool enable);

  tree.setDropEnabled(string id, bool enable);

Опрос текущего состояния возможен следующим образом:

  bool tree.dragEnabled(string id);

  bool tree.dropEnabled(string id);

При перетаскивании запускается сценарий обработки события «DragStart» со следующими аргументами: 

  main(int keys, string id)

Информация, перетаскиваемая с помощью dragStart(), должна быть доступна. Если в событии не реализован сценарий, то элемент передает содержимое всех столбцов в виде текста в формате: C1\tC2\tC3. Это означает, что содержимое ячеек, соответствующих одной записи, разделяется знаком табуляции. Здесь отсутствует сценарий DragEnter, в этой связи нет необходимости вызывать dropAccept().  

Изменение идентификатора

Без привязки к перетаскиванию, существующий идентификатор может быть изменен на новый. Для этого необходимо использовать следующий метод: 

   tree.changeId(oldID, newID);

В момент изменения прежний идентификатор должен «физически» существовать, тогда как новый идентификатор должен «физически» отсутствовать.

Тренд

 Виджет «Тренд» может принимать перетаскиваемую информацию, если атрибуту «Принимает перетаскиваемые объекты»  («Accept Drops») присвоено значение «TRUE».

 Данный виджет не поддерживает операции перетаскивания (с тренда).

Во время выполнения программы, например, возможно перетаскивание объекта (из каталога объектов) на кнопку тренда.

Если на кнопку тренда перетаскивается символ, выполняется команда «DRAG_COPY», при этом информация добавляется в буфер тренда. Если во время перетаскивания нажимается клавиша CTRL, выполняется команда «DRAG_MOVE». При этом буфер очищается, а символ добавляется.

Рисунок: демонстрационное приложение и буфер тренда

Когда перетаскиваемая информация достигает область тренда, запускается сценарий обработки события «DragEnter» со следующими аргументами:

main(string information, int dragType, int area)

ПараметрОписание
area «area» соответствует номеру области тренда. Если в сценарии обработки события не указан особый порядок обработки, то автоматически принимается вся сбрасываемая информация

При сбросе запускается сценарий обработки события «DragDrop» со следующими аргументами:

  main(string information, int dragType, int area)

Это эквивалентно событию «DragEnter».

Текстовое поле (однострочный текст), текстовый редактор (многострочный текст)

Оба объекта могут быть настроены на принятие перетаскиваемой информации. Если атрибуту «Принимает перетаскиваемые объекты» («Accept Drops») присвоено значение «TRUE», при сбросе запускается сценарий обработки события «DragDrop». Аргументы передаются те же, что и в случае с простыми графическими объектами. Перетаскивание информации с данных виджетов доступно всегда.

DPE-монитор

Поддерживается перетаскивание точки данных на таблицу элементов точек данных. Если точка данных уже существует, выводится сообщение «Данный DPE уже является частью данной конфигурации».

Пути к файлам и перетаскивание

Поддерживается перетаскивание файла из Проводника Windows на текстовое поле или в текстовый редактор. После этого в текстовом поле выводится путь к файлу. Для обеспечения приема перетаскиваемых значений текстовое поле или текстовый редактор должны быть предварительно соответствующим образом настроены.

Рисунок: путь к файлу в текстовом редакторе

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *