Базы данных. Access. Взаимодействие приложений. Часть Использование метода автоматизации ActiveX. По материалам книги Стивена Форта, Тома Хоуна и Джеймса Релстона Microsoft Access 2000 Development
Скачать 1.54 Mb.
|
Access. Взаимодействие приложений. Часть 1. Использование метода автоматизации ActiveX. По материалам книги Стивена Форта, Тома Хоуна и Джеймса Релстона «Microsoft Access 2000 Development» С каждым днем повышается уровень требований к разработчикам, занимающимся оперативным созданием сложных приложений и их интеграцией с другим программным обеспечением. К счастью, с использованием метода автоматизации ActiveX (прежнее название — OLE-автоматизация) разные приложения могут работать вместе, решая ту или иную программную задачу. Автоматизация значительно сокращает время разработки, поскольку, вместо того чтобы создавать какое-либо новое средство, разработчики могут интегрировать и использовать другое программное обеспечение, в котором подобное инструментальное средство уже существует. В данной главе изложены принципы и методы автоматизации ActiveX. Подробное описание использования метода автоматизации ActiveX для интеграции Access с другими программами Microsoft Office приводится во второй части статьи. Что такое автоматизация ActiveX Технология ActiveX основывается на модели компонентных объектов (СОМ — Component Object Model) компании Microsoft. Автоматизация ActiveX позволяет программам взаимодействовать друг с другом. С помощью автоматизации одна программа может получать доступ и совершать действия над объектами другой программы извне данного приложения. В качестве примера использования метода автоматизации можно привести печать писем или отчетов в Microsoft Word из Microsoft Access. Для чего используется метод автоматизации Использование метода автоматизации представляет собой эффективный способ построения и расширения возможностей приложений. Автоматизация может существенно сократить время, затрачиваемое на разработку, поскольку, вместо того чтобы создавать и проверять какое-либо инструментальное средство "с нуля", можно "позаимствовать" функциональные свойства другого приложения. Сегодня не существует причин для создания собственного редактора текстов или электронных таблиц в приложении Access. Гораздо проще воспользоваться методом автоматизации и некоторыми другими методами, описанными в данной главе, чтобы обеспечить автоматическое выполнение требуемых действий с помощью Word или Excel. Это позволяет разработчику сосредоточиться на деталях, необходимых для работы данного приложения, которые не могут быть обеспечены другими программами. Отличия сервера автоматизации от клиента автоматизации При взаимодействии двух приложений между собой важно понимать, какое приложение открывает свои объекты, а какое — их использует. Сервер автоматизации — это приложение, которое открывает объекты Automation. Клиент автоматизации (иногда называемый контроллером автоматизации) — это приложение, которое решает, какие объекты использовать и когда. Определение требований к ресурсам автоматизации Поскольку процесс автоматизации относится к ситуации, когда одно приложение управляет другим, при этом открыты как минимум две программы. Для одновременной работы нескольких приложений требуются дополнительные ресурсы памяти и процессора. Решение о том, какие именно ресурсы необходимы для автоматизации из Access в Word, например, может быть чисто субъективным. То, что одному пользователю может показаться удовлетворительным, второму покажется неприемлемым. Минимально допустимыми с точки зрения производительности считаются процессор Pentium II и объем ОЗУ, равный 24 Мб. Несмотря на то что использование процессора Pentium значительно повышает производительность, объем ОЗУ в данном случае более важен. Если производительность неудовлетворительна, вначале следует увеличить объем ОЗУ и лишь затем менять процессор. Общие принципы работы Автоматизация состоит из трех этапов: • Получение объекта Automation. Необходимо либо создать новый объект, либо установить ссылку на уже существующий. • Использование объекта Automation в соответствии с требованиями приложения. • Освобождение объекта Automation. Например, если необходимо распечатать письма или отчеты в Word из Access, первым шагом станет создание или установка ссылки на приложение Word. Далее используются объекты, свойства и методы Word (такие, как открытие, редактирование либо печать документа). Последний шаг — освобождение приложения Word. РИСУНОК 1. Диалоговое окно References. Создание и установка ссылки на другое приложение Для автоматизации с использованием другого приложения необходимо установить ссылку на это приложение, создав объектную переменную и присвоив ее данному приложению. Установка ссылки на другое приложение В процессе автоматизации происходит взаимодействие или использование приложения вне Microsoft Access. В случае использования приложения или компонента вне Access необходимо установить ссылку на данное приложение. Для этого следует перейти в редактор Visual Basic и выбрать команды меню Tools | References (Сервис | Ссылки). Отображается диалоговое окно Reference (Ссылки) со списком библиотек типов, программ, библиотек DLL и элементов управления ActiveX (рис. 1). Необходимо установить ссылку на приложение, которое будет автоматизировано. Например, для установки ссылки на Word 2000 следует установить флажок рядом с Microsoft Word 9.0 Object Library. СОВЕТ Если нужный пункт, на который необходимо установить ссылку, отсутствует s диалоговом окне References, щелкните на кнопке Browse (Обзор), чтобы отыскать приложение в файловой системе. После установки ссылки на другое приложение можно просматривать и использовать его объекты, свойства и методы. Просмотр объектов, свойств и методов Прежде чем перейти к использованию объектов другого приложения, полезно ознакомиться с некоторыми основными сведениями. Важно понимать термины "объект", "свойства" и "методы", иначе оставшаяся часть главы просто не будет иметь смысла. Объект — это элемент, который можно запрограммировать, контролировать и над которым можно производить какие-либо действия. Объекты Access включают формы, текстовые поля, кнопки команд и др. При использовании автоматизации другие приложения и их объекты могут быть запрограммированы; ими можно манипулировать из Access. Microsoft Office содержит более 500 объектов, которыми можно манипулировать, управлять и которые можно программировать. Например, Word содержит объект Document, a Excel — объект Workbook. Свойство — это характеристика объекта. Свойство можно описать как прилагательное, поскольку оно описывает или характеризует объект. Свойства текстового поля в Access включают Name (Имя), Visible (Отображение), Forecolor (Цвет переднего плана) и др. При использовании объектов соответствующих приложений свойствами данных объектов можно манипулировать, применяя метод автоматизации. Например, как и форма Access, приложения Word или Excel можно отображать либо не отображать. Большинство свойств данного объекта можно и установить, и просто считать. Метод — это действие, которое может быть осуществлено над объектом. Метод можно рассматривать как глагол. Например, Close является методом формы Access. Примером метода Excel служит метод Quit для закрытия приложения Excel. Представление об объектных моделях При автоматизации с использованием другого приложения полезно ознакомиться с его объектной моделью, чтобы понять, какие объекты доступны для работы. Объектная модель — это представление (в общей форме) объектов приложения. С помощью объектной модели можно легко и быстро определить, какими объектами приложения можно манипулировать и какие из них можно контролировать и программировать. Объектные модели для различных приложений описаны в файлах системы помощи. Объектные модели программ Office 2000 приведены во второй части статьи. Использование браузера объектов Еще один способ быстрого определения доступных объектов — использование браузера объектов. Преимущества браузера объектов состоят в том, что он включает свойства, методы и события, а также содержит соответствующие ссылки на интерактивную справку. Браузер объектов — полезный инструмент для быстрого поиска и ознакомления с различными объектами приложения. Для использования браузера объектов необходимо в редакторе Visual Basic выбрать в меню команду View | Object Browser (Вид | Браузер объектов) или нажать клавишу F2 (рис. 2). РИСУНОК 2. Браузер объектов, отображающий объекты MicrosoftWord. При первом открытии браузера объектов полю со списком в верхнем левом углу будет присвоено значение All Libraries (Все библиотеки). При наличии этой установки браузер объектов отображает все объекты для всех библиотек, на которые установлены ссылки. Первым шагом может стать выбор приложения в поле со списком для требуемых объектов. Например, если выбран Word, будут показаны только объекты Word. Другое поле со списком можно использовать для указания отдельного пункта. Например, если необходимо найти окно сообщений во всех библиотеках, следует выбрать в верхнем поле со списком значение All Libraries, а в нижнем ввести MsgBox и щелкнуть на пиктограмме с биноклем (рис. 3). РИСУНОК 3. Поиск MsgBox в браузере объектов. Нижняя левая панель браузера объектов озаглавлена Classes (Классы). Список классов отображает доступные типы объектов выбранной библиотеки типов. При выборе пункта в списке классов в списке Members of (Члены) отображаются свойства, методы и события. Нижняя правая панель, озаглавленная Members (Члены), отображает пункты, относящиеся к данному классу, выбранному в левой панели. Например, при выборе объекта приложения правая панель членов отображает все свойства, методы и события объектов приложения. Список Members Of отображает свойства, методы, события и константы, соответствующие выбранному в списке классов объекту. Откуда браузер объектов получает информацию об объектах, свойствах и методах? Большинство приложений, существующих сегодня на рынке, содержат файл библиотеки типов, в котором хранится информация об объектах, свойствах, методах и константах приложения. Браузер объектов отображает информацию из библиотеки типов. Файлы библиотек типов обычно имеют расширение .TLB или .OLB. СОВЕТ По умолчанию списки в панелях Classes (Классы) и Members (Члены) отсортированы в Алфавитном порядке. Можно щелкнуть правой кнопкой на панелях и выбрать в контекстном меню команду Group Members (Члены группы). Список будет отсортирован заново, при этом сводятся воедино все свойства, методы и события. Элементы каждого свойства, метода и события сортируются в алфавитном порядке. В нижней части браузера объектов показан синтаксис для выбранного пункта. Например, при выборе объекта Access Application и выборе Dlookup в нижней части браузера объектов отображается соответствующий синтаксис. Более подробную информацию об этом можно найти в контекстной справке. Создание объектной переменной Переменная — это место, выделенное в памяти для хранения или выборки информации. Разработчики, без сомнения, обладают громадным опытом использования простых переменных, таких как строки и переменные целого типа. Ниже приведены примеры объявления и использования двух простых переменных: Dim strMame as String Dim I as integer StrName = "Bob" I = 10 В данном примере переменные включают специфический тип данных — информация хранится и может быть считана по необходимости. Переменные Object объявляются с помощью выражения Dim, как и простые переменные: Dim objWord as Word.application Dim objExcel as Excel.application СОВЕТ Рекомендуется полностью описывать все объекты, используемые при автоматизации. Вместо выражения Dim objWord as Application лучше использовать Dim objWord as Word.Application Объект приложения содержится в нескольких программах, на которые установлены ссылки. Полное описание объектной переменной позволяет обеспечить правильное выполнение кода. Ссылка на уже открытое приложение После создания объектной переменной следующий шаг — установка ссылки на приложение, которое необходимо автоматизировать. Однако следует помнить, что разработчику неизвестно, открыто ли в данный момент это приложение на компьютере пользователя. Допустим, необходимо автоматизировать Word, но пользователь мог уже открыть Word. В этом случае можно воспользоваться данной копией Word для сеанса автоматизации. Иначе придется открыть другую копию Word, что приведет к быстрому поглощению ресурсов компьютера. Чтобы определить, открыто ли необходимое приложение в данный момент, следует воспользоваться функцией GetObject. Функция GetObject устанавливает ссылку на уже открытое приложение: 'Объявление objWord в качестве объектной переменной Dim objWord as Word.Application 'Функция GetObject использует уже открытое приложение Set objWord = Get0bject(, 'Word.Application") Присваивание приложению объектной переменной Для присваивания ссылки объектной переменной данному объекту используется ключевое слово Set. Например: Set objExcel = Excel.Application Объектные переменные содержат указатель на объект. Когда объектная переменная присваивается приложению Excel, она содержит указатель на приложение Excel, а не все приложение Excel. Объекты при передаче из одной процедуры в другую всегда передаются по ссылке, а не по значению. Запуск отдельной копии приложения В тех случаях, когда приложение не открыто либо когда необходимо запустить отдельную копию приложения, используется ключевое слово New. Приведенный ниже код запускает новую копию Microsoft Word: 'Объявление objWord в качестве объектной переменной Dim objWord as Word.Application 'Запуск новой копии Microsoft Word Set objWord = New Word.Application ПРЕДОСТЕРЕЖЕНИЕ Операторы Dim и Set всегда следует объявлять в разных строках. Не объединяйте операторы Dim и Set в одной строке, как записано ниже: Dim ObjWord = Mew Word.application Если объединить данные операторы в одной строке, код выполняется более медленно и не всегда точно известно, в какой момент времени объект: инициализируется (записывается в память). Совместное использование функции GetObject и ключевого слова New Открывать новую копию приложения, если оно уже открыто, не рекомендуется. Запускать новую копию следует лишь в тех случаях, когда приложение в данный момент не открыто. Для проверки необходимо воспользоваться функцией GetObject и при необходимости ключевым словом New для запуска новой копии приложения. ' Используется Word, если он открыт. Если нет, открывается ' копия Word. ' Объявление objWord в качестве объектной переменной. Dim objWord As Word.Application ' Если Word не открыт, при выполнении GetObject возникает ' ошибка. Ошибка игнорируется. On Error Resume Next ' Попытка установить ссылку на уже открытый Word. Set objWord = Get0bject(, "Word.Application") ' Если objWord принимает пустое значение Nothing (неинициализируемая ' объектная переменная), значит. Word не открыт. If objWord Is Nothing Then ' Запускается новая копия Word. Set objWord = New Word.Application ' Если objWord сохраняет значение Nothing, предполагается, что ' MS Word 9.0 не установлен на компьютере. If objWord Is Nothing Then MsgBox "MS Word 2000 is not installed on your computer" End If End If ' При возникновении ошибки перейти к ErrorHandler ' (Ниже записывается ErrorHandler!) ПРИМЕЧАНИЕ Ключевое слово New может использоваться только в том случае, если возможно создание ссылки на библиотеку типов данного приложения. Сравнение раннего и позднего связывания Объектная переменная в выражениях Dim и Set специально ссылается на Word.Application. Такой способ носит название раннего связывания. При компиляции происходит связывание объектной переменной с библиотекой типов приложения Word. В результате код выполняется намного быстрее, поскольку значительная часть работы совершается при компиляции, а не при выполнении. С другой стороны, если бы objWord была объявлена как объект, связывание с библиотекой типов приложения Word до выполнения не происходило бы. Это значительно замедлило бы выполнение кода. Приведенный ниже пример обобщает сказанное: 'Используется способ более быстрого раннего связывания. Dim objWord as Word.Application 'Позднее связывание. Такой код выполняется медленнее. Dim objWord as Object СОВЕТ В базу данных Automation, mdb (см. часть 2) включены примеры тестов на определений быстродействия, которые показывают значительные преимущества раннего связывания. Использование функции CreateObject Самый эффективный код автоматизации объявляет объектные переменные с помощью специфического класса (раннее связывание), использует функцию GetObject для определения, открыто ли приложение, и ключевое слово New для запуска новой копии приложения, если оно не открыто. К сожалению, в некоторых случаях невозможно воспользоваться способом раннего связывания или ключевым словом New. В таких обстоятельствах полезной окажется функция CreateObject. Что делать, если нельзя установить ссылку на другие приложения? При использовании метода автоматизации из некоторых приложений (здесь не имеется в виду приложения Access) невозможно создать ссылку на другое приложение (диалоговое окно ссылок отсутствует). Подобное происходит при работе с Outlook 97/98 и разработке приложений для Internet. В этих случаях приходится использовать способ позднего связывания и функцию CreateObject. Ниже приводится пример кода автоматизации, который можно создать в Outlook для автоматизации в Word. ПРИМЕЧАНИЕ В любом случае для определения того, открыто окно Word или нет, может быть использована функция GetObject. Функция CreateObject запускает новую копию приложения. 'Объявление objWord в качестве об-ьектной переменной. Dim objWord As Word.Application ' Если Word не открыт, при выполнении GetObject возникает 'ошибка. Ошибка игнорируется. On Error Resume Next 'Попытка установить ссылку на приложение Word, которое уже открыто. Set objWord=GetObject(, "Word.Application") 'Если Word HE открыт, возникает ошибка 429. If Err. Number = 429 Then Err. Number = 0 'Запуск новой копии приложения Word. Set objWord = CreateObject ("Word.Application") 'При повторном возникновении ошибки 429 предполагается, ' что MS Word 9.0 не установлен на компьютере. If Err.Number = 429 Then MsgBox "MS Word 2000 is not installed on your computer" End If End If 'При возникновении ошибки перейти к ErrorHandler '(Ниже записывается Errorhandler!) Что делать, если у пользователей уставлены другие версии приложения? В некоторых компаниях разные пользователи могут работать с разными версиями приложения. Например, одни используют Word 95, другие — Word 97, а третьи — Word 2000. Более того, у некоторых пользователей на одном и том же компьютере может быть установлено несколько версий Word! С помощью функции CreateObject в качестве параметра можно указать точную версию Word, предназначенную для использования. В следующем примере функция CreateObject используется для открытия Word 97: 'Объявления objWord в качестве объектной переменной. Dim objWord As Word.Application 'Запуск новой копии приложения Word 97. Set objWord = CreateObject ("Word.Application.8") ПРИМЕЧАНИЕ Номера версий для программ: Office 95— 7.0; Office 97—8.0; Office 2000—9.0. Кроме того, параметр номера версии можно указать при использовании ключевого слова New. Использование свойств и методов объекта Automation После создания копии объекта можно программировать, управлять и манипулировать свойствами и методами данного объекта. Установка свойств объекта Именно здесь преимущества автоматизации проявляются в полную силу. Теперь можно работать с другими приложениями, используя их возможности и функциональные свойства. Работа со свойствами объекта Automation аналогична работе со свойствами объекта в Access. В приведенных ниже примерах используются свойства в Word и Excel: 'Установка свойств об-ьекта Automation objWord.Visible = True objExcel.Cells(1,1).Value = "Yearly Sales" Установка методов объекта В процессе автоматизации можно выполнять методы объекта. Ниже приведено несколько примеров: 'Выполнение метода "Add" объекта. objWord.Documents.Add objExcel.Workbooks.Add СОВЕТ Во второй части статьи приведены многочисленные примеры автоматизации в приложениях Microsoft Office. Там же более подробно описываются объекты, свойства и методы различных приложений. Освобождение объекта Automation Закончив работу с объектной переменной, ее необходимо освободить, установив объект равным Nothing. Благодаря этому можно освободить ценные ресурсы. Синтаксис приводится ниже: 'Освобождение объектной переменной Set objWord = Nothing ПРИМЕЧАНИЕ После окончания работы с объектной переменной следует немедленно перейти к концу процедуры и установить (Set) данную объектную переменную равной пустому значению (Nothing). Это поможет не забыть освободить объектные переменные после написания большой процедуры. Создание цельного проекта В данной главе не рассмотрены все этапы запуска процесса автоматизации. Ниже приведен пример кода, определяющий весь проект в целом. Указанный код выводит на печать документ Word с помощью метода автоматизации. В код включены все рассмотренные выше этапы: создание или получение ссылки на Word, использование объектов Word (в данном случае метод PrintOut) и освобождение объекта Automation. 'Объявление objWord в качестве объектной переменной Dim objWord As Word.Application 'Если приложение Word не открыто, при выполнении GetObject возникает 'ошибка. Ошибка игнорируется. On Error Resume Next 'Попытка установить ссылку на приложение Word, которое уже открыто. Set objWord = Get0bject(, "Word.Application") 'Если objWord имеет значение Nothing (объектная переменная, которая 'не ссылается на объект), значит, Word не открыт. If objWord Is Nothing Then 'Запуск новой копии приложения Word. Set objWord = New Word.Application 'Если objWord все равно имеет значение Nothing, предполагается, ' что MS Word 9.0 не установлен на компьютере. If objWord Is Nothing Then MsgBox "Ms Word 2000 is not installed on your computer" End If End If ' При возникновении ошибки перейти к ErrorHandler '(Ниже записывается ErrorHandler!) 'Открытие документа Word. objWord.Documents.Open ("С:\Automation\Northwind Magazine Ad.doc") 'Печать документа Word. objWord.Printout Background:=False 'Закрытие Word. objWord.Quit 'Освобождение объектной переменной. Set objWord = Nothing СОВЕТ Предполагается, что данный пример очень прост. Во второй части статьи приведен более сложный код автоматизации, а также файл Automation.MDB, которыми можно воспользоваться в дальнейшей работе. Закрытие приложения сервера автоматизации В течение сеанса автоматизации можно использовать уже открытую копию приложения либо открыть новую копию данного приложения. Важно, чтобы закрытие приложения сервера автоматизации происходило надлежащим образом, в соответствии с обстоятельствами. Если в начале сеанса автоматизации приложение уже открыто и используется данная копия приложения, не следует закрывать приложение по окончании сеанса автоматизации. Пользователи будут чрезвычайно раздосадованы, если используемое ими приложение будет закрыто посторонним кодом. Если же, с другой стороны, была создана новая копия приложения, по окончании сеанса автоматизации ее следует закрыть. Иначе приложение останется открытым и никем не используемым и будет "поглощать" ценные ресурсы компьютера. Для закрытия приложения необходимо воспользоваться соответствующим методом. Например, для Excel вызывается метод Quit: 'Закрытие приложения Excel с помощью метода Quit. objExcel.Quit Использование свойства UserControl для определения способа, с помощью которого было открыто приложение Свойство UserControl позволяет определить, было ли приложение или документ создано либо открыто пользователем или программным способом. Если свойство UserControl (логическая переменная) истинно, значит, приложение или документ были открыты пользователем; если ложно — программным способом. Код, приведенный в примере ниже, открывает код программным способом, а затем проверяет, как было открыто приложение Word, с помощью свойства UserControl. 'Объявление objWord в качестве объектной переменной. Dim objWord As Word.Application 'Открытие Word программным способом. Set objWord = New Word.Application 'Проверка свойства UserControl для определения способа 'открытия Word — пользователем или программным способом. If objWord.Application.UserControl Then MsgBox "The Word application was opened by the user". Else MsgBox "The Word application was opened progranunatically" . End If Set objWord = Nothing Использование WithEvents для отображения событий сервера автоматизации До сих пор способы применения метода автоматизации, рассматриваемые в данной главе, напоминали одностороннюю связь. Например, Access управляет и указывает Word выполнить те или иные действия. Использование ключевого слова WithEvents позволяет организовать двустороннюю связь между Access и Word. Access может приказать Word распечатать письмо либо документ, a Word может послать Access сообщение в случае возникновения определенных ситуаций. .Во-первых, важно определить, о каких сообщениях следует сообщать при вызове приложения. Простейший способ заключается в использовании браузера объектов. Необходимо щелкнуть на объекте приложения и посмотреть, указаны ли какие-либо события. Для объекта Application Word 97 отображаются только два события (DocumentChange и Quit). Для объекта Application Word 2000 отображаются 12 событий (рис. 4). При ссылке на объект различные пиктограммы указывают свойства (палец, показывающий на лист бумаги), методы (летящий зеленый ластик) и события (молния). РИСУНОК 4. Браузер объектов отображает открытые события Microsoft Word 2000. В Microsoft Excel открыто даже больше событий, чем в Word. Объект приложения Excel 2000 отображает 21 событие (рис. 5). РИСУНОК 5. Браузер объектов отображает открытые события Microsoft Excel 2000. Работа с WithEvents Обычно при использовании метода автоматизации в процедуре объектная переменная в ней описывается следующим образом: Dim objWord as Word.application Для использования WithEvents оператор Dim необходимо исключить из процедуры и создать вместо него переменную уровня модуля. Поскольку используется переменная уровня модуля, ключевое слово Dim необходимо изменить на Private или Public. Кроме того, для отображения событий приложения можно воспользоваться ключевым словом WithEvents. 'Объявление переменной уровня модуля с помощью ключевого слова WithEvents. Private objWord WithEvents as Word.application СОВЕТ Ключевое слово WithEvents можно использовать только с модулями классов (модули форм — это модули классов). В стандартных модулях использовать WithEvents нельзя. На рис. 6 показано, как объявлять переменную уровня модуля с помощью ключевого слова WithEvents. После объявления переменной уровня модуля с помощью ключевого слова WithEvents необходимо проверить поля со списками в верхней части окна модуля. В левом поле со списком следует выбрать приложение, являющееся сервером автоматизации. В правом поле отобразятся события, открытые приложением. При выборе любого из этих событий в окне кода отображается процедура, в которой можно записать код, соответствующий событию. РИСУНОК 6. Объявление переменной уровня модуля с помощью ключевого слова WithEvents. На рис. 7 в окне кода отображаются процедуры, использующие события Word Document Change и Quit. РИСУНОК 7.Процедуры, использующие события открытия Microsoft Word. Использование приемов и возможностей автоматизации Обычно недостатки объекта Automation связывают с низкой производительностью. На самом деле при соответствующем техническом обеспечении и надлежащих приемах кодирования процесс автоматизации происходит достаточно эффективно. При использовании Automation рекомендуется не забывать о следующих концепциях. Используйте ссылки, способ раннего связывания и ключевое слово New Для начала сеанса автоматизации необходимо установить ссылку на приложение с помощью диалогового окна ссылок. При создании объектной переменной следует использовать специфический класс и ключевое слово New для инициализации новой копии объекта. Все эти этапы подробно рассмотрены ранее в этой главе. Используйте существующее приложение, если оно уже открыто Не следует открывать новую копию приложения в каждом сеансе автоматизации. Если приложение уже открыто на компьютере пользователя, воспользуйтесь его открытой копией для сеанса автоматизации. Отключите ScreenUpdating Во время обычного сеанса автоматизации с Word или Excel происходит постоянное обновление экрана. Если ставить вопрос о производительности, при отключенном ScreenUpdating показатели будут значительно выше, поскольку меньше ресурсов уходит на обработку. Рекомендуется отключить ScreenUpdating, выполнить всю работу, связанную с автоматизацией, а затем снова включить ScreenUpdating. Пользователь увидит законченный документ по окончании работы. Описанный подход проиллюстрирован в приведенном ниже коде: 'Отключение ScreenUpdating Application.ScreenUpdating = False 'Здесь выполняется код автоматизации! 'Включение ScreenUpdating Application.ScreenUpdating = True СОВЕТ Однажды я создал приложение, в котором оставил включенным ScreenUpdating. При этом быстродействие приложения значительно снизилось. В следующей версии для повышения производительности обновление экрана было отключено. В результате я получил столько жалоб от пользователей, что был вынужден переделать и повторно распространить приложение с включенным ScreenUpdating. Пользователи объяснили, что во время обновления экрана у них появлялась возможность прочесть документ, начать просматривать его либо убедиться в том, что на печать отправляется нужный документ. Пользователи, вынужденные ждать завершения сеанса автоматизации, чтобы увидеть документ, теряли на этом примерно 3-5 секунд полезного времени. Кроме того, пользователям был приятен сам процесс наблюдения за "волшебным" составлением документов на экране. Из описанного случая можно сделать следующий вывод: при создании приложений следует учитывать не только компьютерное время обработки, но и "время обработки", которое необходимо пользователям. Обратная связь с пользователем Если сеанс автоматизации занимает значительное время, необходимо предусмотреть обратную связь с пользователем, отображающую ход процесса. В качестве подобной связи может использоваться индикатор хода процесса, курсор в виде песочных часов либо какой-нибудь другой визуальный индикатор. Если такой индикатор отсутствует, пользователь может просто выключить компьютер, думая, что он "завис". Следует помнить, что в процессе автоматизации открывается больше одного приложения. При внезапном отключении питания последствия могут оказаться разрушительными. Разработчики знают, что обратная связь с пользователем, обеспечиваемая например, индикатором хода процесса, может значительно замедлить сам процесс. Тем не менее, важно не реальное время, необходимое для завершения процесса, а воспринимаемое. При наличии визуальных индикаторов пользователям кажется, что процесс занимает меньше времени, хотя фактически процесс происходит дольше. СОВЕТ По заказу аэрокосмической компании я создал приложение, использовавшее очень сложный код автоматизации Excel. Во время сеанса автоматизации по экрану "пролетала" небольшая пиктограмма с изображением самолета. Пользователям больше нравился маленький самолет, пролетающий по экрану, чем сложный код автоматизации, выполняющий требуемую работу. Выполняйте код на сервере автоматизации Процесс всегда происходит намного быстрее, если позволить серверу автоматизации выполнять собственный код. Например, если приложение Access автоматизируется в Word, вначале необходимо создать копию объекта документа Word. Затем необходимо поместить весь код VBA, управляющий и манипулирующий программой Word (например, изменением шрифтов или стилей текста либо печатью документа), в программе Word. Другими словами, приложение должно само выполнять свой код. При использовании объектов, свойств или методов Word следует поместить VBA-код в Word. Иначе для каждого оператора кода будет происходить перекрестный процесс коммуникации между Access и Word. Придерживаясь данной методики, можно значительно повысить показатели производительности. СОВЕТ Код VBA в таких приложениях, как Word и Excel, размещается в шаблонах. Для упрощения распространения шаблонов следует разместить их в общей папке на сетевом сервере. Например, в Word шаблоны рабочей группы могут быть установлены для размещения на сетевом диске. При необходимости внести изменения в код или добавлении новых шаблонов их можно просто скопировать на сетевой диск в папку, где хранятся шаблоны рабочей группы. Используйте конструкцию With/End With Существует две важные причины для использования конструкции With/End With. Первая причина — это то, что код выполняется более эффективно, поскольку ссылку на объект устанавливают один раз, вместо того чтобы устанавливать ее в каждом операторе кода. Вторая причина — читабельность. Каждую точку следует рассматривать как барьер на беговой дорожке. Чем меньше точек, тем лучше! Рассмотрим следующие примеры: Пример 1. Ссылки на объект установлены в каждой строке кода, что замедляет работу. Кроме того, код плохо воспринимается. objExcel.Range("F6").Select objExcel.ActiveCell.FonnulaRlCl = "Yearly Sales" objExcel.Range("G6").Select objExcel.ActiveCell.FormulaRlCl = "Sales Summary" objExcel.Range("F7").Select Пример 2. Ссылка на объект установлена только один раз, что ускоряет работу. Кроме того, код вполне удобочитаем. With objExcel .Range("F6").Select .ActiveCell.FormulaRlCl = "Northwind Traders" .Range("G6").Select .ActiveCell.FormulaRlCl = "Sales Summary" .Range("F7").Select End With Освобождайте объектные переменные Как уже упоминалось, для освобождения ценных ресурсов следует всегда освобождать объектную переменную по окончании сеанса автоматизации, установив ее равной пустому значению Nothing. Не отображайте диалоговые окна и окна сообщений В общем случае следует избегать действий, которые приводят к остановке процесса автоматизации, например, отображения диалоговых окон и окон сообщений. Пользователь может не заметить остановку, работая в данный момент с другим приложением. Используйте обработку ошибок Автоматизация значительно усложняет приложение. Преимущества использования возможностей других приложений имеют и обратную сторону — может возникнуть больше ошибок. Важно в соответствующем месте разместить код обработки ошибок, которые могут возникнуть в процессе автоматизации. Для приложений Microsoft Office приложение-сервер может возвращать информацию об ошибках. Более подробно профессиональная обработка ошибок рассматривается в отдельной статье. Резюме В данной главе изложены принципы и возможности автоматизации. Автоматизация предполагает совместную работу приложений, предоставляя разработчику массу дополнительных возможностей для создания сложных программных продуктов. Гораздо легче изучить данные принципы, чем создать собственный редактор, электронную таблицу или какой-либо иной инструмент, уже входящий в состав другого приложения. Кроме того, в этой главе рассказывается, как выполнить запуск копии другого приложения, а также об использовании приложения и его закрытии. Рассмотрены многие приемы, позволяющие повысить производительность процесса автоматизации. Во второй части речь пойдет об интеграции приложений Access с другими приложениями Microsoft Office. |