В скриптах с типом "Изменились переменные" можно использовать функции IsFirstChange, PrevAsBool, PrevAsInt, PrevAsFloat, PrevAsStr.
Пример 1:
Допустим, в проекте имеются переменные aVar1, aVar2, aVar3 и необходимо при изменении значения любой из переменных записывать результат их сложения в переменную aResult. Для этого перейдем в редактор скриптов и создадим скрипт с типом события "Изменились переменные".
В левой части параметров скрипта отображается список переменных проекта, в правой части отображается список выбранных переменных, по изменению которых будет выполняться скрипт. Для добавления переменных в список скрипта, необходимо выбрать требуемые переменные кликая по флажкам рядом с именами переменных. Для добавления всех переменных группы, необходимо кликнуть по флажку рядом с именем группы. Для удаления переменной из списка скрипта, необходимо снять флажок рядом с именем переменной. Для редактирования списка переменных в уже созданном скрипте, необходимо выбрать нужный скрипт на панели скриптов и нажать кнопку редактирования(с иконкой карандаша).
Добавим в список скрипта наши переменные и нажмем кнопку "Создать":
Далее можно написать код скрипта:
begin
aResult.Value := aVar1.Value + aVar2.Value + aVar3.Value;
end.
Теперь в переменную aResult будет записываться результат сложения наших переменных, причем скрипт будет выполняться не постоянно, а только при изменении переменных. Для получения доступа к переменной, изменение которой привело к выполнению скрипта можно использовать параметр "Variable". К примеру, добавим в скрипт выдачу сообщения с именем и значением переменной, которая изменилась:
begin
aResult.Value := aVar1.Value + aVar2.Value + aVar3.Value;
AddMessage(Now, mkWarning, 'Изменилась переменная: ' + Variable.Name + ' Значение = ' + Variable.AsStr, True, True);
end.
Пусть имеются переменные с типом данных Boolean. Необходимо создать общую аварию - если любая из переменных принимает значение True, то изображение мигает красным цветом, иначе цвет изображения должен быть зеленым. Для этого, создадим новую внутреннюю переменную с типом данных Integer и именем "vrCounter", которая будет служить счетчиком аварий. Далее, аналогично первому примеру, создадим скрипт с типом события "Изменились переменные" и добавим в список скрипта требуемые переменные. После этого можно написать код скрипта:
begin
if Variable.AsBool then // если переменная, которая изменилась = True
vrCounter.Value := vrCounter.Value + 1 // увеличиваем счетчик аварий на 1
else // иначе...
if vrCounter.Value > 0 then // условие для пропуска изменений при старте проекта
vrCounter.Value := vrCounter.Value - 1; // уменьшаем счетчик аварий на 1
if vrCounter.Value > 0 then // если счетчик аварий > 0
begin
Image1.Color := clNone; // изменяем цвет на "без цвета"
Image1.FlashColor := clRed; // включаем мигание красным цветом
end else // иначе...
begin
Image1.Color := clGreen; // изменяем цвет на зеленый
Image1.FlashColor := clNone; // отключаем мигание
end;
end.
Изменим условия второго примера. Допустим имеются три переменные: vrA, vrB, vrC с типом данных Integer. Необходимо сделать общую аварию - если vrA = 10 или vrB > 5 или vrC < 2, то цвет изображения красный , иначе цвет изображения должен быть зеленым. Для этого создадим новую внутреннюю переменную с типом данных Boolean, например с именем vrAlarm, в которую будем записывать True, когда любое из условий выполнится. Затем создадим скрипт с типом события "Изменились переменные" и добавим в список скрипта наши переменные. Напишем скрипт:
begin
if (vrA.AsInt = 10) or (vrB.AsInt > 5) or (vrC.AsInt < 2) then
vrAlarm.Value := True
else
vrAlarm.Value := False;
end.
В данном примере проверяются условия для трех переменных. При необходимости, в скрипт можно добавить любое количество переменных. Далее, остается только связать изображение с переменной vrAlarm и на событие OnDataChange написать следующий код:
begin
if vrAlarm.AsBool = True then
Image1.Color := clRed
else
Image1.Color := clGreen;
end.
В скриптах с типом "Изменились переменные" можно использовать функции IsFirstChange, PrevAsBool, PrevAsInt, PrevAsFloat, PrevAsStr. Допустим, в списке скрипта имеется три переменных: vrA, vrB, vrC. Требуется в зависимости от предыдущего значения переменной vrA полученного через функцию PrevAsInt выполнить какие-либо действия. Но как определить, по изменению какой именно переменной выполнился скрипт и для какой переменной вернет значение функция PrevAsInt? Для этого можно использовать параметр Variable - в него помещается та переменная, которая вызвала выполнение скрипта. Именно ее предыдущее значение вернет функция PrevAsInt. Пример:
begin
if Variable = vrA then // если изменилась переменная vrA (а не какая-то другая переменная из списка!)
if PrevAsInt = 1 then // и ее предыдущее значение равно 1, то
begin
// выполняем требуемые действия
end;
end.