Author |
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
|
|
|
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() до него не достучатся, а тогда как? Не полным же перебором всех шейпов на всех страницах?
Большое Спасибо!!!
|
|
|
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") - явно будут перебираться только страницы. |
|
|
|
Topic |
|
|
|