Author |
Topic |
|
Robinkzn
84 Posts |
Posted - 05/05/2011 : 18:45:04
|
В окне редактирования шаблона надо обработать событие перемещения шейпа. Помоему это событие изменениея Cells в графической части или просто Cells. В данном окне никак не могу обработать эти события. Подскажите пожалуйста как лучше сделать. |
|
Surrogate
Russia
122 Posts |
Posted - 05/06/2011 : 10:58:53
|
Можно по точнее сформулировать задачу:
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
† |
|
|
Robinkzn
84 Posts |
Posted - 05/07/2011 : 05:47:54
|
Спасибо за хорощий код и идею. При попадании мастера на чертеж, если пользователь захочет разгруппировать и исправить что то в мастере, шейп с кодом события попробует запустить макрос. В комманде, помоему runmacro, можно указать проект, но если набор открыт, запустится макрос находящейся в наборе. Можно вообще конечно убрать при сохранении мастера комманды в шейпе. Мне интересно, можно ли как то из вба остановить обработку событий шейпами? Или же по событию брать и всех шейпов убирать формулы, по завершении обработки макросом, снова их вносить. Как лучше быть? |
|
|
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 от реальной страницы и обработчик перестанет срабатывать. |
|
|
Robinkzn
84 Posts |
Posted - 05/09/2011 : 08:32:51
|
Set pg = ActivePage Не срабоатывает в этом окне у меня в визио 2007 эта комманда. |
|
|
Robinkzn
84 Posts |
Posted - 05/11/2011 : 18:27:57
|
Ребята подскажите пожалуйста. Никак не могу понять почему не работает. Если я модуле получаю страницу (переменную через сет), то обработчик её не видит. Если я туже страницу получаю через другое событие, например страница добавлена, тогда начинает работать и обработчик видит полученную таким образом переменную. Что надо сделать в модуле? |
|
|
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) |
|
|
|
Topic |
|