Снегопат
https://snegopat.ru/forum/

Скрипт Окна конфигурации
https://snegopat.ru/forum/viewtopic.php?f=3&t=21
Страница 1 из 10

Автор:  vladnet [ 31 авг 2011, 17:46 ]
Заголовок сообщения:  Скрипт Окна конфигурации

Сейчас собираюсь сделать очень удобный по моему мнению скрипт:
Будет показывать в дереве открытые окна конфигурации. Причем хочу сделать именно дерево, чтобы например одна открытая внешняя обработка отображалась отдельной ветвью. Думаю у многих было такое что смотришь в закладки а их просто туча и без поллитры не разобраться.

Подскажите как с помощью снегопата перебрать открытые окна. Плюс конечно хотелось бы иметь возможность отслеживать открытие новых окон и иметь возможность определять тип окна и его владельца если есть.

Автор:  artbear [ 31 авг 2011, 22:00 ]
Заголовок сообщения:  Re: Скрипт Окна конфигурации

Пока нет возможности перебора окон. У Александра это вроде бы в ближайших планах.
Сам жду такую возможность.

Автор:  vladnet [ 31 авг 2011, 23:03 ]
Заголовок сообщения:  Re: Скрипт Окна конфигурации

Александр, задачу сделать по возможности перебора или и так будет?
Хотя конечно самое главное стабильность работы, а я тут задач наваливаю новых ...

Автор:  orefkov [ 31 авг 2011, 23:45 ]
Заголовок сообщения:  Re: Скрипт Окна конфигурации

Задачу пока не надо. Это все равно у меня в планах, без этого снегопат - не снегопат.

Автор:  vladnet [ 03 дек 2011, 09:40 ]
Заголовок сообщения:  Re: Скрипт Окна конфигурации

В релизе 1.1.2.1 добавлена работа с окнами. Но как понял возможности перебрать окна конфигурации нет?

Автор:  orefkov [ 03 дек 2011, 10:34 ]
Заголовок сообщения:  Re: Скрипт Окна конфигурации

Пока нет. Я работаю над этим.
Просто я придерживаюсь принципа - "релизить больше, релизить чаще".
Маленькими шажками мы придем к цели!

Автор:  artbear [ 03 дек 2011, 13:26 ]
Заголовок сообщения:  Re: Скрипт Окна конфигурации

orefkov писал(а):
Просто я придерживаюсь принципа - "релизить больше, релизить чаще".
Маленькими шажками мы придем к цели!

Правильное решение, очередной релиз Снегопата привносит дополнительное счастье в мою жизнь :)

Автор:  vladnet [ 29 мар 2012, 21:55 ]
Заголовок сообщения:  Re: Скрипт Окна конфигурации

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

Автор:  orefkov [ 30 мар 2012, 05:43 ]
Заголовок сообщения:  Re: Скрипт Окна конфигурации

Развернутый пример готовлю.
Простой перебор окон в MDI области:
Код:
var views = windows.mdiView.enumChilds()
for(var i = 0; i < views.count; i++)
{
    var frame = views.item(i)
    Message(frame.title)
}

Дальше смотри свойства и методы объекта IV8View.
Кроме того, необходимо учитывать, что некоторые окна в 1С - так сказать непосредственные отображения чего-либо (например, окна объектов метаданных), а некоторые - только контейнеры для вложенных окон (например окна модулей, форм и тп.) У них обычно класс окна - V8FrameViewSplitter. Для таких окон надо также перебирать вложенных потомков через enumChilds. Вобщем, надо смотреть свойство isContainer и заполненность свойств mdObj, object, document.
Кроме того, необходимо учитывать, что окна могут быть "слеплены" либо через "Разделить окно", либо через меню "Окна..." кнопкой "Соединить", либо просто одно окно при нажатом Shift втащили в другое окно. И такое слепление может быть само вложенным еще куда-либо...

Автор:  orefkov [ 30 мар 2012, 08:28 ]
Заголовок сообщения:  Re: Скрипт Окна конфигурации

Вот несколько функций из моего тестового скрипта для просмотра отображений.

Код:
// Получить полное имя объекта метаданных
function getFullMDName(mdObj)
{
    if(!mdObj)
        return "no object"
    var names = []
    while(true)
    {
        names.unshift(mdObj.name)
        var className = mdObj.mdclass.name(1)
        if(!className.length || !mdObj.parent)
        {
            names.unshift(mdObj.container.identifier)
            break
        }
        names.unshift(className)
        mdObj = mdObj.parent
    }
    return names.join('.')
}

// Возвращает читаемое имя для состояния отображения
function state(s)
{
    switch(s)
    {
        case 1:
            return 'vsDock'
        case 2:
            return 'vsFloat'
        case 4:
            return 'vsMDI'
        case 8:
            return 'vsHardDock'
        case 16:
          return 'vsHiding'
      default:
            return s
   }
}
// Возвращает читаемое имя для положения отображения
function placement(s)
{
    switch(s)
    {
        case 1:
            return 'vpLeft'
        case 2:
            return 'vpTop'
        case 4:
            return 'vpRight'
        case 8:
            return 'vpBottom'
        case 16:
          return 'vpCenter'
        case 32:
          return 'vpTabbed'
      default:
            return s
   }
}

// Вывод инфы об отображении и его дочерних отображений
function printView(view, indent)
{
    Message(indent + "id = " + view.id, mExc1)
    Message(indent + " Title = " + view.title)
    Message(indent + " HWND = 0x" + view.hwnd.toString(16))
    Message(indent + " wndClass = " + view.wndClass)
    Message(indent + " container = " + view.isContainer)
    var pos = view.position()
    Message(indent + " pos.state = " + state(pos.state))
    Message(indent + " pos.placement = " + placement(pos.placement))
    var parent = view.parent
    if(parent)
        Message(indent + " parent id = " + parent.id)
   
    var childs = view.enumChilds()
    Message(indent + " childs = " + childs.count)
    for(var k = 0; k < childs.count; k++)
        printView(childs.item(k), indent + '\t')
}

// Распечатка MDI отображений
function macrosPrintMdiViews()
{
    var mdiWnds = windows.mdiView.enumChilds()
    Message("Mdi windows=" + mdiWnds.count)
    for(var k = 0, c = mdiWnds.count; k < c; k++)
        printView(mdiWnds.item(k), '')
}
// Распечатка всех отображений
function macrosPrintViewsFromRoot()
{
    printView(windows.mainView, "")
}
// Проверка активного и фокусного отображения
function macrosTestActiveView()
{
    // Активное и фокусное отображение могут отличаться. Например, если фокус в строке поиска в стандартном тулбаре
    Message("Active view")
    printView(windows.getActiveView(), '')
    Message("Focused view")
    printView(windows.getFocusedView(), '')
}
// Проверка различных свойств активного отображения
function macrosТestViewMD()
{
    var v = windows.getActiveView()
    printView(v, '')
    var text = getFullMDName(v.mdObj)
    var mdProp = v.mdProp
    if(mdProp)
    {
        var n = mdProp.name(1)
        text += "::" + n
        if(n == "Макет")
            text += " (" + toV8Value(v.mdObj.property("ТипМакета")).presentation() + ")"
    }
    Message(text)
    var obj = v.getObject()
    if(obj)
        Message("object - " + toV8Value(obj).typeName(1))
}

Страница 1 из 10 Часовой пояс: UTC + 3 часа
Powered by phpBB® Forum Software © phpBB Group
http://www.phpbb.com/