Вопросы по скриптам в Simple-Scada 2

Автор Simple-Scada, 29 января 2016, 15:19:20

azrael454

Добрый день.

Имеется ли возможность отслеживать состояние окна? Если оно открыто, то делать те действия, а если закрыто, то другие.

Simple-Scada

Здравствуйте.

Проект и его скрипты исполняются сервером скады на серверном ПК. Окна открывают клиенты, поэтому возможна ситуация. когда на одном клиенте окно открыто, а на другом оно же закрыто. У каждого окна есть два события OnShow (выполняется когда любой клиент отрыл окно) и OnClose (когда любой клиент закрыл окно). Если Вам эти события подходят, то можете решить задачу с их помощью.

azrael454

#1097
Спасибо, не совсем подходит.

Задача у меня стоит такая, что я спроектировал маленькое меню, кнопками которых я вызываю отдельные окна. Соответственно, чтобы понимать какое окно открыто / закрыто, я меняю цвет у кнопки, привязанной к окну. На нее же я могу закрыть окно, но при этом я могу закрыть окно "крестиком", который не скроешь никак и отслеживать его нажатие или отжатие тоже нельзя.

То есть баг вот в чем. Есть две цепочки:
  • Нажал на кнопку - открыл окно - кнопка поменяла цвет 1 - нажал на ту же кнопку - окно закрылось - кнопка поменяла на цвет 0.
  • Нажал на кнопку - открыл окно - кнопка поменяла цвет 1 - закрыл окно крестиком - кнопка не сбросила своего состояния и не поменяла цвет
Чтобы мне еще раз окно вызвать, мне нужно нажать на кнопку, чтобы скинуть ей состояние и она поменяет цвет, и только потом я снова могу открыть окно. Решений этой задачки я вижу два:
  • Если есть параметр у окна, который завязан на "крестик", то надо отслеживать этот параметр
  • Если появится возможность скрывать "крестик" и заменять его своей кнопкой, то все становится сводится к событию OnCLick

Simple-Scada

Цитироватьзакрыть окно "крестиком"... и отслеживать его нажатие или отжатие тоже нельзя.
Отслеживать можно. Крестик закрывает окно, соответственно в окне вызывается событие OnClose. В нём можно сбрасывать цвет кнопки.

То, что Вы описали подходит только для проекта с одним клиентом. Если клиентов несколько, то это будет выглядеть как беспорядочное мигание кнопки. Допустим к проекту подключился клиент и нажимает на кнопку открывая и закрывая окно, и кнопка меняет цвет. Все остальные клиенты будут видеть мигание кнопки (хотя сами не открывали и не закрывали окна и не нажимали на кнопку).
Исходя из вышеописанного, реализация выделения объекта по нажатию (или по наведению мыши) подходит только для проектов с одним клиентом и нужно этого избегать.

azrael454

#1099
Я поэтому и пишу, что не совсем подходит.

Я правильно понял, что при проекте на несколько клиентов, если нажимается на одном клиенте одна кнопка и выделяется цветом, то это увидят все, не смотря на права доступа и прочее?

Simple_Scada

Да, Вы правильно поняли. Все объекты проекта существуют в единственном экземпляре. Если создать в проекте кнопку Button1 и подключиться к нему с нескольких клиентов, то на всех клиентах Вы увидите одну и ту же кнопку Button1. Если, к примеру через скрипт происходит смена цвета кнопки Button1, то соответственно данное изменение отобразится на всех клиентах. Права доступа пользователей не имеют никакого отношения к изменению свойств объектов через скрипты, они используются для ограничения доступа пользователя к объектам(например, если доступ пользователя ограничен, то он не сможет нажать на кнопку, ввести значение в поле и т.д.).

Елена

#1101
Добрый день!
Задача по значению тэга менять пользовательское изображение. Сделала анимацию из отдельных изображений. Написала скрипт на OnDataChange:
Код: pascal
begin
  if Sender is TM_Image then   // проверяем, что Sender это объект
    with Sender as TM_Image do // приводим Sender к типу "TM_Image"
      case AsInt of
      0:  Frame := 1;        // изменить кадр на стоп
      1:  Frame := 2;        // изменить кадр на работа
      2:  Frame := 3;        // изменить кадр на ОП
      3:  Frame := 4;        // изменить кадр на ОП
      4:  Frame := 5;        // изменить кадр на ПП
      end;
