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

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

Автор Тема: Индикация в таблице шаблона  (Прочитано 411 раз)

ART63

  • Постоялец
  • ***
  • Сообщений: 160
    • Просмотр профиля
Индикация в таблице шаблона
« : 11 Сентября 2026, 16:15:38 »
Добрый день!

Есть шаблон (вид шаблона во вложении). Стоит задача:
1. Если фазное напряжение выходит за допустимые пределы Umin и Umax, то выделить текст красным цветом.
2. Если токи в фазах различаются на 20% и более, шрифт ячеек с током сделать желтым.

Код: (delphi)
begin
  with Sender as TM_TableCell do
    case Row of
      2: if AsInt > Umax or AsInt < Umin then FontColor := clRed;
      3: FontColor := clRed;
    end;
end.

Какие возникли проблемы:
1. Что является Sender в событии OnCellDatachange? Я полагал, что TM_TableCell, поскольку он фигурирует как аргумент события. Однако выдается ошибка про TM_Control
2. Не все ячейки должны реагировать на изменение цвета. Я анализирую свойство Row ячейки. Номер строки считается с учетом заголовка?
3. В коде не воспринимается AsInt. По "шифт+пробел" меняет его на PrevAsInt. Т.е. доступа к переменной ячейки у меня нет?
4. По току: как в событии ячейки обратиться к значению другой ячейки, чтобы рассчитать перекос фаз. И чтобы изменить цвет шрифта сразу у трех ячеек.
« Изменён: 12 Сентября 2026, 10:45:05 от Simple-Scada »

pan2000

  • Постоялец
  • ***
  • Сообщений: 239
    • Просмотр профиля
Re: Индикация в таблице шаблона
« Ответ #1 : 12 Сентября 2026, 09:57:41 »
Здравствуйте.

1. По-видимому ячейка TM_TableCell лишь частично обладает свойствми TM_Control и TM_Object
2. Столбцы и строки таблицы всегда нумеруются с нуля. Если под заголовком понимается "Фиксированная строка", то это только сервисная расскраска таблицы, равно как и "Фиксированный столбец" и "Чередование".
3. Ячейка имеет свойство Variable, доступ к значению переменной ячейки: Cell.Variable.<тип значения>.
4. Обратится к значению другой ячейки можно только на уровне таблицы: <имя таблицы>.GetCell(<номер столбца>,<номер строки>).Variable.<тип значения> или <имя таблицы>.Columns[<номер столбца>].Cells[<номер строки>]...
Пример во вложении. Значения величин записываются непосредственно в ячейку. Можно выбрать один из двух скриптов, изменяющий цвет при авариях тока: все или только аварийные.

P.S. Изменение цвета шрифта не лучшая идея, по моему мнению более заметно изменение фона ячейки (причем для границ - стандартными средствами, без скрипта).
« Изменён: 13 Сентября 2026, 12:44:38 от pan2000 »

ART63

  • Постоялец
  • ***
  • Сообщений: 160
    • Просмотр профиля
Re: Индикация в таблице шаблона
« Ответ #2 : 14 Сентября 2026, 08:37:23 »
Добрый день!

Большое спасибо за ответ. Принцип понятен.
Возник вопрос: А если обработку поставить на скрипт "Изменилась переменная" и сделать флаги bool, которые завести как доппеременную и по ней менять цвет. Обработка будет быстрее или без разницы?

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 3249
    • Просмотр профиля
    • Simple-Scada
Re: Индикация в таблице шаблона
« Ответ #3 : 14 Сентября 2026, 11:20:57 »
Здравствуйте.

Цитировать
Что является Sender в событии OnCellDatachange?
В событиях OnCellDatachange, OnCellDatachangeEx и OnCellClick нет параметра Sender (см. объявление процедуры в самой верхней строке скрипта). В них используется параметр Cell, который хранит прямую ссылку на ячейку таблицы типа TM_TableCell. Подробное описание события есть в руководстве по ссылке. Полный список всех свойств ячейки также есть в руководстве по этой ссылке.

В итоге:
1. Если Вам нужно получить номер строки, обращайтесь напрямую Cell.Row;
2. Если нужно получить значение основной переменной ячейки, то используйте Cell.Variable.AsInt. Для доп. переменной используйте Cell.VariableEx.AsInt;
3. Чтобы получить ссылку на саму таблицу, которой принадлежит ячейка используйте Cell.OwnerTable (это может пригодиться, если нужно сделать универсальный скрипт для множества таблиц);
4. Чтобы обратиться к какой либо ячейке таблицы используйте "Cell.OwnerTable.GetCell(col, row)", или напрямую "myTable.GetCell(col, row)", как выше описал pan2000.

Цитировать
Однако выдается ошибка про TM_Control
Верно, т.к. ячейка таблицы (TM_TableCell) никак не связана с TM_Control. TM_TableCell это отдельный класс со своим набором свойств.

Цитировать
А если обработку поставить на скрипт "Изменилась переменная" и сделать флаги bool, которые завести как доп.переменную и по ней менять цвет. Обработка будет быстрее или без разницы?
Нет, не будет быстрее. Если есть возможность обойтись без скриптов, например, настроив границы у переменных, то используйте её. Если нет, то используйте вариант со скриптами.

pan2000

  • Постоялец
  • ***
  • Сообщений: 239
    • Просмотр профиля
Re: Индикация в таблице шаблона
« Ответ #4 : 14 Сентября 2026, 21:59:17 »
  Здравствуйте.

Возник вопрос: А если обработку поставить на скрипт "Изменилась переменная" и сделать флаги bool, которые завести как доппеременную и по ней менять цвет. Обработка будет быстрее или без разницы?
В данном случае это вопрос из серии "кто кого поборет: слон или кит?".
В первом приближении сравнивать времена обработки можно по количеству отдельных временных интервалов выполнения действия: как то вызов события, доступ к переменной (прямо, функция, метод), вычисления.
Скрипт "Изменилась переменная" (далее Скрипт, а вариант с событиями ячеек таблицы - Таблица):
- дополнительный вызов события при изменении флага (хотя ожидается, что это событие достаточно редкое), дополнительные переменные-паразиты под флаги, зависимость объема Скрипта/Скриптов от количества переменных;
- потенциальная возможность ошибок из-за необходимости явного перечисления имён в Скрипте. При соответствующим выборе имен переменных для Таблицы-шаблона достаточно только номера набора;
- выбор буриданова осла: один Скрипт со всем "легионом" входных переменных (а при большом количестве "массовки" незаметно подкрадётся ... ошибка) или множество индивидуальных Скриптов только со своими переменными. В первом случае, переменные по очереди пролазят через "бутылочное горлышко" параметра Скрипта и его выполнение начнется с селекции переменной (либо пачка операторов IF, либо CASE, причем следует ожидать, что с увеличением числа переменных пропорционально увеличится и среднее время выполнения Скрипта. Во втором - копирование и нудная правка скриптов. Вторая неприятность заключается в выборе всех необходимых для вычисления переменных (три тока), и тут начнётся шаманство с формированием имён для GetVariableByName(). В Таблице переменная скрыта за номером столбца и строки (своеобразный массив), в имени переменной нет необходимости, доступ к ней посредством метода GetCell(,).

ИТОГ: Таблица и Скрипт по количеству соизмеримых временных интервалов практически идут "ноздря в ноздрю", но ресурсов Скрипту/Скриптам потребуется больше: флаг-переменные и объём скрипта пропорциональный количеству переменных. И вишенка на торте - сравнение затрат и простоты при увеличении количества переменных.