BiVANT  Книги    К началу главы

В.А. Биллиг
Средства разработки
    VBA -
программиста
Офисное программирование. Том 1
"Русская редакция", 2001 г.

Глава 8(7)

Программное добавление и удаление ссылок

Теперь я хочу рассмотреть еще один пример, являющийся ответом на следующий вопрос одного из моих читателей:

Как программно добавляются и удаляются ссылки коллекции References?

Задача Сергея Шершнева (так зовут моего читателя) состояла в том, что, работая с системой документов, ему в зависимости от выбора пользователя необходимо было подключать программные проекты тех или иных документов. Чтобы получить доступ в главном документе к процедурам подключенных проектов, ему необходимо было предварительно программно установить ссылки на подключаемые проекты. Не буду вдаваться во все тонкости его проблем и рассмотрю лишь две конкретные задачи, ¾ как программно включить (выключить) ссылку на программный проект и как вызывать процедуры подключенных проектов.

Для ответа на эти вопросы рассмотрим следующую ситуацию. Пусть у нас есть главный документ DocOne и два других документа DocTwo и DocThree. Все три документа обладают программными проектами. Открыв главный документ, мы интересуемся предпочтениями пользователя и, в зависимости от его выбора подключаем документ DocTwo или DocThree, вызывая затем соответствующие процедуры подключенного документа. По ходу дела необходимо также уметь отключить ранее подключенный документ. Рассмотрим одно из возможных решений этой задачи.

Прежде, чем перейти к непосредственному решению задачи, сделаю одно замечание. Решение задачи начинается с выяснения предпочтений пользователя. Типичное решение задачи о выборе предпочтений пользователя состоит в том, что ему предъявляется форма, содержащая список всех допустимых значений, задающих предпочтения. Работая с этим списком пользователь формирует множество своих предпочтений. Об организации корректной работы со списками в формах я рассказывал достаточно подробно, например, в [1, стр. 520 - 533], [2, стр. 60 - 65]. Сейчас я ограничусь более простой процедурой, учитывающей мой частный случай работы с документами:

Public Sub ChooseProject(NoF As String, NoP As String)
  Const Msg = "Введите имя файла, хранящего документ и его программный проект!"
  NoF = InputBox(Msg, "Projects", "DocTwo.doc")
  Const Msg1 = "Введите имя проекта, хранящегося в документе!"
 
NoP = InputBox(Msg1, "Projects", "DocTwo")
End Sub    

Заметьте, для работы со ссылками, - их программного подключения и отключения необходимо знать имя файла, в котором хранится сам подключаемый документ и имя проекта этого документа. В моем примере я проектам во всех документах давал имя, совпадающее с именем документа. Это нашло отражение в установках, задаваемых по умолчанию в функции InputBox.

Вызов функции ChooseProject позволяет установить предпочтения пользователя. Зная их, можно включить соответствующую ссылку на документ. Вот как это делается:

Public Sub CreateRef()
  'Создание ссылки на проект с именем NoP, хранящийся в файле с именем NoF
  Dim MyPath As String
  Dim MyRef As Object
  Dim NameOfProject As String
  Dim NameOfFile As String
 
  'Выбор добавляемого проекта
  Call ChooseProject(NameOfFile, NameOfProject)
 
  'Запоминание глобальных переменных программы
  NoF = NameOfFile
  NoP = NameOfProject
  With ActiveDocument
     MyPath = .Path
      'Вставка ссылки
     If Not ExistRef(NameOfProject, MyRef) Then
       .VBProject.References.AddFromFile MyPath & "\" & NameOfFile
     End If
     CallProcFromProject
     Debug.Print "Имя файла -", NoF, "Имя проекта -", NoP
  End With
End Sub

Как видите, для подключения ссылки я использую метод AddFromFile коллекции References. В качестве параметра необходимо задать полный путь к файлу, содержащему документ с подключаемым проектом. Имя проекта при этом указывать не нужно, - оно автоматически будет найдено в документе. Обратите внимание на использование переменной MyPath, задающей путь к активному документу. Я предполагаю, что активным является мой главный документ. Второе, более сильное предположение состоит в том, что все подключаемые документы находятся в одном каталоге с главным. Это позволяет безболезненно переносить все документы на другой компьютер и размещать их в любом каталоге.

Заметьте также, что прежде, чем добавить ссылку, я проверяю возможность существования ее в коллекции ссылок, чтобы исключить ее повторную запись. Булева процедура ExistRef решает эту задачу. Первый параметр NameOfProject является входным и задает имя проекта, ссылку на который мы ищем. Второй параметр – MyRef является выходным и задает объект класса Reference, найденную ссылку в случае успеха поиска. Вот текст этой функции:

Public Function ExistRef(Name As String, Refery As Object) As Boolean
  '
Определяет наличие ссылки с именем Name в коллекции References
  '
Возвращает ссылку при ее обнаружении
  Dim MyRef As Object
  Set Refery = Nothing
  ExistRef = False
  For Each MyRef In ActiveDocument.VBProject.References
     If MyRef.Name = Name Then
       Set Refery = MyRef
       ExistRef = True
       Exit For
     End If
  Next MyRef
End Function

Программно удалить ссылку также просто, как и ее добавить. Вот текст соответствующей процедуры:

Public Sub RemoveRef()
  '
Удаление ссылки на проект с именем NoP
  Dim MyRef As Object
  Dim NameOfProject As String
  Dim NameOfFile As String
  '
Выбор удаляемого проекта
   Call ChooseProject(NameOfFile, NameOfProject)
  '
Удаление ссылки
  If ExistRef(NameOfProject, MyRef) Then
     ActiveDocument.VBProject.References.Remove MyRef
  End If
End Sub

Для удаления ссылки я использую метод Remove коллекции References. В качестве параметра этому методу необходимо передать объект, задающий удаляемую ссылку. К счастью у нас уже написана функция ExistRef, которая по имени удаляемого проекта вернет ссылку на него. Поэтому все проблемы с удалением ссылки тем самым решены.

     Назад                                             Вперед

Hosted by uCoz