Архив рубрики: Native_GEDI

Множественный выбор во время выполнения программы

Множественный выбор примитивов во время выполнения программы

  • Новое свойство панели «Выбор в режиме выполнения» (по умолчанию отключено). Опция обеспечивает включение/отключение режима выбора простых графических объектов в модуле VISION.
  • Новый атрибут простого объекта «Выбираемый» (только в GEDI). Определяет возможность выбора графического объекта во время выполнения программы.
  • Новый атрибут простого объекта «selected» (в языке CONTROL. Поддерживается чтение и запись). Указывает состояние выделения. Может изменяться только в том случае, если объект является выбираемым.
  • Новое событие простого объекта «SelectionChanged». Это событие инициируется всегда при изменении свойства «selected» объекта (либо пользователем при выборе объекта, либо программно сценарием на языке CONTROL при изменении значение атрибута «selected«).
  • Новый атрибут объекта «shapeType» (в языке CONTROL. Поддерживает только чтение). Возвращает строку, соответствующую типу графического объекта.

Полный перечень:

«PRIMITIVE_TEXT» (простой текст), «LINE» (линия),«RECTANGLE» (прямоугольник),«ELLIPSE» (эллипс),«ARC» (сектор),«POLYGON» (полигон),«PUSH_BUTTON» (кнопка),»TEXT_FIELD» (текстовое поле),«CLOCK» (часы),«SELECTION_LIST» (список выбора),«RADIO_BOX» (переключатель),«CHECK_BOX» (селектор),«SPIN_BUTTON» (счетчик),«COMBO_BOX» (выпадающий список),«TREND» (тренд),«TABLE» (таблица),«CASCADE_BUTTON» (кнопка с выпадающим меню),«BAR_TREND» (столбчатый тренд),«TAB» (вкладка),«ACTIVE_X»,«FRAME» (рамка),«PIPE» (трубопровод),«DP_TREE» (дерево точек данных),«TEXT_EDIT» (многострочный текстовый редактор),«SLIDER» (ползунок),«THUMB_WHEEL» (колесо прокрутки),«PROGRESS_BAR» (индикатор выполнения),«TREE» (иерархический список),«DPTYPE» (дерево типов точек данных),»LCD» (цифровой дисплей (ЖК-индикатор)),»ZOOM_NAVIGATOR» (навигатор с масштабированием),»EMBEDDED_MODULE» (встроенный модуль).

Внешние виджеты показывают собственное специальное имя типа. Атрибут «shapeType» также выводится в строке состояния графического редактора GEDI при выделении соответствующего графического объекта.

  •  Новая функция CONTROL:

   dyn_string getShapes(string moduleName = myModuleName(),

                        string panelName = myPanelName(),

                        string attribute = «selected»,

                        anytype value = true)

Данная функция выдает список имен графических объектов (или RefName.ShapeName, если графический объект находится внутри PanelRef (панели-ссылки)), выбранных в соответствии с указанными аргументами выбора:

moduleName: Имя модуля, в котором открыта панель. По умолчанию задан элемент «myModuleName()».

panelName: Имя панели. По умолчанию задано «myPanelName()».

attribute: Простое имя атрибута графического объекта, например, «foreCol», «selected», «visible».

Могут использоваться все атрибуты, возвращающие простой тип данных («position», например, использовать нельзя );
по умолчанию: «selected».

value: Значение, которое указывает, что атрибут должен включить графический объект в итоговый список.   
По умолчанию имеет значение «TRUE».

  ПРИМЕР

Получение списка всех графических объектов с цветом фона {255,255,255} с последующим их выбором:

main()

  {

    dyn_string shapes;

    shapes = getShapes(myModuleName(), myPanelName(),

                                                «backCol», «{255,255,255}»);

    for (int i = 1; i <= dynlen(shapes); i++)

    {

      setValue(shapes[i], «selected», true);

    }

  }

 ПРИМЕР

Получение списка всех графических объектов типа «TEXT_FIELD»:

  dyn_string shapes = getShapes(myModuleName(), myPanelName(),

                                              «shapeType», «TEXT_FIELD»);

  • Для того, чтобы обеспечить доступ к $-параметрам определенной PanelRef (панели-ссылки), панель-ссылка содержит атрибут «dollars» (только чтение). В результате получается сопоставление, в котором ключом является имя $-параметра,

     а значением – значение $-параметра. Например:

  mapping params;

  getValue(«Ref1», «dollars», params);

  DebugN(params[«$DP»]);

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

В следующем примере описывается создание панели с несколькими различными объектами. При этом некоторую информацию можно будет перетаскивать между объектами. Вы научитесь использовать функцию перетаскивания.

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

Приведенная выше панель позволяет выполнять следующие действия:

  • Выбирать цвет с помощью панели выбора цвета «КАСКАД Цифра» (эта панель открывается при нажатии на соответствующую кнопку), а затем перетаскивать его на расположенный на панели объект (прямоугольник, сектор, полигон или эллипс).
  • Выбирать точку данных из дерева точек данных и перетаскивать ее на текстовое поле или на текстовый редактор.
  • Выбирать название цвета из иерархического списка и перетаскивать его на текстовое поле или на текстовый редактор.

