All Forums
 Категория Visio
 Форум Вопросы и ответы
 Помогите создать Add on
Author Previous Topic Topic Next Topic  

davinchi

Russia
6 Posts

Posted - 12/06/2006 :  15:59:01
Есть задача сделать интерактивный трафарет содержащиф несколько групп свойств, которые должны вводиться через собственное окно свойств...
Трафарет примерно следующего плана:

|---------------------------|
| <Тип трафарета> |+
| <Название трафарета> |
|---------------------------|
|<Название раздела свойств1>|
|---------------------------|
|<Свойство1>:<Тип> |+
|<Свойство2>:<Тип> |+
|... |+
|<СвойствоN>:<Тип> |+
|---------------------------|
|<Название раздела свойств2>|
|---------------------------|
|<Свойство1>:<Тип> |+
|<Свойство2>:<Тип> |+
|... |+
|<СвойствоN>:<Тип> |+
|---------------------------|
|... |
|---------------------------|
|<Название раздела свойствN>|
|---------------------------|
|<Свойство1>:<Тип> |+
|<Свойство2>:<Тип> |+
|... |+
|<СвойствоN>:<Тип> |+
|---------------------------|

плюсами отмечены точки соединения...
в угловых скобках "<...>" расположен изменяемый текст, который должен вводиться из собственного окна свойств, в котором выберается тип трафарета, вводится название трафарета, создаются разделы свойств и вводятся свойства... на первый взгляд можно реализовать окно свойств с помощью макросов и VBA, но я знаком только с Delphi и в нем создать такое окошко не проблема, а далее взаимодействовать с трафоретом через OLE... возможности Visio, такое позволяют, к примеру, трафарет класса из диаграммы UML использует окно свойств из аддона.
Уважаемые ГУРУ Visio, просветите пожалуйса как создавать аддон и связать его с трафаретом...

Tumanov

Russia
1198 Posts

Posted - 12/06/2006 :  19:07:49
1. Сначала оговорим терминологию...
Трафаретом (Stencil) в Visio называется специальный документ, хранящий мастер-шейпы. Трафарет хранится в файле .vss и открывается обычно в отдельном окошке слева от окна рисунка Visio.
Вы скорее всего спрашиваете о том, как сделать мастер-шейп. Дальше я буду исходить из этого предположения.
2. Под связью с трафаретом скорее всего понимается вызов Add-On при каких-то действиях с шейпом и доступ из Add-On к шейпу.
Для вызова Add-On проще всего использовать события EventDblClick (двойной щелчок по шейпу, когда он уже на рисунке) и EventDrop (когда мастер-шейп переносится с трафарета на рисунок и на рисунке создается его копия). Для такой связи нужно всего лишь прописать вызов нужного Add-On в соответствующей ячейке ShapeSheet нужного шейпа (мастер-шейпа). Для двойного щелчка это можно сделать через интерфейс (меню Format / Behavior / Double-Click, Run macro), а для EventDrop сделать по аналогии.
Можно вызывать и по другим событиям, но это будет чуть посложнее.
3. При вызове Add-On Visio передает ему несколько параметров обращения. Это индексы документа, страницы, шейпа. Через эти параметры Add-On может получить доступ к объектной модели Visio, в том числе и узнать, какой шейп его вызвал.
4. Как создать Add-On объяснять довольно долго. Да и не приходилось мне создавать их на Delphi. Лучше всего скачать SDK Visio. Там, во-первых, написано, как это делается (правда, не по-русски), во-вторых, есть примеры (основа Add-On) для VB и C. Они хорошо комментированы, так что, даже не зная языка, можно понять суть того, что делается, и попытаться воспроизвести это на Delphi.
Ну, а если писать на VB, то можно просто брать эту основу и начинать пристраивать к ней свои функции...
Go to Top of Page

davinchi

Russia
6 Posts

