<< Click to Display Table of Contents >> Navigation: Проект > Элементы дерева объектов > Палитра ФБ > Служебные > Скрипт > Руководство и примеры > Работа с окнами > Работа с окнами |
При создании проектов требуется открывать, закрывать, отслеживать состояния окон. Для решения большинства штатных задач есть встроенный функционал - кнопки вызова, действия команд и событий, а также ФБ "Управление документом". Но если требуется большая гибкость с минимумом проектных решений, то для этой задачи можно использовать ФБ "Скрипт C#" - из него также можно обращаться к окнам в режиме исполнения.
На данном шаге мы рассмотрим открытие и закрытие окна из скрипта, при этом открытие окон будет производится в определенных координатах.
Сначала сделаем заготовку - два объекта Объект 1 и Объект 2, у которых сделаем Окно объекта, и 4 команды - две для открытия и две для закрытия.
На мнемосхеме Объекта 1 разместим эти кнопки.
Теперь сделаем скрипт, который будет отрабатывать нажатия на эти кнопки.
Код выглядит так:
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
Окно открылось. Нажмем на Закрыть 1 - окно закроется. Аналогично будет и с другими кнопками.
Готовый пример по ссылке.