Работа с окнами

<< Click to Display Table of Contents >>

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

Работа с окнами

При создании проектов требуется открывать, закрывать, отслеживать состояния окон. Для решения большинства штатных задач есть встроенный функционал - кнопки вызова, действия команд и событий, а также ФБ "Управление документом". Но если требуется большая гибкость с минимумом проектных решений, то для этой задачи можно использовать ФБ "Скрипт C#" - из него также можно обращаться к окнам в режиме исполнения.

На данном шаге мы рассмотрим открытие и закрытие окна из скрипта, при этом открытие окон будет производится в определенных координатах.

Сначала сделаем заготовку - два объекта Объект 1 и Объект 2, у которых сделаем Окно объекта, и 4 команды - две для открытия и две для закрытия.

sluzhebnie_skript_rukovodstvo_i_primery_rabota_s_oknami_otkrytie_i_zakrytie_okon

На мнемосхеме Объекта 1 разместим эти кнопки.

sluzhebnie_skript_rukovodstvo_i_primery_rabota_s_oknami_otkrytie_i_zakrytie_okon1

Теперь сделаем скрипт, который будет отрабатывать нажатия на эти кнопки.

sluzhebnie_skript_rukovodstvo_i_primery_rabota_s_oknami_otkrytie_i_zakrytie_okon2

Код выглядит так:

public partial class ФБ : ScriptBase
{
    const string NameWindow = "Окно объекта";
    bool? LOpenWindows1 = false;
    bool? LOpenWindows2 = false;
    bool? LCloseWindows1 = false;
    bool? LCloseWindows2 = false;
    public override void Execute()
    {
        if (ОткрытьОкно1 == true && LOpenWindows1 == false)
        {
        }
        LOpenWindows1 = ОткрытьОкно1;
        if (ОткрытьОкно2 == true && LOpenWindows2 == false)
        {
        }
        LOpenWindows2 = ОткрытьОкно2;
        if (ЗакрытьОкно1 == true && LCloseWindows1 == false)
        {
        }
        LCloseWindows1 = ЗакрытьОкно1;
        if (ЗакрытьОкно2 == true && LCloseWindows2 == false)
        {
        }
        LCloseWindows2 = ЗакрытьОкно2;
    }
}

Помимо переменных для отслеживания фронта сигнала на вход, мы еще объявили одну строковую константу которая хранит имя окна открываемого окна объекта. При необходимости можно сделать его изменяемым и в режиме исполнения, но нам это не требуется.

Теперь нам необходимо написать метод, который будет открывать и закрывать окна. Начнем с открытия. Открытие мы будем проводить в специальном методе, в который мы передадим имя объекта чью мнемосхему нужно открыть, и координату (или координаты открытия). Для простоты мы будем менять только координату X. Создадим такой метод:

void OpenWindow(string NameObj, int X)
{
}

Сначала нужно получить класс мнемосхемы. Чтобы это сделать, сначала нужно получить объект (можно применять те же методы, как мы применяли на уроке где мы обращались к переменным),и получить его атрибуты. В нашем случае, нам нужно взять родительский объект скрипта, взять его дочерний объект с именем полученным при вызове метода.

//получаем объект и атрибуты его мнемосхемы     
var mnemo = HostFB.TreeItemHlp.ParentObject.GetChild(NameObj).TreeItemHlp.Attributes[NameWindow];

После этого нужно сделать копию данной мнемосхемы, изменить координаты и выполнить открытие. Для этого используется код:

//определяем координаты
info.PositionLeft = X; //координата Х
info.PositionTop = 400; //координата Y
mnemo.Open(info); //открываем

Однако мнемосхему нужно открыть в отдельном потоке, поэтому необходимо использовать специальный метод BeginInvoke:

RTManager.Instance.ThreadHolder.BeginInvoke(new ThreadStart(delegate
{
}));

Чтобы данный метод был доступен, необходимо добавить пространство имен.

using System.Threading;
using MasterSCADA.RT;

Итоговый код метода будет выглядеть так:

void OpenWindow(string NameObj, int X)
{
 RTManager.Instance.ThreadHolder.BeginInvoke(new ThreadStart(delegate
 {
  //получаем объект и атрибуты его мнемосхемы     
  var mnemo = HostFB.TreeItemHlp.ParentObject.GetChild(NameObj).TreeItemHlp.Attributes[NameWindow];
  var info = mnemo.MnemoInfo.Clone();
  //определяем координаты
  info.PositionLeft = X; //координата X
  info.PositionTop = 400; //координата Y
  mnemo.Open(info); //открываем
 }));
}

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

void CloseWindow(string NameObj)
{
    RTManager.Instance.ThreadHolder.BeginInvoke(new ThreadStart(delegate
    {
        var mnemo1 = HostFB.TreeItemHlp.ParentObject.GetChild(NameObj).TreeItemHlp.Attributes[NameWindow];
        if (mnemo1.Opened) mnemo1.Close();
    }));
}

Теперь останется только вызвать данные методы из метода Execute.

public override async void Execute()
{
    if (ОткрытьОкно1 == true && LOpenWindows1 == false)
    {
        OpenWindow("Объект 1", 300);
    }
    LOpenWindows1 = ОткрытьОкно1;
    if (ОткрытьОкно2 == true && LOpenWindows2 == false)
    {
        OpenWindow("Объект 2", 600);
    }
    LOpenWindows2 = ОткрытьОкно2;
    if (ЗакрытьОкно1 == true && LCloseWindows1 == false)
    {
        CloseWindow("Объект 1");
    }
    LCloseWindows1 = ЗакрытьОкно1;
    if (ЗакрытьОкно2 == true && LCloseWindows2 == false)
    {
        CloseWindow("Объект 2");
    }
    LCloseWindows2 = ЗакрытьОкно2;
}

Теперь можно проверить работу нашего скрипта. Установим связи между командами и входами скриптов и запустим режим исполнения.

Нажмем на кнопку Открыть 1

sluzhebnie_skript_rukovodstvo_i_primery_rabota_s_oknami_otkrytie_i_zakrytie_okon3

Окно открылось. Нажмем на Закрыть 1 - окно закроется. Аналогично будет и с другими кнопками.

Готовый пример по ссылке.