Simple-Scada forum

Simple-Scada 2 => Ваши вопросы => Тема начата: metamorphogenesis от 19 Февраля 2021, 13:44:45

Название: Не срабатывает StringReplace
Отправлено: metamorphogenesis от 19 Февраля 2021, 13:44:45
Доброго дня, господа. Возник вопрос касательно подмены подстроки с помощью StringReplace. Код скрипта и скрины прилагаю.

Код: (delphi)
{
У нас есть узел механизма, и две 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.

(https://i.ibb.co/z62xrpM/image.png)  (https://i.ibb.co/MhhdvPk/1.png)
Название: Re: Не срабатывает StringReplace
Отправлено: metamorphogenesis от 19 Февраля 2021, 14:24:54
Все, разобрался. Можете не углубляться в суть вопроса.

Вкратце, оказалось, что если в свойство Text объекта TM_Text записать строку с пробелами в конце, эти пробелы удаляются. В скрипте я ожидал их увидеть.

(https://i.ibb.co/nwvRQ6z/image.png)