Отслеживание окон

<< Click to Display Table of Contents >>

Navigation:  Проект > Элементы дерева объектов > Палитра ФБ > Служебные > Скрипт > Руководство и примеры > Работа с окнами >

Отслеживание окон

​Отслеживание окон возможно выполнять с помощью ФБ "Управление документом". Однако, если при этом требуется большая гибкость, то данную задачу также можно решить через скрипта.

Наилучшим решением для отслеживания окон, это подписаться на их открытие. Для этого применяется специальный сервис.

DocumentWindowService DWS = HostFB.TreeItemHlp.Project.GetService<DocumentWindowService>();

Сервис будет доступен если добавить пространство имен:

using MasterSCADA.Services.WindowService;

Данный сервис, имеет два event (сообщения) - WindowOpened и WindowClosed. Можно подписаться на данные event и определять какое окно было открыто или закрыто.

Сделаем заготовку. В объекте Цех будет находится 4 объекта Аппарат 1 - Аппарат 4. В объекте Общий находится окно управления, в с кнопками открытия. Цвет кнопок через вход динамизации меняется в зависимости от состояния выходов Аппарат 1 - Аппарат 4.

sluzhebnie_skript_rukovodstvo_i_primery_rabota_s_oknami_otslezhivanie_okon1

Объекты Аппарат 1 - Аппарат 4 имеют по мнемосхеме, открываемой в режиме Новое окно.

sluzhebnie_skript_rukovodstvo_i_primery_rabota_s_oknami_otslezhivanie_okon2

Теперь перейдем к коду.

Сначала создадим подписки на открытие и закрытие окон, в сервисе DocumentWindowService.

public DocumentWindowService DWS;
public override void Start()
{
    DWS = HostFB.TreeItemHlp.Project.GetService<DocumentWindowService>();
    DWS.WindowOpened += WindowService_WindowOpened;
    DWS.WindowClosed += WindowService_WindowClosed;
}
public override void Stop()
{
    DWS.WindowOpened -= WindowService_WindowOpened;
    DWS.WindowClosed -= WindowService_WindowClosed;
}

В методе Start подписки создаются, а в методе Stop - уничтожаются.

Теперь нужно создать методы, которые будут вызываться при возникновении события. Код метода будет выглядеть так:

public void WindowService_WindowOpened(IAttributeHlp attribute, IMnemoInfoHlp info)
{
    if (info.CallType == MasterSCADA.Interfaces.ECallType.ctNewWindow)
    {
        if (attribute.TreeItem.Name == "Аппарат1") Аппарат1 = true;
        if (attribute.TreeItem.Name == "Аппарат2") Аппарат2 = true;
        if (attribute.TreeItem.Name == "Аппарат3") Аппарат3 = true;
        if (attribute.TreeItem.Name == "Аппарат4") Аппарат4 = true;
    }
}

В качестве аргументов метод принимает атрибуты объекта окна и атрибуты самого окна.

В условии мы проверяем, что имя нашего объекта Аппарат1-4, и в зависимости от этого включаем нужный выход.Также проверяется, что открыто новое окно. В реальных проектах проверку следует сделать сложнее - например проверить имя окна (attribute.Name), полный путь объекта (attribute.TreeItem.FullName) и т.д.

Теперь сделаем аналогично метод для обработки события закрытия.

public void WindowService_WindowClosed(IAttributeHlp attribute, IMnemoInfoHlp info)
{
    if (info.CallType == MasterSCADA.Interfaces.ECallType.ctNewWindow)
    {
        if (attribute.TreeItem.Name == "Аппарат1") Аппарат1 = false;
        if (attribute.TreeItem.Name == "Аппарат2") Аппарат2 = false;
        if (attribute.TreeItem.Name == "Аппарат3") Аппарат3 = false;
        if (attribute.TreeItem.Name == "Аппарат4") Аппарат4 = false;
    }
}

Метод практически аналогичен, но здесь если закрыто окно определенного объекта, то соответствующий ему выход выключается.

Проверим работу в режиме исполнения:

sluzhebnie_skript_rukovodstvo_i_primery_rabota_s_oknami_otslezhivanie_okon

Готовый пример скрипта можно скачать по ссылке.