Процесс создания панели:

  1. С помощью графического редактора GEDI создайте панель со следующими графическими объектами:
    • 1 прямоугольник
    • 1 кнопка с рисунком «<путь_КАСКАД>/pictures/colors.png»
    • 2 текстовых поля
    • 1 дерево точек данных
    • 1 сектор
    • 2 текстовых редактора
    • 1 иерархический список
    • 1 полигон
    • 2 эллипса
  1. Для всех созданных объектов в графическом редакторе присвойте значение «TRUE» атрибуту «Accept drops». Атрибут «Accept drops» указывает, может ли графический объект принимать перетаскиваемую информацию.
  2. В графическом редакторе для прямоугольника, сектора, полигона и эллипсов присвойте значение «TRUE» атрибуту «Перетаскиваемый» («Draggable»). Атрибут «Перетаскиваемый» («Draggable») указывает, возможно ли перетаскивание информации с этого объекта.
  3. Для прямоугольника используйте событие «DragStart». С помощью сценария для этого события определяется, какая информация должна быть предоставлена операции перетаскивания. Прямоугольник должен предоставлять операции перетаскивания информацию о цвете. Для этого следует использовать следующий сценарий.
main(int keys){  string info;  info = this.backCol;    dragStart(info);}

ВНИМАНИЕ

В настоящее время функция «dragStart» поддерживает только строковый тип данных (то есть только ТЕКСТ). В противном случае функция возвращает значение «-1» и выводится сообщение об ошибке.

  1. Для кнопки используйте следующий код, исполняемый при наступлении события «Clicked» (щелчок):
main(){  string color;  colorEditor(color);  RECTANGLE2.backCol=color;}

С помощью этого кода открывается панель выбора цвета «КАСКАД Цифра» и прямоугольнику «RECTANGLE2» назначается выбранный цвет.

  1. Для всех текстовых полей используйте следующий код, исполняемый при наступлении события «DragDrop»:
main(string information, int dragType){ this.text = information;}

C помощью данного сценария перетаскиваемая информация, например, имя точки данных, отображается в текстовом поле.

  1. Для события «DragStart» сектора используйте следующий код:
main(int keys){  string color = this.backCol;  dragStart(color,»arc.png»,DRAG_COPY);}

Сектор также должен предоставлять информацию о цвете операции перетаскивания. Во время перетаскивания возле курсора отображается изображение «arc.png». При передаче пустого строкового значения используется изображение по умолчанию. Имя файла может передаваться. Оно должно указываться относительно каталога изображений. DRAG_COPY указывает на то, что будет осуществляться операция копирования. Это означает, что перетаскиваемая информация сохраняется в источнике и копируется. При использовании DRAG_MOVE информация во время перетаскивания перемещается и не остается в исходном объекте.

Поскольку для сектора задано событие «DragEnter», необходимо вызвать функцию «dropAccept()»:

main(string information, int dragType){  dropAccept(1);}

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

main(string information, int dragType){  DebugN(information);  this.backCol = information;}
  1. Для события «Initialize» иерархического списка используйте следующий код:
main(){  this.addColumn(«TEST»);  this.addColumn(«SibKom»);    this.appendItem(«»,»1″,»red»);  this.appendItem(«1″,»2″,»green»);  this.appendItem(«»,»3″,»blue»);    this.setDragEnabled(«1»,TRUE);  this.setDragEnabled(«2»,TRUE);  this.setDragEnabled(«3»,TRUE);    TREE1.setDragEnabled(«3»,1);}

С помощью этого кода к иерархическому списку добавляются столбцы «TEST» и «SibKom» и элементы «red», «green » и «blue». С помощью метода «setDragEnabled» обеспечивается возможность перетаскивания элементов иерархического списка во время выполнения.

  1. Для присвоения полигону перетаскиваемого цвета используйте следующий код для события «DragDrop» полигона:
main(string information, int dragType){  DebugN(information);  this.backCol = information;}

Как обычно, чтобы обеспечить возможность перетаскивать цвет с полигона и присваивать его другим объектам, необходимо с помощью «dragStart(…)» указать данные, подлежащие перетаскиванию:

main(int keys){  string color = this.backCol;  dragStart(color,»arc.png»,DRAG_COPY);}

Поскольку задано событие «DragEnter», необходимо вызвать функцию «dropAccept()»:

main(string information, int dragType){  dropAccept(1);}
  1. Для эллипсов добавьте следующий код для события «DragDrop»:
main(string information, int dragType){  string color1 = this.backCol;  this.backCol = information;  ELLIPSE4.backCol = color1;}

С помощью данного кода эллипсу присваивается цвет. Код «ELLIPSE4.backCol = color1;» указывает на то, что устанавливается цвет эллипсу «ellipse3» либо «ellipse4».

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

main(int keys){  string color = this.backCol;    dragStart(color,»»,DRAG_LINK);}

Поскольку передается пустая строка, в качестве курсора будет использоваться изображение по умолчанию.

Теперь возможно:

  • Выбирать цвет с помощью панели выбора цвета «КАСКАД Цифра», а затем перетаскивать его на расположенный на панели объект (прямоугольник, сектор, полигон или эллипс).
  • Выбирать точку данных из дерева точек данных и перетаскивать ее на текстовое поле или на текстовый редактор.
  • Выбирать название цвета из иерархического списка и перетаскивать его на текстовое поле или на текстовый редактор.

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

Все простые графические объекты, а также некоторые комплексные графические объекты поддерживают перетаскивание (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 на текстовое поле или в текстовый редактор. После этого в текстовом поле выводится путь к файлу. Для обеспечения приема перетаскиваемых значений текстовое поле или текстовый редактор должны быть предварительно соответствующим образом настроены.

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