Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Основы_СУБД_Access.doc
Скачиваний:
3
Добавлен:
01.03.2025
Размер:
2.17 Mб
Скачать

2.3.Особенности раннего и позднего связывания

При создании приложений часто возникает необходимость организации взаимодействия нескольких офисных программ: например, данные хранятся и обрабатываются в электронных таблицах Excel, но для подготовки отчетов используются шаблоны документов Word. В этом случае одно из приложений становится клиентом другого. В данном случае в качестве клиента выступает Excel, который запрашивает обслуживание у Word, являющегося сервером. Технология связывания рассматривалась выше. Однако при переносе автоматизированных документов, приложений, созданных на основе MS Office, на другой компьютер могут возникнуть проблемы несовместимости версий программ. Эти проблемы рассматриваются в данной главе.

2.3.1.Задача связывания

Для взаимодействия клиента и сервера, то есть для того, чтобы клиент мог использовать свойства и методы сервера, серверный объект должен быть связан с переменной на стороне клиента. Связывание определяет, как клиент соединяется с конкретным объектом-сервером. В VBA форма связывания в первую очередь определяется тем, как разработчик приложения-клиента объявляет объектные переменные.

При работе с объектами Automation может быть использовано раннее и позднее связывание. Раннее связывание подразумевает, что во время компиляции (в случае VBA заранее, так как эта среда является интерпретирующей) заранее известно, какой интерфейс будет использован для доступа к объектной переменной. При позднем связывании до создания объекта о нем ничего не известно.

2.3.2.Раннее связывание

При раннем связывании тип объектной переменной явно указывается при ее объявлении. Например, в следующей строке объявляется переменная, которая может содержать указатель только на объект Microsoft Excel Application:

Dim ExlApp As Excel.Application

При попытке сохранить в такой переменной ссылку на объект другого типа произойдет ошибка. Если используемый объект принадлежит другому приложению или внешнему компоненту (например, используется приложение Word из Excel), то предварительно необходимо установить ссылку на библиотеку типов используемого компонента.

Использование раннего связывания имеет два основных преимущества: повышение производительности приложения во время выполнения и возможность интеллектуальной подсказки синтаксиса обращения к свойствам и методам используемого объекта. Первое преимущество достигается за счет оптимизации обращения к объекту, а второе – за счет использования информации из библиотеки типов.

Однако ранее связывание имеет один существенный недостаток. Так как тип переменной задается явно, то переменная не может содержать ссылку ни на какой другой тип. Данный факт приводит к невозможности разработки программных проектов документов, работающих на различных версиях Microsoft Office, так как каждая из версий Office имеет свою версию библиотеки типов, хотя и при совпадении имен объектов.

Продемонстрируем изложенную проблему на примере – разработаем рабочую книгу Excel в Office 2003, в программном проекте которой добавим процедуру вызова функциональности Word соответствующей версии. Для этого установим в проекте ссылку на библиотеку объектов (рис. 42) и заметим, что версия библиотеки имеет версию 11.

Затем введем приведенный ниже прграммный код:

Public Sub TestLinking()

Dim WordApp As New Word.Application Dim Doc As Word.Document WordApp.Visible = True Set Doc = WordApp.Documents.Add Doc.Range.Text = UCase("Text in Document.")

End Sub

Рис. 42. Диалоговое окно установки ссылок

Рис. 43. Сообщение об ошибке при смене версии

Рис. 44. Настройка (изменение) ссылок на библиотеки

При попытке выполнения макроса в Excel 97 выдается сообщение об ошибке (рис. 43). При просмотре ссылок проекта указывается, что библиотека Microsoft Word 11.0 Object Library не найдена (рис. 44). Толька при удалении ссылки на отсутствующую библиотеку и установки ссылки на Microsoft Word 8.0 Object Library программа выполняется без ошибок.