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

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

Автор Тема: Независимое переключение вкладок в окне для десктоп и веб клиентов  (Прочитано 281 раз)

Pavel

  • Новичок
  • *
  • Сообщений: 5
    • Просмотр профиля
Здравствуйте!

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

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

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

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

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

Заранее спасибо за ответ!
« Изменён: 04 Августа 2026, 17:20:49 от Simple-Scada »

Simple_Scada

  • Администратор
  • *****
  • Сообщений: 1417
    • Просмотр профиля
Здравствуйте.

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

Цитировать
Вариант с дублированием окон (создание 5–10 идентичных окон Wnd_Tab1, Wnd_Tab2...
Рекомендуем использовать шаблонные окна. Тогда для каждого агрегата не придется создавать отдельные окна настроек, а для изменения окна достаточно будет внести изменения только в шаблон.
 
Цитировать
и их поочередное открытие через ShowClient/CloseClient
Для открытия окна не требуется писать скрипт. У каждого объекта имеется свойство "Окно", где можно указать окно, которое будет открываться при нажатии на объект.

pan2000

  • Постоялец
  • ***
  • Сообщений: 234
    • Просмотр профиля
   Здравствуйте.

Во вложении пример интерфейса настроек на основе больших (размером в экран) оконных форм. Настройки одной формы образуют связанную группу данных, не подверженных влиянию других пользователей. Т.е. в форме желательно иметь максимальное количество настроек.
Интерфейс обеспечивает переключение между окнами и повторное открытие окна после действия "отправить форму".
Увы, но имеется артефакт переключения - между окнами "проскальзывает" изображения страницы.
 
P.S. можно уменьшить размер окон, но тогда по причине отсутствия механизмов перемещения окон или их фиксации, окна просто "разбегутся" по экрану

Pavel

  • Новичок
  • *
  • Сообщений: 5
    • Просмотр профиля
Спасибо, что поделились своим вариантом решения и примером!

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

Зафиксируйте координаты и размер: Задайте для всех этих окон абсолютно одинаковый размер, одинаковые координаты появления по 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.
« Изменён: 06 Августа 2026, 16:58:44 от Pavel »

pan2000

  • Постоялец
  • ***
  • Сообщений: 234
    • Просмотр профиля
   Здравствуйте.

Фиксированное положение окна не есть хорошо, если пользователь захочет посмотреть что же там за окном.

Артефакт есть следствие неправильной последовательности действий с окнами. Правильная последовательность: открыть новое окно, когда окно откроется и аккуратно перекроет предыдущее (событие окна OnShow), закрыть все прочие окна. Но для окна-формы, значения из которого запоминаются, эта последовательность не работает, т.к. окно автоматически закроется.

Для интерфейса настроек Вам необходимо выбрать характеристики окон (обычное - форма ввода), количество групп окон и возможность дальнейшего масштабирования проекта. Кроме того определить структуру имен объектов и переменных, что будет важно при использовании универсальных скриптов. (Я бы предложил вынести название агрегата в префикс: GeneralSettingPOU25 -> POU25_GeneralSetting или POU25_wndGeneralSetting, что по крайней мере соберёт в инспекторе все объекты в "кучку").

Во вложении пример для настройки с группой окон-форм двух агрегатов ПОУ25 и ПОУ26.
Дополнительные затраты для настроек ещё одного аналогичного агрегата:
- набор окон;
- объект/объекты начального вызова группы и скрипт вызова.
Для новой группы окон дополнительно ещё потребуются шаблон для переключения окон, скрипт его инициализации и скрипты работы с формой.
« Изменён: 09 Августа 2026, 15:23:31 от pan2000 »