Здравствуйте.
Создал переменные, скрипты, мнемосхему. И при вводе в поле например значения 100.1 должен сработать скрипт. Но не срабатывает.
О вещественных типах можно прочесть по ссылке (http://www.delphikingdom.com/asp/viewitem.asp?catalogid=374). Там же рассмотрены примеры формирования вещественного значения и сравнения вещественных типов (http://www.delphikingdom.com/asp/viewitem.asp?catalogid=374#:~:text=%D0%9F%D1%80%D0%B8%D0%BC%D0%B5%D1%80%D1%8B%20%C2%AB%D0%BD%D0%B5%D0%BF%D1%80%D0%B0%D0%B2%D0%B8%D0%BB%D1%8C%D0%BD%D0%BE%D0%B3%D0%BE%C2%BB%20%D0%BF%D0%BE%D0%B2%D0%B5%D0%B4%D0%B5%D0%BD%D0%B8%D1%8F%20%D0%B2%D0%B5%D1%89%D0%B5%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85%20%D1%82%D0%B8%D0%BF%D0%BE%D0%B2). Для корректного сравнения можно перевести значение переменной в целое число (если это допустимо), затем можно производить необходимые сравнения. Пример скрипта для работы с вещественной переменной можно найти по ссылке (https://simple-scada.com/help/script/colorchange.html?anchor=realvar).
Второй вариант, если нужно сравнивать именно вещественные значения, то нужно допускать погрешность, например:
var
A, B: Single;
begin
A := 1.0 / 3.0;
B := 0.33333333;
// считаем значения одинаковыми, если разница между ними меньше 0.00000001
if Abs(A - B) < 0.00000001 then
AddMessage(Now, mkMessage, 'Значения равны', True, False)
else
AddMessage(Now, mkMessage, 'Значения не равны', True, False);
end.
В проекте я использовал вот такую конструкцию:
case Trunc(PositionTC.Value * 10) of
0..160 : wNumberPlace.Value := 1;
161..1000 : wNumberPlace.Value := 2;
1001..5000 : wNumberPlace.Value := 3;
5001..7000 : wNumberPlace.Value := 4;
7001..10000 : wNumberPlace.Value := 5;
end;
и получается как бы физически объект находиться на позиции 100.1 это уже 3 участок, оператор вводит 100.1, но у нас получается 100.099998 и нарушается логическая цепочка.
Я так понимаю в моем случае надо все делать через if.
Здравствуйте.
Для ограниченного набора возможных значений переменной ввода (в Вашем случае 10001 значение) можно использовать целочисленную переменную PositionTC со сдвигом запятой -1.
begin
case PositionTC.AsVariant of
0..160 : wNumberPlace.Value := 1;
161..1000 : wNumberPlace.Value := 2;
1001..5000 : wNumberPlace.Value := 3;
5001..7000 : wNumberPlace.Value := 4;
7001..10000 : wNumberPlace.Value := 5;
end;
end.
Для вещественной переменной можно использовать округление до ближайшего целого:
...
case Round(PositionTC_1.AsSingle * 10) of
...