All Forums
 Категория Visio
 Форум Вопросы и ответы
 Еще раз про конекшен.
Author Previous Topic Topic Next Topic  

SaSa

27 Posts

Posted - 01/22/2004 :  15:24:32
Вопрос такой. Есть у меня труба типа конектор, у нее в свойствах есть две пользовательские ячейки. Задача: В первую ячейку заносилось имя шейпа, который будет подключен к началу трубы, а во вторую ячейку имя шейпа на конце трубы. Возможно ли решить эту задачу не прибегая к VB? Если прибегать к VB то два вопроса как повесить функцию на событие «Conection» и как привязать код именно к конкретному мастеру, чтобы при его копирование переносе из оного шейп листа в другой код тоже переносился. И еще как из VB понять какой конец трубы подключен первый или второй? т.к труба имеет направление "стрелочку" то это принципиальный вопрос, что в начале трубы, а что в конце. Спасибо..

Tumanov

Russia
1198 Posts

Posted - 01/24/2004 :  14:13:02
Без VB, похоже, просто не получится, а когда накручиваешь что-то очень сложное, то трудно гарантировать работоспособность на все случаи жизни. Так что проще с VB.

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

Последовательность действий примерно такая:
Объявляете страницу с обслуживанием событий
Public WithEvents SuperPage As Visio.Page
В VBA сразу появляется новая закладка SuperPage с событиями для этой страницы
Щелкаете по ConnectionsAdded и ConnectionsDeleted и пишете для них обработчики.
В обработчиках фильтруете лишние события, например так:
If Connects(1).FromSheet.Master Is Nothing Then Exit Sub
If Connects(1).FromSheet.Master.Name <> "Dynamic connector" Then Exit Sub
Концы коннектора распознаются по свойству FromPart
MsgBox Connects(1).FromPart будет выводить либо 9 (visBegin), либо 12 (visEnd).
А чтобы обработка событий включилась, нужно где-нибудь, например при загрузке страницы, связать ее с конкретной страницей
Set SuperPage = ActivePage
Go to Top of Page

SaSa

27 Posts

Posted - 01/28/2004 :  13:55:31
Спасибо сам бы про "WithEvents SuperPage " не в жизнь бы не догадался! Так вот все вроде получилось кроме самой последней части "Set SuperPage = ActivePage" никак не могу найти куда это прописать чтобы SuperPage была всегда “ ActivePage ” Прописывал и в "Document_DocumentOpened" и в Document_PageChanged и Document_ShapeAdded и .... и всерано возникают случаи когда страница на которой происходит конекшен не обрабатывала событие "SuperPage_ConnectionsAdded" . А мне нужно вообще исключить такую возможность.
Да еще вопрос я хотел написать так:

Private Sub SuperPage_ConnectionsAdded(ByVal Connects As IVConnects)

Dim InName As String
Dim ShapeName As String

If Connects(1).FromSheet.Master.Name <> "Pipe" Then Exit Sub

ShapeName = Connects(1).ToSheet.Name
InName = "=" & ShapeName & "!User.Tag1"
If Connects(1).FromPart = 9 Then ActiveWindow.Selection.Item(1).Cells("User.In").Formula = InName

If Connects(1).FromPart = 12 Then ActiveWindow.Selection.Item(1).Cells("User.Out").Formula = InName
End Sub

Но строчка If Connects(1).FromSheet.Master.Name никак не хочет выдавать имя мастера, а выдает имя трубы типа Pipe.46 вместо просто Pipe, а если написать “If Connects(1).FromSheet.MasterShape.Name” то соответственно получается "динамик конекшен", а вот получить имя мастера не получается:(

И еще почему-то везде во всех примерах на форуме пользуют не Cells("User.Out").Formula , а CellsSRC и CellsSRCExists, там получаются какие-то сложные непонятные конструкции, хотя можно было просто написать Cells ... Я не сильный профи в чем разница?

Да и еще до кучи, вроде-бы простая вещь но меня она поставила в тупик. Предположим я каким-то образом получаю “Name” шейпа например “PressPoint.122” но не знаю ни на каком листе он лежит ни.. и мне надо запросить его свойства, то есть ни через Pages(i) .Shapes() ни через ActivePage.Shapes() до него не достучатся, а тогда как? Не полным же перебором всех шейпов на всех страницах?

Большое Спасибо!!!
Go to Top of Page

Tumanov

Russia
1198 Posts

Posted - 01/28/2004 :  20:29:39
Возможно, это потому, что у Вас несколько страниц. Может быть в качестве объекта в этом случае выбрать не страницу, а Application, Documents или Pages. Жаль, что нельзя использовать Document.
По поводу сравнения с Pipe я не понял, как это у Вас получилось, но в любом случае вместо прямого сравнения можно попробовать пользоваться функцией поиска подстроки в строке. Тогда независимо от Pipe.46 или Pipe.1298 Вы все равно обнаружите фрагмент Pipe.
Скорее всего CellsSRC должно работать быстрее, так как дает прямое указание на ячейку, в отличие от поиска по имени (хотя при обращении к функции этого поиска и не видно в явном виде). Ну, а Exists - это уже связано с обработкой ошибок и надежностью работы программы. Желательно с этими конструкциями уметь разобираться.
Искать шейп по имени, может и действительно не самый лучший способ. Но в принципе и он возможен. Вы же можете написать Pages(i).Shapes("PressPoint.122") - явно будут перебираться только страницы.
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)