All Forums
 Категория Visio
 Форум Вопросы и ответы
 Макрос
Author Previous Topic Topic Next Topic  

magniy

6 Posts

Posted - 10/25/2004 :  12:14:31
Здравствуйте.
Помогите решить следующую задачу.
Необходимо, по двойному нажатию на шейп запустить макрос. Проблема в том, что диаграмма создается программно и требуемый макрос должен быть импортирован из файла.
Т.е. из внешней программы идет выгрузка данных и построение диаграммы, после визуализации диаграммы, макрос должен быть уже подключен.
С уважением, Александр.

Tumanov

Russia
1198 Posts

Posted - 10/25/2004 :  18:02:49
А у Вас нет желания макрос записать в шаблон и создавать документ на основе шаблона с уже готовым макросом?
Тогда остается только прописать в созданный шейп вызов макроса.

Dim docObj As Visio.Document
Dim pagObj As Page
Set appVisio = CreateObject("visio.application")
Set docObj = appVisio.Documents.Open("c:\ttt.vst")
'Вот мы создали документ, и макрос там уже сидит
Set pagObj = docObj.Pages(1)
pagObj.DrawRectangle 1, 6, 3, 7
pagObj.Shapes(1).Cells("EventDblClick").Formula = "RunADDON(""ThisDocument.ttt"")"
'Теперь нарисовали шейп и вписали в качестве обработчика DblClick выполнение макроса ttt
Go to Top of Page

magniy

6 Posts

Posted - 10/26/2004 :  08:25:53
Здравствуйте.
Спасибо за ответ. Шалон - это тоже решение, однако есть одно но...
Шаблон необходимо включать в поставку. Необходимо, чтобы у клиента предварительно лежал шаблон.
Нет ли возможности после создания диаграммы провести импорт макроса, что нибудь типа appVisio.Documents.ImportFile("c:\ttt.bas").
Макрос предварительно программно записать по указанному пути.
С уважением, Александр
Go to Top of Page

Tumanov

Russia
1198 Posts

Posted - 10/26/2004 :  16:41:01
Так если макрос можно предварительно программно записать по указанному пути, то и шаблон можно предварительно программно записать по указанному пути :) а потом уже рисовать рисунок.
А с импортом макроса я все хотел поковыряться, но руки пока не дошли. И в общем-то - эта операция на грани игры с безопасностью, а ее все ужесточают и ужесточают... Так что не исключено, что начиная с Visio 2002 или 2003 этого уже вообще нельзя сделать.
Go to Top of Page

immortal

Russia
391 Posts

Posted - 10/27/2004 :  06:22:46  Visit immortal's Homepage
немного не понял, макрос создается программно, т.е. код макроса создается с помощью программы и каждый раз может быть разным? а может проще написать внешнюю программу и запускать ее, по крайней мере установки безопасности ей по барабану, раньше все делал макрасами, и один раз был случай, что тот для кого я это делал ни как не хотел менять уровень безопасности, его право и оно вполне оправдано.

визио 2003 форэвер

...а вобще-то я белый и пушистый.
Go to Top of Page

magniy

6 Posts

Posted - 10/27/2004 :  07:21:12
Здравствуйте.
Спасибо за участие. Буду думать.
(макрос не меняется, просто, чтобы его не распространять с исходниками, предполагается создать его программно по указанному пути)
С уважением, Александр.
Go to Top of Page

immortal

Russia
391 Posts

Posted - 10/27/2004 :  12:43:24  Visit immortal's Homepage
quote:
чтобы его не распространять с исходниками, предполагается создать его программно по указанному пути
вьехал, надо сделать внешнюю программу в Визуал бейсике, скомпилировать, и запускать как add-on, тогда исходники будут не доступны для просмотра, обо всем этом писалось тут.

визио 2003 форэвер

...а вобще-то я белый и пушистый.
Go to Top of Page

magniy

6 Posts

Posted - 10/28/2004 :  12:47:38
Здравствуйте,
Запустить макрос на основе шаблона получилось. Работает.
Прошу прошения за следующий вопрос...
Как в макросе получить доступ к Шейпу на котором данный макрос был инициализирован.

Есть возможность получить активную страницу
Set Page = ActivePage...
Коллекцию шейпов... Set shps = Page.Shapes

Как получить доступ к активному шейпу?

Видимо вопрос тривиальный.
С уважением, Александр.
Go to Top of Page

Tumanov

Russia
1198 Posts

Posted - 10/28/2004 :  17:41:23
Из предыдущего текста видно. что Вы собираетесь запускать макрос по двойному клику. В этом случае на странице будет селектирован один шейп - тот на котором кликают. Доступ к нему организуется как
Set shpObj = ActiveWindow.Selection(1)

Если случай более сложный, то вместо Runaddon можно использовать CallThis, которая позволяет передавать и шейп и любые дополнительные аргументы
procedure(shpObj As Visio.shape [arg1 As type, arg2 As type...])

И еще один случай - когда вызывается не макрос, а именно Add-on, то Visio передает в командной строке полнейшую информацию
/visio=instanceHandle /doc=docIndex /master=masterIndex /shape=NameID
и шейп определяется как
Set shpObj = appVisio.Documents(docIndex).Pages(pagIndex).Shapes(NameID)
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)