Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Не получили письмо с кодом активации?

Официальный форум Simple-Scada.

Просмотр сообщений

В этом разделе можно просмотреть все сообщения, сделанные этим пользователем.


Сообщения - Pavel

Страницы: [1]
1
Вы используете последнюю версию 2.7.5.1, или одну из старых версий?

Да, используется именно последняя версия 2.7.5.1.
Проблема воспроизводится при следующем сочетании настроек:

  • Переменная имеет тип Single;
  • В настройках переменной задан формат 0.#;
  • В переменную записывается значение 9.9823.

В результате на десктопном клиенте под трендом корректно отображается 10, а на веб-клиенте подпись округляется до 1 (при этом сама линия графика отрисовывается на уровне 10).

2
Цитировать
А какой "Формат" задан в настройках этих архивируемых переменных? Стандартный "0.##"?
Задан формат "0.#"

3
Здравствуйте!

Делаю проект с активным использованием шаблонных окон и наткнулся на пару странностей и расхождений с документацией. Хочу поделиться наблюдениями.

1. Мерцание элементов в OnShow и ограничение OnInit
Хотел настроить динамическое скрытие полей в шаблонном окне (в зависимости от заголовка Title). Изначально пошел в OnInit, но выяснил, что для этой задачи он не подходит: в момент OnInit проверка (Sender is TM_Window) не проходит, да и свойства самого экземпляра еще толком не подтянулись. Пришлось перенести логику в OnShow. Всё заработало, но вылезла эстетическая проблема: окно сначала появляется на клиенте в обычном виде из редактора, и только потом срабатывает скрипт. Из-за этого скрываемые элементы успевают «мигнуть» на 1-2 кадра при открытии. Вот к какому коду в OnShow в итоге пришлось прийти:
Код: (delphi)
var
  idx : Integer;
  SaveButton : TM_Button;
begin
  if (Sender is TM_Window) then
  begin
  with (Sender as TM_Window) do
    begin
      if (Title <> 'Настройки ВКТ')then
        for idx := 0 to 2 do
          (GetTemplateObject('Flow' + IntToStr(idx)) as TM_Control).Visible := True
    end;
  end;
end.

Было бы здорово иметь какое-то событие перед самой отрисовкой экземпляра на клиенте (что-то вроде OnBeforeShow или OnTemplateInit), либо дать возможность полноценно работать с контекстом конкретного клиента еще на этапе OnInit, чтобы избежать мерцания UI.

2. Небольшой пропуск в справке по TM_TemplateWindow
Искал в документации класс для работы с шаблонными окнами, но в разделе Свойства объектов про TM_TemplateWindow ничего нет. Через (Sender is TM_Window) подсмотрел, что во время исполнения просто создаётся обычный TM_Window. Если добавить эту мелкую деталь в справку (что шаблоны приводятся к TM_Window), это сэкономит кучу времени тем, кто пытается приводить типы через as TM_TemplateWindow.

3. Опечатка в документации: TM_ComboBox.ItemIndex
На странице справки по TM_ComboBox.ItemIndex написано, что свойство работает только на чтение. Решил поэкспериментировать и обнаружил, что запись туда отлично работает - выбранный пункт без проблем переключается из скрипта. Надеюсь, что это просто неточность в описании, а не «фича», которую закроют в следующих обновлениях.

4. Баг отображения значений на Тренде в Веб-клиенте (пропадают нули при 10, 100 и т.д.)
Наткнулся на баг, который воспроизводится строго на Web-клиенте (на десктопе всё отображается корректно, скриншоты приложил ниже). Если переменная на тренде принимает значение ровно 10 или 100, то в таблице значений под графиком на Веб-клиенте отображается цифра 1 - как будто просто отбрасываются нули. При этом сама линия тренда отрисовывается на правильном уровне. Как только значение немного меняется (например, опускается до 99.9 или 9.9), подпись под графиком сразу приходит в норму. Похоже на ошибку форматирования числа или маски вывода именно в веб-модуле при работе с круглыми десятками и сотнями.

4
Спасибо, что поделились своим вариантом решения и примером!

По поводу описанного вами артефакта с «проскальзыванием» страницы и прыганием окон — это можно скорректировать настройками самих окон:

Зафиксируйте координаты и размер: Задайте для всех этих окон абсолютно одинаковый размер, одинаковые координаты появления по X и Y, запретите перетаскивание и выставите одинаковое позиционирование, например, по центру.

В этом случае окна будут открываться строго в одних и тех же координатах и перестанут «разбегаться» по экрану при переключении.

Что касается «проскальзывания» фоновой страницы — скорее всего, при текущем огромном размере окна (во весь экран) этот дефект и происходит постоянно, так как движку тяжело каждый раз перерисовывать такую большую область. Если же уменьшить размер окон, то этот эффект проявится только при самом первом открытии/загрузке. После этого графический кэш подтянется. Переключение станет абсолютно бесшовным и дефект полностью пропадёт.

Использовал вот такой код для переключения окон, с ним точно открытия перестают «проскальзывать»:

Код: (delphi)
begin
  // Закрываем все окна вкладок у кликнувшего клиента
  GeneralSettingPOU25.CloseClient(GetClientName);
  ProductSupplySettingPOU25.CloseClient(GetClientName);
  TankSettingPOU25.CloseClient(GetClientName);
  TemperatureSettingPOU25.CloseClient(GetClientName);

  // Открываем то окно, за которое отвечает нажатая кнопка (по её Tag)
  case Sender.Tag of
    1: GeneralSettingPOU25.ShowClient(GetClientName);
    2: ProductSupplySettingPOU25.ShowClient(GetClientName);
    3: TankSettingPOU25.ShowClient(GetClientName);
    4: TemperatureSettingPOU25.ShowClient(GetClientName);
  end;
end.

5
Здравствуйте!

Столкнулся с архитектурной задачей при проектировании интерфейса настроек. Пример выставляемого интерфейса прикрепил к сообщению.

Задача:
Необходимо сделать всплывающее окно (Pop-up) с большим количеством вкладок настроек (например: Общие, Секция подачи, Секция бака, Секция температуры и т.д.).

Проблема:
Если использовать одно Pop-up окно и менять видимость групп объектов (.Visible) по нажатию на кнопки-вкладки, то изменение происходит на стороне сервера и подменяет вкладку у всех подключенных клиентов одновременно.

Компонент TPageControl (Страницы) не поддерживается для размещения внутри Pop-up окон. Использовать подстраницы (SubPage) не получается, так как вызов окна происходит со страницы, которая сама уже является подстраницей (а вложенные подстраницы не поддерживаются). Вариант с дублированием окон (создание 5–10 идентичных окон Wnd_Tab1, Wnd_Tab2... и их поочередное открытие через ShowClient/CloseClient) сильно перегружает проект. Это сложно поддерживать: при любом изменении дизайна, добавлении нового элемента или правке скрипта приходится вручную дублировать изменения на всех созданных окнах.

Вопросы к разработчикам и сообществу:
Есть ли в текущих версиях Simple-Scada какой-либо штатный способ реализовать клиент-ориентированное переключение видимости компонентов / вкладок внутри одного Pop-up окна (без создания десятка дублирующих окон)? Какое архитектурное решение вы рекомендуете использовать в подобных случаях, чтобы не плодить кучу одинаковых окон и не усложнять поддержку проекта?

Заранее спасибо за ответ!

Страницы: [1]