Для русскоязычных пользователей Visio. Начинающих и профессионалов. Где взять, как сделать, что купить и т.д.

Создание Addon-ов в Borland Delphi 6 для Microsoft Visio 2003

Бучацкий И.В.

Пожалуй, начну свою статью с задачи, которая подвигла меня, во-первых, написать Addon для Visio, а во-вторых, как следствие, поделиться накопленным опытом. Очень часто можно увидеть вопросы на форуме, касающиеся написания Addon-ов на Дельфи, но пока ответов не было. Этот пробел автор статьи и решил восполнить.

Задача, которая стояла передо мной, была довольно необычна. Имелся шейп, символизирующий в определенных ситуациях таблицу базы данных. Поэтому необходимо было дать пользователю инструмент, позволяющий ему определить основные характеристики этой таблицы: имя таблицы, описание, поля таблицы, типы полей и т.п. Решить поставленную задачу тривиальными способами не представлялось возможным. Конечно, существует в составе Visio встроенный язык VBA (Visual Basic for application), но его возможности достаточно ограничены, например, в части доступных визуальных компонентов. Поэтому было принято решение искать другие пути. В результате не слишком продолжительных изысканий оно было найдено. Суть его заключалась в написании с помощью Delphi 6 программы-редактора таблицы базы данных и использования его Visio в качестве Addon-а.

Теперь несколько слов об Addon-ах. Информации по этой теме не так много, в основном в справочном руководстве. Addon – написанное пользователем, т.е. нами с вами, приложение. Соответственно, Addon-ы бывают двух типов:

  • в виде “.vsl” файла, который представляет собой стандартную динамическую библиотеку (DLL) Windows;
  • в виде “.exe” файла, т.е. обычного приложения.

Главное отличие Addon-ов в виде “.vsl” файла по сравнению с другим типом, состоит в том, что библиотека подгружается внутрь процесса Visio и работает как его составная часть, что сказывается, в первую очередь, на скорости работы. В случае же обычного приложения, Addon работает как отдельная программа с вытекающими из этого недостатками: более низкая скорость работы, дополнительный расход памяти. Addon-ы первого типа, следуя справочному руководству, пишутся на языке С++, второго же типа на любом языке программирования, поддерживающим серверы автоматизации, в частности Delphi6. В этой статье описано создание Addon-а в виде exe-файла с помощью Borland Delphi 6.

Процесс создания Addon-а можно разделить на три независимых этапа:

  • написание Addon-а или программы на Delphi, реализирующей всю функциональность редактора;
  • подключение Addon-а к Visio;
  • и последний этап - запуск Addon-а из Visio.

Пример, который идет со статьей содержит следующие файлы:

  • DBEdit.exe - сам Addon вместе с исходными текстами (DBEdit*, Unit_Field.*, Unit_Main.*);
  • DSample.vss - трафарет, содержащий шейп Object, из которого вызывается в Visio 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 Кб.


Контакты: Туманов Геннадий Евгеньевич   gCroc@yandex.ru