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

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

Автор Тема: TM_CheckBox и его свойства  (Прочитано 1930 раз)

Серега

  • Старожил
  • ****
  • Сообщений: 285
    • Просмотр профиля
TM_CheckBox и его свойства
« : 29 Сентября 2020, 17:31:21 »
Добрый день!
Есть ряд вопросов.
Когда проект загрузился полностью инициализируем CheckBox согласно значениям основной и дополнительной переменных.
Основная отвечает за цвет самой галки
Код
if CheckBox29.Variable.Value then
  CheckBox29.Color := clLime
else
  CheckBox29.Color := clAqua;
Вспомогательная за фон галки
Код
if CheckBox29.VariableEx.Value then
  CheckBox29.BackgroundColor := $008040
else
  CheckBox29.BackgroundColor := $003030;

Далее то же самое в скрипты на изменение основной и вспомогательной переменных.
Захотел сделать в глобальном модуле обработку свойств CheckBox. И в одно секундном скрипте вызывать процедуру. Не надо плодить кучу
скриптов по изменению ну и т.д.
Но вот до реализации далеко.
1. Подскажите как в глобальном модуле в параметры процедуры указать константу цвета. На примере станет наверное понятнее
Код
procedure CheckBoxColoration(NeededCB:TM_CheckBox; Color1:?????; Color2:?????);
begin
if NeededCB.VariableEx.Value then
  NeededCB.BackgroundColor := Color1
else
  NeededCB.BackgroundColor := Color2;
end
2. Касаемо Sender. Из справки
Цитировать
... Поэтому Sender имеет общий тип данных "TM_Control". ... Sender необходимо явно привести к нужному типу....
То есть 
Код
with Sender as TM_CheckBox do
по идее дает возможность обратиться непосредственно к свойствам экземпляра TM_CheckBox
Но вот далее свойство
Код
Sender.BackgroundColor := $008040;
вызывает ошибку "... Undeclared identifier "BackgroundColor"...".
3. Можно ли вообще делать так:
Код
if Sender is TM_CheckBox then
  with Sender as TM_CheckBox do
    if VariableEx.AsBool = True then
      begin
        Sender.BackgroundColor := $008040;
      end
    else
      begin
        Sender.BackgroundColor := $003030;
      end; 
 
Можете пояснить?
Жду ответов и вопросов

Simple_Scada

  • Администратор
  • *****
  • Сообщений: 1400
    • Просмотр профиля
Re: TM_CheckBox и его свойства
« Ответ #1 : 29 Сентября 2020, 19:05:44 »
Здравствуйте.

Цитировать
Когда проект загрузился полностью инициализируем CheckBox согласно значениям основной и дополнительной переменных.
Далее то же самое в скрипты на изменение основной и вспомогательной переменных.
Если данные скрипты написаны по изменению переменной, то не нужно их дополнительно писать на событие "Запуск проекта". После запуска проекта в любом случае выполнятся скрипты по изменению переменных и цвета CheckBox изменятся в соответствии с условиями скрипта.

Цитировать
Захотел сделать в глобальном модуле обработку свойств CheckBox. И в одно секундном скрипте вызывать процедуру. Не надо плодить кучу
скриптов по изменению
Это плохая идея, следует избегать использования секундных скриптов, когда задачу можно решить без них. Если требуется изменять свойства CheckBox в зависимости от значений основной и доп. переменной, то для этого достаточно написать один универсальный скрипт, например:
Код: (delphi)
begin
  if Sender is TM_CheckBox then
    with Sender as TM_CheckBox do
      begin
        { изменение цвета по основной переменной }
        if AsBool = True then
          Color := clLime
        else
          Color := clAqua;

        { изменение цвета фона по доп. переменной }
        if VariableEx.AsBool = True then
          BackgroundColor := $008040
        else
          BackgroundColor := $003030;
      end;
end.
, данный скрипт нужно назначить на события OnDataChange и OnDataChangeEx нужных объектов CheckBox. Теперь все объекты, у которых назначен данный скрипт будут изменять цвет по основной переменной, а цвет фона по доп. переменной.

Цитировать
Подскажите как в глобальном модуле в параметры процедуры указать константу цвета
Для этого нужно объявить переменную с типом LongWord:
Код: (delphi)
procedure CheckBoxColoration(NeededCB:TM_CheckBox; Color1, Color2:LongWord);
, а при вызове передавать в переменные цветов нужный цвет, например:
Код: (delphi)
CheckBoxColoration(CheckBox1, $008040, $003030);

Цитировать
вызывает ошибку "... Undeclared identifier "BackgroundColor"...".
Если Sender уже приведен к нужному типу строчкой "with Sender as TM_CheckBox do", то далее можно сразу обращаться к нужным свойствам объекта(см. пример скрипта выше). Если написать "Sender.BackgroundColor", то будет производиться работа с общим типом данных "TM_Control", в котором нет свойства BackgroundColor, поэтому и возникает ошибка. Чтобы скрипт скомпилировался корректно, нужно явно привести Sender к нужному типу "(Sender as TM_CheckBox).BackgroundColor := $003030;", но так как у Вас в скрипте Sender уже приведен к нужному типу, то можно сразу обращаться к нужным свойствам(см. пример скрипта выше).

Серега

  • Старожил
  • ****
  • Сообщений: 285
    • Просмотр профиля
Re: TM_CheckBox и его свойства
« Ответ #2 : 30 Сентября 2020, 09:25:10 »
Добрый день!
Спасибо за разъяснения.