Добрый день!
Можно-ли (и, если да, то как) заставить скрипт из примера работать не с целыми числами, а с дробями (?) :
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 переводит все в целые числа... :(
Спасибо.
Можно-ли (и, если да, то как) заставить скрипт из примера работать не с целыми числами, а с дробями (?) :
т.е. вместо 1..5 поставить 0..4,5
вместо 6,7 поставить 4,6..7,1
вместо 8 поставить 7,2..10
Оператор case работает только с целыми числами.
Можно привести вашу переменную к целому: умножить на 10 и отбросить дробную часть
вместо напишите
case Trunc(AsSingle * 10) of //для чисел с одним разрядом после запятой
тогда для ваших условий:
0..45 : Color := clRed;
46..71 : Color := clGreen;
72..100 : Color := clYellow;
end;
AsInt переводит все в целые числа... :(
В этом назначение свойства AsInt, т.е. взятие значения переменной как целого числа. Если нужно брать значение в виде вещественного числа, то используйте AsFloat (или AsSingle). Но в этом случае конструкцию case..of использовать не получится, т.к. она работает только с целыми числами, как верно отметил выше Миханик. Поэтому придется либо переводить числа в целые способом описанным Михаником, либо отказаться от case..of в пользу обычных сравнений, например:
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.