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

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

Автор Тема: Изменение цвета по скрипту с дробными значениями..  (Прочитано 2103 раз)

George

  • Новичок
  • *
  • Сообщений: 28
    • Просмотр профиля
Добрый день!
Можно-ли (и, если да, то как) заставить скрипт из примера работать не с целыми числами, а с дробями (?) :
Код: (delphi)
begin
   if Sender is TM_Object then     // проверяем, что Sender это объект
     with Sender as TM_Object do   // приводим Sender к типу "TM_Object"           
       case AsInt of               // если значение переменной связанной с объектом равно:
         1..5: Color := clRed;     // от 1 до 5 - изменить цвет на красный
         6, 7: Color := clGreen;   // 6 или 7 - изменить цвет на зеленый
         8   : Color := clYellow;  // 8 - изменить цвет на желтый
       end;
end.
т.е. вместо 1..5   поставить 0..4,5
       вместо 6,7    поставить 4,6..7,1
       вместо 8       поставить 7,2..10

AsInt переводит все в целые числа... :(
Спасибо.
« Изменён: 26 Мая 2018, 10:51:16 от Simple-Scada »

Миханик

  • Постоялец
  • ***
  • Сообщений: 198
    • Просмотр профиля
    • www.vpa-dv.ru
Можно-ли (и, если да, то как) заставить скрипт из примера работать не с целыми числами, а с дробями (?) :

т.е. вместо 1..5   поставить 0..4,5
       вместо 6,7    поставить 4,6..7,1
       вместо 8       поставить 7,2..10

Оператор case работает только с целыми числами.
Можно привести вашу переменную к целому: умножить на 10 и отбросить дробную часть
вместо
Код
case AsInt of
напишите
Код
case Trunc(AsSingle * 10) of  //для чисел с одним разрядом после запятой 

тогда для ваших условий:
Код
   0..45    : Color := clRed;     
   46..71   : Color := clGreen; 
   72..100  : Color := clYellow;
end;

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 3214
    • Просмотр профиля
    • Simple-Scada
AsInt переводит все в целые числа... :(
В этом назначение свойства AsInt, т.е. взятие значения переменной как целого числа. Если нужно брать значение в виде вещественного числа, то используйте AsFloat (или AsSingle). Но в этом случае конструкцию case..of использовать не получится, т.к. она работает только с целыми числами, как верно отметил выше Миханик. Поэтому придется либо переводить числа в целые способом описанным Михаником, либо отказаться от case..of в пользу обычных сравнений, например:
Код: (delphi)
begin
  if Sender is TM_Object then
    with Sender as TM_Object do   
      if (AsFloat >= 0)   and (AsFloat <= 4.5) then Color := clRed else
      if (AsFloat >= 4.6) and (AsFloat <= 7.1) then Color := clGreen else
      if (AsFloat >= 7.2) and (AsFloat <= 10)  then Color := clYellow;
end.
« Изменён: 26 Мая 2018, 10:51:27 от Simple-Scada »