All Forums
 Категория Visio
 Форум Вопросы и ответы
 События в Master Draw window
Author Previous Topic Topic Next Topic  

Robinkzn

84 Posts

Posted - 05/05/2011 :  18:45:04
В окне редактирования шаблона надо обработать событие перемещения шейпа. Помоему это событие изменениея Cells в графической части или просто Cells. В данном окне никак не могу обработать эти события. Подскажите пожалуйста как лучше сделать.

Surrogate

Russia
122 Posts

Posted - 05/06/2011 :  10:58:53  Visit Surrogate's Homepage
Можно по точнее сформулировать задачу:

1. Задачу требуется решить средствами VBA или ShapeSheet ?
Если речь о ShapeSheet, то
2. Шаблон - скорее всего в виду имеется трафарет или мастер, раз в заголовке идет речь о "Master Draw window". Это окно называется "Master Explorer"!
3. В ShapeSheet В секции Events есть событие EventXFMod - оно реагирует на любое изменение геометрии шейпа: изменение длины/ширины/угла, координат точек привязки шейпа.
Если речь о VBA, то как раз здесь будет Cells
Sub Macro2()
    Dim cellname As String
    Dim vsoCell As Cell
    cellname = "EventXFMod"
    ActiveDocument.Masters.ItemFromID(0).Open.OpenDrawWindow

    Application.Windows.ItemEx("Drawing1:Stencil:Triangle").Activate

    Application.ActiveWindow.Master.Shapes.ItemFromID(5).OpenSheetWindow

    Set vsoCell = Application.ActiveWindow.Shape.Cells(cellname)
    vsoCell.Formula = Chr(34) & "ваша формула" & Chr(34)

    Application.ActiveWindow.Close

   End Sub


Go to Top of Page

Robinkzn

84 Posts

Posted - 05/07/2011 :  05:47:54
Спасибо за хорощий код и идею. При попадании мастера на чертеж, если пользователь захочет разгруппировать и исправить что то в мастере, шейп с кодом события попробует запустить макрос. В комманде, помоему runmacro, можно указать проект, но если набор открыт, запустится макрос находящейся в наборе. Можно вообще конечно убрать при сохранении мастера комманды в шейпе. Мне интересно, можно ли как то из вба остановить обработку событий шейпами? Или же по событию брать и всех шейпов убирать формулы, по завершении обработки макросом, снова их вносить. Как лучше быть?
Go to Top of Page

Tumanov

Russia
1198 Posts

Posted - 05/08/2011 :  06:36:37
Напрямую остановить обработку событий нельзя. Но можно попытаться добиться схожего эффекта.
1. В обработчики первой командой вставить проверку какого-то условия, например, значения в ячейке шейп-листа страницы или документа. Тогда, изменяя это значение, мы сможем управлять обработчиками.
2. Объявить специальный объект, например, страницу, событиями которого мы хотим управлять. Примерно так.
Dim WithEvents pg As Visio.Page

Sub ВключитьОбработчик()
    Set pg = ActivePage
End Sub
Sub ВыключитьОбработчик()
    Set pg = Nothing
End Sub

Private Sub pg_CellChanged(ByVal Cell As IVCell)
    MsgBox "Обработчик"
End Sub

pg - это такой объект страница.
После того, как макросом Включить обработчик мы свяжем этот объект с реальной страницей ActivePage, обработчик начинает срабатывать.
Выключающий макрос отключит объект pg от реальной страницы и обработчик перестанет срабатывать.
Go to Top of Page

Robinkzn

84 Posts

Posted - 05/09/2011 :  08:32:51
Set pg = ActivePage
Не срабоатывает в этом окне у меня в визио 2007 эта комманда.
Go to Top of Page

Robinkzn

84 Posts

Posted - 05/11/2011 :  18:27:57
Ребята подскажите пожалуйста. Никак не могу понять почему не работает. Если я модуле получаю страницу (переменную через сет), то обработчик её не видит. Если я туже страницу получаю через другое событие, например страница добавлена, тогда начинает работать и обработчик видит полученную таким образом переменную. Что надо сделать в модуле?
Go to Top of Page

Robinkzn

84 Posts

Posted - 05/12/2011 :  10:17:29
Разобрался с обработкой событий в окне Master explorer. Использовал Event monitor из Visio SDK чтобы понять события каких объектов обрабатывать.
Private Sub vsoMaster_CellChanged(ByVal Cell As IVCell)
Для обработки перемещения шейпов использовал выше указанное событие. Для обработки события открытия окна Master Explorer использовал
Public Sub vsoApp_WindowActivated(ByVal wdw As IVWindow)
Go to Top of Page
  Previous Topic Topic Next Topic  
Данный сайт является архивом форума visio.artberg.ru, который был закрыт в связи с переходом на новую платформу visio.getbb.ru
Все материалы доступны только для чтения! Если у вас появились вопросы, или вы хотите что-то обсудить, связанное с Visio, обращайтесь на новый форум!
Архив был создан благодаря совместным усилиям Генадия Туманова @Tumanov (visio.artberg.ru), Александра ака @Surrogate (visio.getbb.ru), и Николая Белых @nbelyh (unmanagedvisio.com)