В этой статье я объясню основы создания собственных Add-In (расширителей среды разработки) библиотек для Visual Basic без использования ActiveX Wizzard.
» Введение
В этой статье я объясню основы создания собственных Add-In (расширителей среды разработки) библиотек для Visual Basic без использования ActiveX Wizzard. Для начала, что такое Add-In? Это инструмент, который вы создаёте, используя объекты и семейства модели расширения для настройки программного окружения Visual Basic. Одной из целью Add-In является автоматизация какого-либо сложного процесса в разработке приложения. Есть несколько типов Add-In: просто расширители, мастера, утилиты и конструкторы.
• Мастер - специальный тип Add-In, который позволяет пользователю производить задание шаг за шагом. Мастеры Microsoft состоят из нескольких форм, каждая из которых содержит изображение в верхнем левом углу, лейбл с инструкциями и область с другими элементами (список, командные кнопки).
• Утилита - вид дополнения к разработке приложений, но это не означает, что он должен быть связан с Visual Basic IDE. Примером такой утилиты служит VisData.
• Конструктор - вид Add-In, который предоставляет возможность просматривать или изменять свойства какого - нибудь элемента.
» Создание простого Add-In
Создание расширителя в основном состоит из создания модуля класса и компилирования проекта в ActiveX DLL.
1. В меню Файл выберитеНовый Проект. В появившемся окне выберите ActiveX DLL.
2. Далее кликните меню Проект » Ссылки, и выберите Microsoft Visual Basic Extensibility и Microsoft Office 8.0 Object Library. Это даст вам доступ к объектам и семействам расширителя. У нас появился новый ActiveX DLL проект и модуль класса (назовите проект "MyAddin", модуль класса "PrjectProps").
3. Теперь добавим в наш проект обычный модуль ("mdlMain") и впишем в него следующий код:
Declare Function WritePrivateProfileString Lib "kernel32" Alias "WritePrivateProfileStringA" (ByVal AppName As String, ByVal KeyName As String, ByVal keydefault As String, ByVal FileName As String) As Long
Public Sub AddinToINI() Dim RetVal As Long RetVal = WritePrivateProfileString("Add-Ins32", "MyAddin.ProjectProps", "0", "VBADDIN.INI") Debug.Print "...ok" End Sub
Функция AddinToINI создаёт ссылку на наш Add-In проект, прописывая данные в файле инициализации расширителей VB. Это необходимо для того, чтобы Visual Basic знал, что в системе есть такой Add-In. Тут может возникнуть проблема при запуске проекта на другой машине - он просто не будет виден в списке Add-In менеджера. Решение этой проблемы состоит в создании установочной программы, даже самой простой, которая скопирует Add-In в систему и пропишет его в INI файл.
4. Перейдём к модулю класса, установим его свойство Instancing = MultiUse и добавим следующий код:
Implements IDTExtensibility
Это добавит ссылку на объект IDTExtensibility. Теперь модулю класса будут доступны процедуры: OnConnection, OnDisconnection, OnStartupComplete и OnAddInsUpdate - добавьте их в свой код. Так как для нормальной работы Add-In эти процедуры должны быть обязательно объявлены, то добавьте в ненужные из них блок комментария, чтобы они не были удалены при компиляции.
5. Добавим пару строк кода в процедуры:
Private Sub IDTExtensibility_OnConnection(ByVal VBInst As Object, ByVal ConnectMode As VBIDE.vbext_ConnectMode, ByVal AddInInst As VBIDE.AddIn, custom() As Variant) MsgBox "Add-In добавлен." End Sub
Private Sub IDTExtensibility_OnDisconnection(ByVal RemoveMode As VBIDE.vbext_DisconnectMode, custom() As Variant) MsgBox "Add-In удалён." End Sub
Private Sub IDTExtensibility_OnStartupComplete(custom() As Variant) 'on startup End Sub
Private Sub IDTExtensibility_OnAddInsUpdate(custom() As Variant) 'on update End Sub
6. Сохраните проект и в окне отладчика (Debug, Immediate Window) введите функцию AddinToINI и нажмите Ввод (наш проект теперь прописан в INI файл), скомпилируйте Add-In в MyAddin.dll.
7. Откройте окно Менеджера Расширений (Add-In Manager). В нём вы увидете строку MyAddin.ProjectProps, дважды щёлкните по ней и нажмите OK. Если вы правильно следовали инструкциям, то у вас появится сообщение: "Add-In добавлен", - что и будет сделано. Откройте менеджер и ещё раз дважды щёлкните по вашему Add-In, и он будет отключён.
» Использование объекта CommandBar
Для того чтобы пользователь смог вызвать Add-In, в меню или на панели управления должен быть специальный значок. Давайте попробуем его создать.
1. Для этого нам необходимо объявить несколько переменных в модуле класса:
Dim Inst As VBE 'экземпляр VBE Dim cmdButton As CommandBarButton 'кнопка панели управления Dim cmdBarCtrl As CommandBar 'панель управления Dim WithEvents cmdEvents As CommandBarEvents 'объект для ловли событий панели управления
2. Добавьте в событие IDTExtensibility_OnConnection следующий код:
If ConnectMode <> vbext_cm_External Then 'проверяем, является ли подключение нашего Add-In к Visual Basic Set Inst = VBInst 'устанавливаем экземпляр VB (и это единственный способ!) Set cmdBarCtrl = Inst.CommandBars("Add-Ins") 'устанавливаем переменную cmdBarCtrl к панели (меню) Add-Ins Set cmdButton = cmdBarCtrl.Controls.Add(1) 'добавляем на панель кнопку cmdButton.Caption = "Project Properties" 'устанавливаем её название Clipboard.SetData LoadResPicture(101, vbResBitmap), vbCFBitmap 'копируем картинку в буфер, заранее помещённую в файл ресурса cmdButton.PasteFace 'устанавливаем эту картинку для кнопки Set cmdEvents = Inst.Events.CommandBarEvents(cmdButton) 'для того, чтобы ловить события нашей кнопки End If
3. Не забудем освободить переменные и удалить кнопку при выгрузке Add-In, добавим код в событие IDTExtensibility_OnDisconnection:
cmdButton.Delete Set cmdBarCtrl = Nothing Set cmdEvents = Nothing Set Inst = Nothing
4. В событие cmdEvents_Click добавим тестовое сообщение:
MsgBox "Кто - то кликнул по кнопке!"
5. Скомпилируйте проект и протестируйте его - подключите через Менеджер Расширений. В меню Add-Ins (Расширения) должен появиться пункт Project Properties, кликните по нему. Если всё было правильно выполнено, то появится сообщение.
» Взаимодействие с Visual Basic
И так, завершим разработку нашего Add-In. Что же он будет делать? Да просто показывать информацию о текущем проекте VB, по этому он и называется ProjectProps. Добавьте в ваш проект новую форму с именем frmReport и разместите на ней следующие необходимые элементы: лейблы lblInf и txtInf (с индексами от 0 до 5) и командную кнопку cmdOK.
В событие cmdOK_Click пропишите Unload Me. Перейдём в модуль класса - сердце Add-In. Объявим переменную: Dim vbPrj As VBProject, в событии IDTExtensibility_OnDisconnection освободим её значение: Set vbPrj = Nothing. Теперь добавим блок кода в событие нажатия кнопки (cmdEvents_Click):
If Inst.VBProjects.Count > 0 Then 'проверим, есть ли вообще активные проекты? Set vbPrj = Inst.ActiveVBProject 'устанавливаем активный проект frmReport.txtInf(0) = vbPrj.Name 'показываем его имя frmReport.txtInf(1) = vbPrj.Description 'описание frmReport.txtInf(2) = vbPrj.FileName 'имя файла
Select Case vbPrj.Type 'определяем тип проекта Case vbext_pt_ActiveXControl frmReport.txtInf(3) = "ActiveX Элемент" Case vbext_pt_ActiveXDll frmReport.txtInf(3) = "ActiveX DLL" Case vbext_pt_ActiveXExe frmReport.txtInf(3) = "ActiveX EXE" Case vbext_pt_StandardExe frmReport.txtInf(3) = "Стандартный EXE" End Select
frmReport.txtInf(4) = vbPrj.References.Count 'подсчитываем кол-во ссылок на библиотеки... frmReport.txtInf(5) = vbPrj.VBComponents.Count '...и ActiveX элементы
frmReport.Show vbModal 'показываем окно Else MsgBox "В Visual Basic нет активных проектов.", vbExclamation, "Ошибка" End If
Вот всё и готово! Компилируем ещё раз и подключаем к VB. Ну, как? работает?
» Заключение
Если вас не устраивает имя Add-In (MyAddin.ProjectProps) в Менеджере Расширений, тогда заходим в Браузер Объектов (Object Browser) и находим наш класс - ProjectProps. Затем кликаем по нему правой кнопкой и выбираем пункт Свойства (Properties) и вводим описание. Вот и всё - создание простейшего Add-In завершено.