Posted - 12/07/2006 :  01:38:07
1. Большое спасибо за разъяснение терминологии, я третий день юзаю Visio и для меня это многое прояснило... Вы правильно поняли, создаю именно мастер-шейп. Тогда попутно возникает вопрос что такое шаблон и биюлиотека шаблонов?
2. Под связью с трафоретом понимается Add-in или Add-on. На сколько я понял из прочитанного на этом форуме Add-in это DLL пригружаемая в Visio, а Add-on это exe или dll используемая во вне от Visio, но Visio может ругаться при вызове Add-on предупреждая о безопасности. Чтобы этого избежать актуальнее использовать Add-in.
3. Для меня очень проблемотично разобрать код VB и C# т.к. не знаком с модулями, функциями и процидурами, используемыми в примерах SDK. Задам вопрос прямо - что из себя представляет Add-in, т.е. меня интересуют следующие вопросы:

  • Add-in это DLL???

  • Add-in это DLL содержащая COM объект или ActiveX?

  • Какие интерфейсы необходимо реализовать в Add-in?

  • Как зарегистрировать Add-in? (обычно regsvr32 <FileName.dll>)

  • Как из шейпа обратиться к Add-in? (т.е. не просто же в EventDblClick писать выполнение аддона с параметрами, надо же указать где Add-in находится и его GUID где-то должен быть прописан?)

  • Как в Add-in получить переданные параметры? (в дельфя у exe'шников параметры получаются через функцию ParamStr(<NumbrParametr>), в Add-in также только через Command(<NumbrParametr>) ? )

И еще одна маленькая просьба, если у Вас сеть возможность связаться со моной по ISQ, то очень Вас прошу связаться, так общение будет быстрее, я к тому что мне эта инфа горит срочно, т.е. горят сроки на выполнение работы... подробнее в личной переписке... Мой ISQ: 276-801-195
Go to Top of Page

Tumanov

Russia
1198 Posts

Posted - 12/07/2006 :  18:38:16
Понятие шаблон (Template) аналогично Word. Это заготовка документа, рисунка; окружение, служащее основой для создания схожих документов.
То, что я писал выше, относилось к Add-On. Отличия между Add-In и Add-On Вы поняли правильно. Вот только "актуальнее использовать Add-in" - не совсем точно. В разных случаях по-разному. Кроме того, Add-On перестает ругаться, если он подписан или если снижен уровень безопасности, а Add-In не ругается только потому, что его регистрируют при установке.
Важно другое - Add-On вызывается в любое время хоть пользователем через интерфейс, хоть через RunAddon из ShapeSheet произвольного шейпа. Add-In же нельзя вызвать. Он сидит в памяти и реагирует только на события, поэтому из ShapeSheet его просто так не запустишь. (Хотя существует обходная технология с созданием события MarkerEvent через QUEUEMARKEREVENT).
По остальным вопросам в SDK есть отдельная статья "About Microsoft Office Visio Add-ons and COM Add-ins". В частности в ней сказано - "In Visio, the term add-in refers specifically to a COM add-in, a COM object that implements the IDTExtensibility2 interface".
К сожалению, интернет для меня доступен только по вечерам из дома через модем, так что о ISQ можно только мечтать :(
Go to Top of Page

davinchi

Russia
6 Posts

Posted - 12/08/2006 :  00:30:35
А чем технологисески отличается Add-on от Add-in, т.е. различия во внутреннем устройстве, если я правильно понял Add-on содержит СОМ объект, а Add-in содержит ActiveX обект, я прав?
Англиский знаю плохо, поэтому разобраться в SDK - нужно время, которого нет, пожалуйса, если не трудно, объясните коротко саму суть создания аддона, например:
1. создать DLL
2. реализовать в ней COM или ActiveX объект
3. реализовать интерфеис ... (если необходимо)
4. "вот так" обрабатывать события от шейпа
5. "положить файл туда"
6. "вот так" связать шеп с аддоном...
... или ссылочки на эту информацю...
Go to Top of Page

davinchi

Russia
6 Posts

Posted - 12/10/2006 :  23:31:16
Люди HELP!!!
... ну хоть какую-нить информацию или ссылочки на пример, приз
Подскажите как из шейпа обратиться к аддону в DLL???
Go to Top of Page

davinchi

Russia
6 Posts

Posted - 12/10/2006 :  23:37:14
...подскажите где должен лежать аддон в виде exe файла?
Go to Top of Page

immortal

Russia
391 Posts

Posted - 12/18/2006 :  12:52:54  Visit immortal's Homepage
quote:
...подскажите где должен лежать аддон в виде exe файла?

http://www.immortal.vstu.edu.ru/index.php?name=Pages&op=page&pid=16

quote:
Add-in ...


я только делал адд-ин с запуском через кнопки панели и меню, как запускать из шейплиста уже вопрос задавался мной на форуме, ответ отрицательный.

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

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

Tumanov

Russia
1198 Posts

Posted - 12/18/2006 :  13:26:09
Как это отрицательный??
Я же написал: "(Хотя существует обходная технология с созданием события MarkerEvent через QUEUEMARKEREVENT)".
А вот упрощенная проверка такого метода. Только она приводится для макроса, но и в Add-In должна работать:
Запуск Add-In из ShapeSheet
Add-In напрямую из ShapeSheet вызвать нельзя (вызываются только Add-On и макросы). Но Add-In может реагировать на события. Значит если из ShapeSheet сгенерировать событие, то Add-In его поймает и обработает.
Для простоты проверяем сначала на макросах.
Специальное событие для данного случая - MarkerEvent. Его обрабатывает объект Application.
Создаем такой объект и пишем обработчик.

Dim WithEvents Ap As Visio.Application
Sub ttt()
Set Ap = ActivePage.Application
End Sub

Private Sub Ap_MarkerEvent(ByVal app As IVApplication, ByVal SequenceNum As Long, ByVal ContextString As String)
Debug.Print ContextString
End Sub

На листе Visio рисуем прямоугольник и в ячейку EventXFMod прописываем строку
=if(Pinx>2;QUEUEMARKEREVENT("Больше");QUEUEMARKEREVENT("Меньше"))

Теперь перемещение прямоугольника должно привести к формированию той или иной текстовой строки.
В принципе, перемещение можно было отловить и по другому событию, но в данном случае задача - не найти оптимальное решение, а проверить технический прием.
Проверяем. Если теперь подвигать шейп, ничего не происходит (Объект Ap на обрабатывает событий). Выполняем макрос ttt, который заставляет Ap обрабатывать события, и наблюдаем при каждом перемещении шейпа появление строчки в окне Immediate.
Естественно, обработчик события с таким же успехом вместо макроса можно поместить в Add-In.
Go to Top of Page

davinchi

Russia
6 Posts

Posted - 12/18/2006 :  17:31:46
я пишу на Delphi и используюю DLL...
обрабатывать события от меню и конопок вроде понятно как, а как получтить собфтие при обращении к Add-in с помощью RUNADDINWARGS пока безответный вопрос? Если кто-нить просветит буду очень благодарен...
P.S. Есть предположение что у шейапа надо запрашивать какой-то интерфейс событий, а к нему прикручивать процедуру реагирующую на событие, вопрос в имени интерфейса...
Go to Top of Page

Tumanov

Russia
1198 Posts

Posted - 12/18/2006 :  20:25:51
RUNADDINWARGS - не бывает и не будет.
Если Вы работаете с Add-In то можно только реагировать на события. Вместо RUNADDINWARGS нужно сгенерировать событие, которое примет Add-In.
Пример генерации события приведен на несколько строчек выше.
Вы можете и просто написать QUEUEMARKEREVENT() с нужными параметрами без всяких If.
Как установить связь по событиям с Add-In - хорошо расписано в SDK Visio 2003 раздел Event Handling тема AddAdvise.
Единственное, что Вам не подходит, так это то, что код приведен на VBA. Но его только нужно перевести на Delphi. Принципы одинаковые для любого языка.
По смыслу: нужно в dll Add-In создать объект, принимающий уведомления о событиях (обработчик); при старте dll или в обработке события открытия нужного документа передать указатель на этот объект в Visio, создав объект Event с типом MarkerEvent (это visEvtApp+visEvtMarker = &H1100), и ждать.
В нужный момент в шейп-листе сработает QUEUEMARKEREVENT. При этом сгенеритуется событие MarkerEvent. Оно будет отловлено настроенным на него Вашим объектом Event, который тут же уведомит находящийся в dll объект Sink. А там уже заготовлен обработчик :)
(Вообще, надо будет как-нибудь статью с картинками написать... Чувствую, тема непростая...)
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)