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

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

Автор Тема: Универсальный скрипт для объектов одной страницы  (Прочитано 2487 раз)

pan2000

  • Постоялец
  • ***
  • Сообщений: 210
    • Просмотр профиля
Участник форума TeNQ задал вопрос ( Re: Вопросы и предложения по Simple-Scada 2 < Ответ #520 : 16 Май 2017, 11:35:58 >):

"Есть функция GetVariableByName. ... Можно ли ввести по аналогии функцию GetObjectByName для того, чтобы обратиться к объекту в универсальном скрипте"?

Из документации по скриптам:

       function FindObjectByName(const AName: string): TM_Control;
       Описание: Возвращает объект подстраницы с именем AName...

Создание страниц, подстраниц и объектов в редакторе показывает, что "Подстраница 1" содержит те же объекты, что и сама родительская страница. Проверка показала, что объекты страницы доступны на "Подстранице 1" (для одностраничного проекта  SubPage1 соответствует Page1):

      { собственно выборка объекта TEXTi, размещенного на странице Page1}
      ObjSelect := SubPage1.FindObjectByName('TEXT' + IntToStr(i));

Т.е. можно создать универсальный скрипт для объектов одной страницы (По крайней мере в действующей сейчас редакции Simple-Scada).
Пример во вложении.


Simple-Scada

  • Администратор
  • *****
  • Сообщений: 3160
    • Просмотр профиля
    • Simple-Scada
Здравствуйте.
Да, поиск в пределах подстраницы доступен довольно давно. Но, как мы поняли, TeNQ такой поиск не подходит и нужен поиск объекта по всему проекту. Также сейчас данный поиск использует простой перебор, из-за чего он довольно медленный и мы рекомендуем использовать его как можно реже. В ближайшем обновлении мы добавим новые функции поиска, которые будут работать значительно быстрее.

TeNQ

  • Постоялец
  • ***
  • Сообщений: 199
    • Просмотр профиля
Цитировать
Т.е. можно создать универсальный скрипт для объектов одной страницы (По крайней мере в действующей сейчас редакции Simple-Scada).
Пример посмотрел, спасибо. Но поиск в пределах подстраницы мне не подойдет. У меня одинаковые приборы и управление каждым прибором расположено на своей подстранице. Сначала придется через case искать нужную подстраницу и там уже искать объект. Это не имеет смысла, потому что я и так через сейчас через case напрямую нахожу объект. Избавиться от case и сократить код не получиться.
Вообще эта привязка объекта к подстранице в поиске непонятна. Ведь каждый объект имеет уникальное имя в пределах проекта. Зачем тогда ограничивать поиск подстраницей, ну разве что ускорить поиск.

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 3160
    • Просмотр профиля
    • Simple-Scada
Цитировать
Зачем тогда ограничивать поиск подстраницей, ну разве что ускорить поиск.
Да, именно для увеличения скорости.

TeNQ

  • Постоялец
  • ***
  • Сообщений: 199
    • Просмотр профиля
Тогда я бы сделал так.
 function FindObjectByName(const AName: string, const ASubpage: integer): TM_Control;
       Описание: Возвращает объект подстраницы с именем AName...

 ObjSelect := FindObjectByName('TEXT' + IntToStr(i), SubPage);

Где SubPage - Номер страницы, где планируется искать объект.

Такой вариант подойдет всем. И тем кто ищет объект на 1 странице, и тем кто собирается искать объект на конкретной из множества подстраниц. Ну и придется делать перебор подстраниц в цикле тем, кто не знает на какой подстранице будет объект .

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 3160
    • Просмотр профиля
    • Simple-Scada
Указание номера подстраницы приведёт к тому, что при смене позиций подстраниц, а также после их удаления (удаление тоже приводит к смене номера последующих подстраниц) скрипт перестанет работать и его нужно будет корректировать. Поэтому мы не рассматриваем такой вариант. К тому же сейчас в этом уже нет необходимости, т.к. мы и писали выше: в ближайшем обновлении мы добавим новые функции поиска (по имени), которые будут работать значительно быстрее текущих. Также появится возможность поиска объекта по имени по всему проекту.