Установка связи с сервером
OLE
Чтобы получить доступ к возможностям, предоставляемым приложением-сервером OLE, сначала необходимо создать переменную, на которую мог бы сослаться Excel. Эта переменная называется объектной переменной (object variable), поскольку она описывает объект, а не целое число и не иные (относительно про стые) типы данных. Характерной особенностью объектных переменных является то, что они выступают в качестве компонентов членов приложения или класса (Class), который они представляют. Например, Excel предоставляет метод Evaluate с помощью которого можно вычислять любые математические выражения. К этому методу нельзя обращаться непосредственно, к нему необходимо обратиться через объектную переменную, которая представляет приложение Excel. Иными словами, нельзя использовать оператор:
Excel.Evaluate "Log(499/0 785)" 'WRONG! (Ошибка!)
Сначала необходимо создать объектную переменную например ExcelObj, а затем вызвать метод Evaluate для переменной ExcelObf
ЕхсеlObj.Evaluate "Log (499/0 785)"
Существует две функции позволяющие создавать объектные переменные. Это функция CreateObject(),
позволяющая создать новый экземпляр приложения, на который можно сослаться и функция Get0bject(), с помощью которой можно связаться с экземпляром приложения, уже запущенного на компьютере. Эти функции будут рассмотрены позже.
Примечание
Чтобы предоставить VB-приложению возможность обращаться к серверам автоматизации OLE, необходимо добавить соответствующую ссылку к проекту с помощью диалогового окна Reference, вызываемого по команде References (Ссылки) меню Project (Проект). Чтобы приложение могло воспринимать ссылки на объекты Excel, необходимо в проект добавить элемент "Microsoft Excel 8.0 Object Library", на объекты Word — элемент "Microsoft Word 8.0 Object Library", и на объекты Outlook 98 — элемент "Microsoft Outlook 98 Object Model"
Создание нового экземпляра
Первый метод установления связи с приложением-сервером
OLE состоит в том, чтобы организовать новый экземпляр приложения, воспользовавшись функцией Create0bject():
Set AppObject = CreateObject(Class, ServerName)
Аргумент
Class — это имя класса приложения-сервера, зарегистрированного в реестре (Registry). Имя класса Word - это строка "Word.Application", а имя класса Excel - "Excel.Application".
Второй параметр (необязательный) является именем сетевого сервера, на котором будет создан объект. Если приложение-сервер постоянно находится на другой машине, следует также указать имя машины, на которой будет создано приложение-сервер с именем Class. Если приложение-сервер было установлено на машине с именем "Toolkit", то для создания нового "экземпляра приложения Excel следует воспользоваться следующим оператором:
Set EXLApp = Create0bject ("Excel.Application", "Toolkit")
Установление связи с уже существующим экземпляром приложения
Если приложение, с которым следует установить связь, уже запущено, нет потребности создавать его новый экземпляр. Можно "войти в контакт" с уже запущенным экземпляром приложения и открыть новый документ. Чтобы установить связь с уже выполняющимся экземпляром приложения-сервера, следует воспользоваться функцией Get0bject():
Set AppObject =
GetObject(pathname, class)
Оба параметра являются необязательными, но хотя бы один из них должен быть определен. Параметр pathname — это полный путь и имя файла документа, который будет открыт с помощью приложения-сервера. Второй параметр, class, является именем класса приложения, зарегистрированного в системном реестре (Registry).
Если указывается документ, который необходимо открыть данным приложением, то не следует указывать имя класса (Class) приложения. Например, разработчику не надо дополнительно указывать, что рабочий лист будет обрабатываться приложением Excel: Системе известно, что файлы с расширением XLS обрабатываются Excel, например:
Set EXLApp = Get0b]ect ("С:\sample files\Sales98.xls")
Вызов этой функции приведет к запуску Excel ( если до этого не был запущен ни один экземпляр). А чтобы установить связь с уже запущенным экземпляром Excel, следует следующим оператором вызвать функцию Get0bject():
Set EXLApp = Get0bject(, "Excel.Application")
Во многих ситуациях нет разницы, будет ли запущен новый экземпляр приложения-сервера, или будет установлена связь с уже запущенным экземпляром. Например, чтобы вызывать метод Evaluate нет необходимости запускать новый экземпляр Excel. Если он уже запущен, следует связаться с ним и выполнить с его помощью вычисление математического выражения. После того как это действие будет выполнено, работающий экземпляр Excel вернется в то же состояние, что и прежде. Поэтому, предпочтительнее (с точки зрения эффективности) пытаться устанавливать связь с существующим экземпляром приложения-сервера. И только в том случае, если нет ни одного запущенного экземпляра сервера, следует его запустить В следующем фрагменте программы применяется именно этот способ. Сначала делается попытка установления связи с уже запущенным экземпляром Word. Если Word не работает, то генерируется сообщение об ошибке. Оператор On Error Resume Next предписывает Visual Basic подавлять сообщение об ошибках и продолжать выполнение программы с оператора, следующего за вызвавшим ошибку. Если происходит ошибка, значит, при вызове функции Get0bject() произошел сбой и следует вызвать функцию CreateObject(), чтобы запустить новый экземпляр Word.
Программа 14.8.
Установление связи или запуск Word
On Error Resume Next
Set AppWord = Get0bject ("Word.Application")
If AppWord Is Nothing Then
Set AppWord - CreateObject ("Word.Application")
If AppWord Is Nothing Then
MsgBox "Could not start Word.Application will quit"
'(Word не был запущен. Программа прекращает работу)"
End
End If
End If
Объявление объектных переменных
Объектная переменная, которая описывает приложение-сервер
OLE, может быть объявлена либо как переменная типа Object (Объект), либо как переменная специального типа (например, Excel.Application или Word.Application). Если переменная EXLApp
объявлена как переменная типа Object (Объект), то каждый раз перед вызовом соответствующих свойств или методов Visual Basic должен сначала удостовериться, что вызываемые элементы существуют. Поскольку Object (Объект) — обобщенный тип переменной, который может включать все типы объектов. Visual Basic не знает, какой именно объект описывает объектная переменная во время разработки, и это не позволяет обнаружить синтаксические ошибки во время ввода программы. Например, если было неправильно набрано имя компонента-члена, Visual Basic не сможет обнаружить эту ошибку во время разработки приложения. Так, например, Excel поддерживает метод Evaluate, который позволяет вычислять
математические выражения. Если объявить переменную EXLApp как Object (Объект), а затем попытаться обратиться к ней, чтобы получить доступ к методу Calculate, Visual Basic не сможет определить наличие ошибки.
Если же объявить переменную EXLApp, как Excel Application, Visual Basic не только не будет захватывать никакие ссылки на несуществующие элементы, но также выведет список компонентов-членов в списке, как только будет поставлена точка после имени переменной EXLApp.
Иными словами если объявлять переменные, правильно указывая их тип, то синтаксические ошибки будут определены еще на этапе ввода программы. При этом приложение не будет работать неправильно только лишь из за того, что в имени члена допущена орфографическая ошибка. Даже если опция Member AutoList выключена эти ошибки будут определены во время трансляции.
Другое, гораздо более серьезное, последствие правильного объявления типа объекта — эффективность. Когда Visual Basic обнаруживает выражение, подобное EXLApp Property, он должен сначала удостовериться что указанное свойство существует, затем связаться с приложением сервером, предоставившим объект EXLApp, и активизировать его компонент Property. Компилятор вставит дополнительные операторы, которые организуют связь с приложением, предоставившим объектную переменную, чтобы удостовериться, что предоставляется запрошенный элемент. Неприятной особенностью является то, что эти операторы будут выполняться каждый раз, когда приложение запрашивает компонент объекта EXLApp. Чтобы избежать этой ненужной задержки, следует просто объявить объектную переменную EXLApp, указав соответствующий тип.
Объявление объектных переменных с указанием типа называется ранним связи ванием (early hounding), поскольку Visual Basic может связывать их с объектами, которые они представляют во время проектирования. Объявление объектных переменных без указания типа (просто переменные типа Object) приводит к позднему связыванию (late-bounding) Visual Basic не может связать их со специфическими объектами во время проектирования, что может привести к появлению любых ошибок уже во время выполнения.
Чтобы воспользоваться преимуществом раннего связывания объектных пере менных следует объявить их, указав соответствующий тип. Однако и применение позднего связывания имеет свои достоинства. Иногда тип объекта, описываемого переменной, заранее неизвестен и выход из такой ситуации заключается в объявлении переменной как Object. Например, требуется организовать программное переключение между объектами Form и Printer. Удобный способ организации вывода на любое из устройств (монитор или принтер) заключается в объявлении переменной OutputObject и последующей установки требуемого значения с помощью одного из операторов
Set OutputObject = Printer
Set OutputObject = Screen
Если вызвать метод Print переменной Output Object, то он будет применен к объекту, который был в последний раз присвоен к объектной переменной OutputObject. В ситуациях такого рода переменная OutputObject не может быть ранне связанной.
Доступ к объектам Excel с помощью объектных переменных
Переменная
EXLObject является объектной переменной, которая предоставляет доступ к объектам Excel. Например, для обращения к текущей рабочей книге следует использовать выражение:
EXLObject.ActiveWorkbook
Чтобы обратиться к активному рабочему листу в активной книге, следует воспользоваться выражением:
EXLObject.ActiveWorkbook.ActiveSheet
Объекты, к которым обычно требуется получить доступ на рабочем листе — это ячейки, которые могут быть представлены семейством ячеек
Cells. Чтобы обратиться к первой ячейке второй строки и присвоить ей значение 99, следует воспользоваться следующим выражением:
EXLObject.ActiveWorkbook.ActiveSheet.Cells(2, 1).Value = 99
Свойства и методы, предоставляемые Excel для организации доступа к ячейкам и изменения их содержимого, рассматриваются далее в этой же главе. Следует учесть, что доступ к ним организуется через переменную, возвращаемую функцией Create0b)ect(). Функция Create0bject() так же, как и функция Get0bject(), возвращает ссылку на OLE-сервер. Эта переменная является шлюзом (gateway) к объектной модели (object model), предоставляемой приложением-сервером. Объектная модель представляет иерархию объектов, соответствующих объектам приложение-сервера (например, ячейки и макросы Excel или предложения и словари Word).
В оставшихся параграфах этой главы будут рассматриваться самые основные объекты Word 97, Excel 97 и Outlook 98 (его бета-версия, появившаяся перед выпуском Visual Basic 6). К моменту выхода этой книги, вероятно, станут доступны версии Word и Excel для Windows 98. Впрочем, приводимые примеры должны работать без изменений. Если у читателя возникнут проблемы, то обновленные версии файлов можно найти на сайте издательства Sybex.
Рассмотрение всех объектов, предоставляемых указанными приложениями, вероятно, потребовало бы трех отдельных книг. Поэтому знакомство с ними ограничивается только основными объектами, предоставляемыми приложениями; приводятся примеры, с которыми можно поэкспериментировать. Ознакомившись с этими объектами и используя справку Object Browser, которая содержит список объектов, предоставляемых каждым приложением, разработчик сможет разрабатывать приложения, которые используют услуги приложения-сервера OLE.