{
У нас есть узел механизма, и две bool-переменные, описывающие его состояние:
%name%_working - основная переменная
и
%name%_fault - дополнительная переменная.
Узел может находиться в трёх состояниях:
Остановлено - fault = 0, working = 0
В работе - fault = 0, working = 1
Авария - fault = 1, working - не важно
У нас есть текстовый объект TM_Text, который содержит текст формата
"%имя узла%: + [состояние]" (например, "Туннель: остановлено", "Упаковка: АВАРИЯ")
По умолчанию, текстовый объект не содержит состояния и имеет вид "Туннель: "
Задача - дописать в текстовый объект после двоеточия через пробел его состояние
в зависимости от значений переменных, которые к объекту привязаны. Для этого во временную строку
вычитываем содержимое текстового объекта и подменяем текущее состояние на нужное.
Если после подмены мы сравним длину строки до и после подмены и они окажутся одинаковыми,
значит подмены не произошло и объект содержит строку по умолчанию. Только в этом случае
состояние дописывается к строке.
все подмены формируют временную результирующую строку, которую после выполнения всех условий
мы возвращаем обратно текстовому объекту.
данный скрипт вызывается событиями по изменению значения обеих переменных.
В результате текстовый объект не меняет содержимого.
Что я упустил?
}
procedure show_current_action_string(Sender: TM_Control);
var
line: TM_Text; // локальный экземпляр объекта
working, fault: boolean; // состояние переменных объекта
startLength, finalLength: Integer; // длина строки объекта до и после замены
startString, finalString: String; // строка объекта до и после замены
begin
line := TM_Text(Sender); // забрали объект в переменную
working := line.Variable.Value; // первая привязанная к объекту переменная - Работа узла (1 - в работе, 0 - остановлено)
fault := line.VariableEx.Value; // дополнительная привязання к объекту переменная - авария узла (1 - авария, 0 - смотрим на работу узла)
startString := line.Text; // читаем исходную строку из объекта
startLength := startString.Length; // фиксируем ее длину
if fault then begin // если fault = true
// подменяем текущее состояние на АВАРИЮ
finalString := StringReplace(startString, 'в работе', 'АВАРИЯ', [rfReplaceAll, rfIgnoreCase]);
finalString := StringReplace(finalString, 'остановлено', 'АВАРИЯ', [rfReplaceAll, rfIgnoreCase]);
finalLength := finalString.Length; // посмотрим на длину строки после замены
// если длина не изменилась, то строка была пуста, и просто допишем АВАРИЯ
if finalLength = startLength then finalString := StringReplace(startString, ': ', ': АВАРИЯ', [rfReplaceAll, rfIgnoreCase]);
end
else begin // если fault = false
if working then begin // то смотрим, или working = true и делаем то же самое для состояния "в работе"
finalString := StringReplace(startString, 'АВАРИЯ', 'в работе', [rfReplaceAll, rfIgnoreCase]);
finalString := StringReplace(finalString, 'остановлено', 'в работе', [rfReplaceAll, rfIgnoreCase]);
finalLength := finalString.Length;
if finalLength = startLength then finalString := StringReplace(startString, ': ', ': в работе', [rfReplaceAll, rfIgnoreCase]);
end
else begin // если working = false, то делаем то же самое для состояния "остановлено"
finalString := StringReplace(startString, 'в работе', 'остановлено', [rfReplaceAll, rfIgnoreCase]);
finalString := StringReplace(finalString, 'АВАРИЯ', 'остановлено', [rfReplaceAll, rfIgnoreCase]);
finalLength := finalString.Length;
if finalLength = startLength then finalString := StringReplace(startString, ': ', ': остановлено', [rfReplaceAll, rfIgnoreCase]);
end;
end;
line.Text := finalString;
end.