end.
Но изображение не меняется. Может, что-то не учла в других свойствах изображения?

Simple-Scada

Здравствуйте.

Перепроверьте следующие пункты:
  • компонент "Изображение" действительно привязан к переменной (см. свойство "Переменная" компонента "Изображение");
  • у компонента "Изображение" на событие OnDataChange назначен скрипт, который Вы описали;
  • переменная с которой связано изображение меняет своё значение. Если же она статична и равна нулю во время работы проекта, то кадр изображения всегда будет равен 1;
  • изображение было разделено на кадры через утилиту "Pictures.exe";
Если после этого выявить проблему всё равно не получается, то вышлите проект на support@simple-scada.com, мы укажем точную причину.

Елена

#1103
Добрый день!
Можно ли в скриптах работать и с основной переменной и с дополнительной. Например, есть поле Field, в нём отображается основная переменная, а фон поля изменяется по доп. переменной. Мой скрипт по изменению доп. переменной почему то не работает.
Код: pascal
begin
if Sender is TM_Shape then
with Sender as TM_Shape do
  case VariableEx.AsInt of
    0: Color := clGray;
    1: Color := clRed;
   end;
end.
Какую я сделала ошибку?

Simple_Scada

Здравствуйте.

ЦитироватьНапример, есть поле Field
В скрипте происходит работа с объектом как с "Фигурой"(TM_Shape) и если данный скрипт назначен на событие Поля, то он не будет выполняться. Если указанный скрипт нужно применить к объекту Поле, то нужно изменить его так:
Код: pascal
begin
  if Sender is TM_Field then
    with Sender as TM_Field do
      case VariableEx.AsInt of
        0: Color := clGray;
        1: Color := clRed;
       end;
end.

Елена

Можно ли в TM_Text. text вводить 2 строки? Т.е. фразу со знаком переноса строки.

Simple_Scada

Да, это возможно. Пример:
Код: pascal
begin
  Text1.Text := 'Строка 1' + CharToStr(#10) + 'Строка 2';
end.

Елена

#1107
Добрый день!
У TM_Text нужно менять сам текст и цвет.
Вот мой скрипт:
Код: pascal
begin
if Sender is TM_Text then   // проверяем, что Sender это текст
    with Sender as TM_Text do // приводим Sender к типу "TM_Text"
    if Mode.VALUE=TRUE then
    begin
      case AsInt of
        0: begin Text := 'РАБОТА В АВТОМАТИЧЕСКОМ РЕЖИМЕ ОСТАНОВЛЕНА'; Color := clWhite; end;
        1: begin Text := 'РАБОТА В АВТОМАТИЧЕСКОМ РЕЖИМЕ';  Color := clBlue; end;
        2: begin Text := 'АВТОМАТИЧЕСКИЙ РЕЖИМ. АВАРИЯ!';  Color := clRed; end;
       end;
    end else
    begin
      Text := 'РЕЖИМ НАЛАДКИ'; Color := clWhite;
    end;
end.
Текст меняется, а его цвет нет. Пробовала менять цвет рамки текста - не меняется. Что я делаю не так?

Simple-Scada

Здравствуйте.

Цвету шрифта соответствует свойство FontColor, не Color. Все базовые свойства описаны здесь.

Миханик

Цитата: Simple-Scada от 31 августа 2020, 09:56:42
Цитата: Миханик от 28 августа 2020, 12:08:35Подскажите, формирую таблицу вот таким скриптом Table1.RunSQL(aQuery, tsAll); А как узнать, что таблица сформирована и с ней можно работать?
К сожалению узнать о выполнении SQL-запроса отправленного от таблицы - нельзя. Постараемся добавить таблице отдельное событие на этот случай.
UPD: в версиях 2.4.0.3 и выше у таблицы есть событие OnDoneSQL для отслеживания выполнения SQL-запросов
Большое спасибо за оперативность. Теперь всё работает как надо!