Simple-Scada forum

Simple-Scada 2 => Ваши вопросы => Тема начата: George от 03 Мая 2018, 18:46:43

Название: Изменение цвета по скрипту с дробными значениями..
Отправлено: George от 03 Мая 2018, 18:46:43
Добрый день!
Можно-ли (и, если да, то как) заставить скрипт из примера работать не с целыми числами, а с дробями (?) :
Код: (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 переводит все в целые числа... :(
Спасибо.
Название: Re: Изменение цвета по скрипту с дробными значениями..
Отправлено: Миханик от 04 Мая 2018, 03:04:34
Можно-ли (и, если да, то как) заставить скрипт из примера работать не с целыми числами, а с дробями (?) :

т.е. вместо 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;
Название: Re: Изменение цвета по скрипту с дробными значениями..
Отправлено: Simple-Scada от 04 Мая 2018, 11:03:57
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.