![]() |
Форум visio.getbb.ru |
О форумах
Библиотека | Частые вопросы | Литература | Склад материалов Visio Navigator | Blog | Полезные ссылки | О сайте История Visio | Продукты Visio |
Для русскоязычных пользователей Visio. Начинающих и профессионалов. Где взять, как сделать, что купить и т.д. |
Бучацкий И.В.
Пожалуй, начну свою статью с задачи, которая подвигла меня, во-первых, написать Addon для Visio, а во-вторых, как следствие, поделиться накопленным опытом. Очень часто можно увидеть вопросы на форуме, касающиеся написания Addon-ов на Дельфи, но пока ответов не было. Этот пробел автор статьи и решил восполнить.
Задача, которая стояла передо мной, была довольно необычна. Имелся шейп, символизирующий в определенных ситуациях таблицу базы данных. Поэтому необходимо было дать пользователю инструмент, позволяющий ему определить основные характеристики этой таблицы: имя таблицы, описание, поля таблицы, типы полей и т.п. Решить поставленную задачу тривиальными способами не представлялось возможным. Конечно, существует в составе Visio встроенный язык VBA (Visual Basic for application), но его возможности достаточно ограничены, например, в части доступных визуальных компонентов. Поэтому было принято решение искать другие пути. В результате не слишком продолжительных изысканий оно было найдено. Суть его заключалась в написании с помощью Delphi 6 программы-редактора таблицы базы данных и использования его Visio в качестве Addon-а.
Теперь несколько слов об Addon-ах. Информации по этой теме не так много, в основном в справочном руководстве. Addon – написанное пользователем, т.е. нами с вами, приложение. Соответственно, Addon-ы бывают двух типов:
Главное отличие Addon-ов в виде “.vsl” файла по сравнению с другим типом, состоит в том, что библиотека подгружается внутрь процесса Visio и работает как его составная часть, что сказывается, в первую очередь, на скорости работы. В случае же обычного приложения, Addon работает как отдельная программа с вытекающими из этого недостатками: более низкая скорость работы, дополнительный расход памяти. Addon-ы первого типа, следуя справочному руководству, пишутся на языке С++, второго же типа на любом языке программирования, поддерживающим серверы автоматизации, в частности Delphi6. В этой статье описано создание Addon-а в виде exe-файла с помощью Borland Delphi 6.
Процесс создания Addon-а можно разделить на три независимых этапа:
Пример, который идет со статьей содержит следующие файлы:
Чтобы запустить Addon надо: во-первых, подключить Addon (о способах подключения см. ниже); во-вторых, создать новый документ, подключить к нему трафарет “DSample.vss” : File => Shapes => Open Stencils; в-третьих, перетащить Object с открытого трафарета на лист; и наконец, щелкнуть правой клавишей мыши на шейпе и выбрать в контекстном меню “Редактор таблицы БД”.
Рис 1. Окно программы DBEdit (Addon)
Написание Addon-а на Delphi 6. Эта среда разработки была выбрана по двум объективным причинам: поддержка серверов автоматизации и хорошее знание автора данного языка программирования. Написать Addon на другом языке будет ничуть не сложнее. К статье прилагается полностью рабочий пример Addon-а с исходными текстами с комментариями. Дальше в статье лишь кратко будут объяснены ключевые моменты.
SVisioSTR = 'Visio.Application'; |
Строка-индификатор приложения Visio.
private |
FVisio: Variant; ссылка на приложение Visio |
FAShape: Variant; ссылка на редактируемый шейп |
Переменные типа Variant, с помощью которого можно вызывать методы сервера (Visio) напрямую за счет поддержки интерфейса IDispatch..
procedure TForm1.FormCreate(Sender: TObject); |
var |
Result: HRESULT; |
Unknown: IUnknown; |
WGuid: TGUID; |
begin |
WGuid := StringToGUID(SVisioSTR); |
Result := GetActiveObject(WGuid,nil,Unknown); |
if Result = MK_E_UNAVAILABLE then |
FVisio := CreateOleObject(SVisioSTR) |
else |
FVisio := GetActiveOleObject(SVisioSTR); |
FAShape := FVisio.ActiveWindow.Selection(1); |
В этом блоке программа получает глобальный идентификатор интерфейса Visio, а потом пытается подключиться к серверу автоматизации. Если Visio запущен, то подключается к работающей версии. После этого получает ссылку на активный шейп.
procedure TForm1.FormDestroy(Sender: TObject); |
begin |
FVisio := Unassigned; |
end; |
При закрытии Addon-а надо обязательно обнулить ссылку с сервером автоматизации !
S := FAShape.CellsSRC(242, 0, 0).FormulaU; |
Получаем строку с данными из активного шейпа.
FAShape.CellsSRC(242, 0, 0).FormulaU := S; |
Соотвественно, после редактирования записываем обратно сформированную строку с данными в активный шейп.
Подключение Addon-а к Visio. Способов, подключить Addon в Visio несколько. Первый, наименее трудоемкий, заключается в том, что в настройках Visio надо указать папку, в которой лежит разработанный Addon. Делается это через главное меню: Visio => Tools => Options => Advanced => File Paths => Addons. Второй способ, программный, состоит в том, чтобы добавить путь к своему Addon-у в коллекцию Addon-ов объекта Application, т.е. Visio. Пример второго способа подключения Addon-а есть в Microsoft Office Visio SDK 2003.
Запуск Addon-а из Visio. Запустить подключенный Addon можно тоже несколькими способами. Все они прекрасно описаны в Microsoft Office Visio SDK 2003. Самый простой способ реализуется через главное меню: Tools => Addons => выбираем наш Addon. Для программного запуска Addon можно воспользоваться двумя функциями: RUNADDON и RUNADDONWARGS. Первая просто запускает Addon с указанным в скобках именем. Вторая же позволяет запустить Addon и передать ему какую-либо информацию в виде параметров командной строки. В прилагаемом примере используется функция RUNADDON. Описана она в Row_2 секции Actions шейпа (см. ShapeSheet) следующим образом:
=RUNADDON("DBEdit") |
В качестве единственного аргумента функции указано имя Addon-а.
И последний важный момент. В качестве места, в котором можно хранить данные шейпа, т.е. данные таблицы выбран новый ряд в секции User-difined cells DBData. Это легко можно проверить следующим способом. Отредактировать с помощью Addon-а объект, а после с помощью DBData посмотреть значение ячейки User.DBData. Все данные помещаются туда в отформатированном виде.
Все исходные материалы обсуждаемого примера можно взять для подробного рассмотрения в rar-архиве. Объем архива 471 Кб.