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

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

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

MaksimGorbunov

  • Новичок
  • *
  • Сообщений: 7
    • Просмотр профиля
Добрый день.

Версия - 2.7.3.1.

Столкнулся с тем, что при подключении через веб-клиент некорректно отрабатывает объект TM_ComboBox. Т.е. при выборе элемента из выпадающего списка на веб-клиенте не происходит переход на нужную мнемосхему диагностики. Переходы реализованы через скрипт по изменению значения переменной связанной с объектом OnDataChange (если значение переменной для данной строки = 1, то GetPageByName("название мнемки").GoToPageClient(GetClientName) и т.п.) На десктоп-клиенте отрабатывает всё корректно, на веб-клиенте - нет. Как это можно исправить? Иногда требуется подключение через веб-клиент, а диагностика в данном случае недоступна.

Simple_Scada

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

Цитировать
Переходы реализованы через скрипт по изменению значения переменной
См. описание функции "GetClientName"– она не работает в скриптах, которые вызываются сервером скады (OnDataChange и т.д.). Вызов GetClientName в таких скриптах всегда будет возвращать пустую строку. Соответственно, переход по страницам будет выполняться только для десктоп-клиентов, в настройках которых имя клиента не задано, т.е. = пустой строке. Если задать любое произвольное имя для декстоп-клиента, то переход также не будет работать. Web-клиенты получают случайно сгенерированное имя, поэтому для них такой скрипт никогда не будет работать.

Для перехода по страницам через компонент "Список", можно использовать следующий способ:
1. Задайте нужным страницам однотипные имена, например PageDiagnostic1, PageDiagnostic2, PageDiagnostic3 и т.д.
2. Перейдите в меню редактирования скриптов и создайте новый глобальный модуль, например с именем "GlobalUnit" и следующим кодом:
Код: (delphi)
interface
 
var
  ClientData: TM_ClientData;
 
implementation
 
finalization
  FreeAndNil(ClientData);
end.
3. На событие "OnClick" списка используйте следующий код:
Код: (delphi)
begin
  ClientData := GetClientData;
end.
4. На событие "OnDataChange" списка используйте следующий код:
Код: (delphi)
var
  aPage: TM_Page;
begin
  // ищем страницу с именем PageDiagnostic + значение переменной списка
  aPage := GetPageByName('PageDiagnostic' + IntToStr((Sender as TM_ComboBox).AsInt));
  if aPage <> nil then                       // если страница существует
    aPage.GoToPageClient(ClientData.Name);   // то, перейти на нее
end.
Учитывайте, что такой способ будет работать на 100% корректно только в однопользовательской системе. При одновременной работе множества пользователей всегда есть вероятность, что несколько пользователей будут одновременно взаимодействовать со списком и мешать друг другу.
« Изменён: Сегодня в 14:42:55 от Simple Scada »

MaksimGorbunov

  • Новичок
  • *
  • Сообщений: 7
    • Просмотр профиля
Благодарю за ответ.