Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Не получили письмо с кодом активации?

Официальный форум Simple-Scada.

Автор Тема: Подстановка в шаблонных окнах в имя объекта  (Прочитано 243 раз)

f1resong

  • Новичок
  • *
  • Сообщений: 1
    • Просмотр профиля
День добрый! Т.к. в имени объектов нельзя ставить "%" не знаю, есть ли возможность использовать подстановки в имени.

Конкретнее по задаче, в случае если это невозможно, но есть другие варианты решить мою боль:
У меня есть PLC с несколькими режимами работы (вкл, выкл, комфорт, расписание и т.д.) - их всего 5. Т.е. это 1 переменная и 5 значений возможных. Соот-но заказчик хочет иметь отдельную кнопку на каждый режим с цветовой индикацией - т.е. что-то такое https://s01.pic4net.com/di-EBJ0KS.png
Без шаблонов я могу сделать имя вроде %object%_mode_1 %object%_mode_2 и т.д. и при изменении переменной я могу сделать универсальный скрипт, который может найти по имени кнопку через GetButtonByName и aVar.Name + "_" + IntToStr(aVar.Value) - но как сделать что-то аналогичное с шаблоном не представляю

Simple Scada

  • Глобальный модератор
  • *****
  • Сообщений: 273
    • Просмотр профиля
    • Simple-Scada
Здравствуйте.

1. В именах объектов нельзя использовать подстановки.
2. Работа с шаблонами в скриптах рассмотрена по ссылке.
3. Рекомендуем всегда стараться использовать универсальные скрипты.
4. Ознакомьтесь с примерами использования кнопок по ссылке.

Для описанной Вами задачи можно использовать следующий способ:
1. В шаблоне создать необходимые кнопки с одним состоянием и задать нужное значение в состоянии для каждой кнопки.
2. В свойство "Тег" кнопок указать значения, соответствующие значениям, которые должны принимать кнопки при их нажатии.
3. Создать универсальный скрипт со следующим кодом:
Код: (delphi)
begin
  if Sender is TM_Button then      // проверяем, что Sender это кнопка
    with Sender as TM_Button do    // приводим Sender к типу "TM_Button"
      if AsInt = Tag then          // если значение переменной кнопки равно значению, указанному в свойстве "Тег", то
        Color := clGreen           // изменить цвет кнопки на зеленый
      else                         // иначе
        Color := RGB(109,109,109)  // изменить цвет кнопки на серый
end.
4. Назначить скрипт на событие "OnDataChange" всех кнопок.
5. Готово. Пример проекта во вложении.
« Изменён: 11 Января 2026, 17:39:43 от Simple Scada »

pan2000

  • Постоялец
  • ***
  • Сообщений: 217
    • Просмотр профиля
  Здравствуйте.

Нет необходимости в дублировании значения кнопки в свойство "Тег":
Код: (delphi)
    if AsInt = States[0].Value then  // если значение переменной кнопки равно значению,
      Color := {Tag //} clGreen      //   указанному в свойстве "Значение"(т.е именно она и нажата последней), то изменить цвет кнопки на зеленый
    else                             //   иначе
      Color := $6D6D6D;     //  не совсем понятно что делает SetInitialColor с кнопкой;               //   восстановить исходный цвет кнопки
Что касается исходного цвета кнопки, то оператор SetInitialColor более универсален, чем явное присвоение цвета (но не для кнопки).
Если есть необходимость в различном цвете нажатой кнопки, то для задания цвета можно использовать свойство "Тег".
« Изменён: 28 Января 2026, 13:33:23 от pan2000 »