|
Создание приложений для OutlookОльга Павлова
В Office 97 на смену системам Microsoft Schedule+ и Exchange пришел новый персональный информационный менеджер (ПИМ) - Outlook, который объединяет в себе электронную почту, календарь, список контактов и менеджер заданий (рис.1). И хотя в текущую версию Outlook не встроен VBA, он содержит расширенную объектную модель, используемую любым Automation-контроллером. Тем не менее научиться работать с этой моделью - задача не из простых, так как документация по программированию Outlook встречается довольно редко. Чтобы восполнить этот пробел, рассмотрим примеры по созданию полезных Outlook-приложений с использованием Visual Basic.
Модель Outlook имеет очень большие размеры, однако здесь, как и в VB, действует правило 80/20, то есть около 80 процентов кода Outlook-приложения использует около 20 процентов его объектной модели. Полная диаграмма объектной модели Outlook 97 приводится в руководстве Microsoft Office 97 Object Model Guide, а здесь вы познакомитесь только с некоторыми из ее свойств и методов. Прежде чем мы приступим к программированию Outlook, запустим файл справки VBAOUTL.HLP, хранящийся в каталоге Office. Он содержит одну-единственную тему "Installing Visual Basic Help for Microsoft Outlook". Что же там находится? Файл справки, в котором говорится, что вам нужен другой файл справки с тем же именем! Таким образом, если вы даже установили полную версию Office, то все, что вы получаете, - это файл размером 19 Кбайт, адресующий вас к каталогу ValuPack\MoreHelp на компакт-диске Office. Там спрятан настоящий файл справки Outlook VBA, имеющий более солидный размер - 365 Кбайт. Скопируем все файлы VBAOUTL.* в каталог Office. Теперь у нас есть VBA-справка для Outlook - и это хорошо. Гораздо хуже то, что данная справка состоит только из ссылки на объектную модель Outlook без какого бы то ни было содержательного описания и конкретных примеров использования - есть только несколько фрагментов кода. Самый главный объект Outlook, обеспечивающий доступ к другим иерархическим объектам Информационного менеджера, - Application. Его необходимо создавать каждый раз при написании нового Outlook-приложения. GetNameSpace и CreateItem - наиболее важные методы этого объекта. При отправке почты используется первый из них, а при составлении письма, задания, памятки или ввода информации для контакта или встречи - второй. Пример 1. Вывод имени пользователяДля вывода на экран текущего имени пользователя откройте меню Project, выберите команду References и отметьте Microsoft Outlook 8.0 Object Library. Поместите на форму командную кнопку и в событии Click введите следующий код, служащий иллюстрацией объекта Application и его метода GetNameSpace:
Private Sub CommandButton1_Click() Dim theApp, theNameSpace Set theApp = CreateObject("Outlook.Application") Set theNameSpace = theApp.GetNameSpace("MAPI") MsgBox theNameSpace.CurrentUser.Name End Sub Вызов CreateObject("Outlook.Application") возвращает объект типа Application, метод GetNameSpace которого возвращает объект NameSpace. Сейчас вы всегда передаете методу GetNameSpace одну и ту же строку, "MAPI", но в будущем, вероятно, Outlook сможет поддерживать другие почтовые протоколы. Объект NameSpace вам понадобится для использования почтовых функций Outlook. Например, свойство Folders представляет собой коллекцию коллекций - список всех папок Outlook и вложенных в них других папок, включая те, что созданы вами. Свойство CurrentUser объекта NameSpace имеет тип Recipient и обладает своими собственными интересными свойствами. Среди них есть свойство Name, которое возвращает имя, выводимое на экран в нашем примере. Это удобно для создания приложений, которые автоматически читают имя пользователя. Пример 2. Отправка почтовых сообщенийДля отправки почты вам необходимо только следующее: объекты Recipient, Subject и Body, а также метод Send. Поместите на форму командную кнопку, которая будет использоваться для создания короткого сообщения и его отправки. Для этого в событии Click введем следующий код:
Private Sub Command1_Click() Dim theApp, theNameSpace, theMailItem Set theApp = CreateObject("Outlook.Application") Set theNameSpace = theApp.GetNamespace("MAPI") Set theMailItem = theApp.CreateItem(olMailItem) With theMailItem .Recipients.Add "akolesov@glasnet.ru" .Subject = "Привет" .Body = "Как поживаешь?" .Send End With End Sub Как всегда, сначала необходимо создать объекты Application и NameSpace. Новый объект в этом примере - MailItem, который создается с помощью вызова Application.CreateItem. Здесь необходимо помнить, что метод MailItem.Send устанавливает элемент данных (item) равным Nothing, поэтому каждый раз при отправлении письма необходимо выполнять Application.CreateItem. Пример 3. Утилита для просмотра содержимого папки ContactsА теперь напишем утилиту, которая, может быть, окажется для всех полезной. Если, установив Outlook, попытаться заполнить его информацией, хранящейся в различных адресных книгах, менеджерах контактов или файлах электронных таблиц, можно столкнуться со следующей ситуацией. Поскольку различные приложения хранят имена различными способами, в Outlook может возникнуть путаница: например, вместо имен будут выводиться фамилии, а в поле File As - только имена. Если же у вас хранятся данные о нескольких сотнях контактов, исправить всю эту информацию вручную будет очень непросто. Вот здесь и пригодится утилита, с помощью которой вы сможете просматривать содержимое папки Contacts (рис.2) из VB-формы и выводить имя, фамилию, полное имя, фирму и поле File As. Кроме того, у вас будет возможность исправлять эту информацию и сохранять свои изменения, а благодаря автоматизации некоторых функций - форматировать имена так, как вам хочется.
Шаг 1. Создание пользовательского интерфейсаЗапустите VB5 и выберите Standard EXE. Нарисуйте на форме элемент управления TextBox, а над ним - Label. Выделите оба элемента управления, скопируйте их в буфер обмена и затем четырежды поместите их на форму как массив элементов управления. Созданные таким образом элементы управления будут использоваться для вывода полей из папки Contacts. Применение массива элементов управления очень удобно при работе с формами ввода, поскольку они совместно используют одни и те же процедуры событий. Чтобы написать код, реагирующий на изменения во всех элементах управления, вам понадобится только одна процедура. Добавьте вертикальную линейку прокрутки на правой стороне формы, а внизу разместите командную кнопку, свойство Caption которой замените на "Сохранить" и имя - на butSave (рис. 3).
Сообщите VB, что вы намереваетесь использовать объекты Outlook. Для этого из меню Project выберите команду References, а затем пометьте галочкой Microsoft Outlook 8.0 Object Library. Разработчики часто проявляют невнимание при ссылке на объекты, которые они собираются использовать. И напрасно! Ведь если вы сделаете правильную ссылку, то VB загрузит библиотеку типов и выведет список свойств и методов для всех объектов Outlook в Object Browser и его подсказках IntelliSense. Иначе VB просто выдаст сообщение о синтаксической ошибке, если вы попытаетесь использовать один из этих объектов. Шаг 2. Просмотр содержимого папки ContactsВначале зададим переменные, которые будут использоваться в любом событии формы для ссылки на папку Contacts:
Dim ol As New Outlook.Application Dim ContactFolder As MAPIFolder Dim IsDirty As Boolean Первая строка определяет переменную ol как объект Application, занимающий самую верхнюю позицию в иерархии объектов Outlook. Из этого объекта вы можете ссылаться на любой другой объект внутри Outlook. Ключевое слово New открывает Outlook и создает экземпляр объекта Application при первом использовании переменной ol. Если опустить это ключевое слово, нужно будет воспользоваться операторами Set и CreateObject, как это делалось в приведенных выше примерах. Переменная ContactFolder представляет собой объект MAPIFolder, а переменная IsDirty используется в том случае, когда пользователь делает какие-либо изменения в поле формы. И хотя данный код запускает программу Outlook (если она еще не была запущена), имеет смысл самостоятельно запустить ее из Windows Desktop. Это должно ускорить процесс отладки, так как вам не нужно будет ждать запуска Outlook каждый раз при тестировании своего приложения. Теперь дважды щелкнем на нашей форме, чтобы добавить код в событие Form_Load. Мы должны установить связь с папкой Contacts внутри Outlook. Используем метод GetNameSpace объекта Application для связи со стандартным профилем MAPI. Когда вы передаете константу olFolderContacts в качестве аргумента в метод GetDefaultFolder, вы открываете папку Contacts. Затем установим свойство Max вертикальной линейки прокрутки равным количеству элементов (контактов) в папке Contacts. И наконец, зададим свойство Value этого же элемента управления равным 1 - тем самым мы выводим на экран первый контакт:
Private Sub Form_Load() Set ContactFolder = ol.GetNamespace("MAPI").GetDefaultFolder _ (olFolderContacts) VScroll1.Max = ContactFolder.Items.Count VScroll1.Value = 1 End Sub Пользователь перемещается от контакта к контакту, щелкая на линейке прокрутки. Такие действия изменяют значение элемента управления, которое всегда остается в интервале от 1 до максимального количества контактов. Благодаря этому вы можете использовать данное значение в качестве прямой ссылки к коллекции элементов (контактов) в папке Contacts. В событии Change линейки прокрутки напишем код для вызова процедуры LoadContact, передающей текущее значение элемента управления Scrollbar. Здесь необходимо обратить внимание на то, что с точки зрения простоты кода всегда лучше отделять процедуры загрузки и сохранения от процедур событий для формы. Таким образом, вам будет легче вызывать их из другой процедуры своего приложения:
Private Sub VScroll1_Change() LoadContact VScroll1.Value End Sub Процедура LoadContact очень проста. Вы можете сделать ее еще более удобной для пользователя, если выведете текущий номер контакта в свойстве Caption для формы. В операторе With мы используем коллекцию Items папки Contacts, чтобы установить свойство Text каждого элемента управления TextBox равным одному из полей элемента (контакта):
Private Sub LoadContact(i%) Me.Caption = "Контакт " & i & " из " & VScroll1.Max With ContactFolder.Items(i) Text1(0) = .FirstName Text1(1) = .LastName Text1(2) = .FullName Text1(3) = .CompanyName Text1(4) = .FileAs End With IsDirty = False End Sub Как уже говорилось выше, мы выбрали именно эти пять полей, так как они не всегда корректно импортируются из других приложений. Вы можете легко модифицировать данный код, использовав другие поля или добавив дополнительные элементы управления TextBox к своей форме. Теперь проверим работу нашего приложения. Нажмите F5, и первый контакт должен появиться на экране. Шаг 3. Внесение изменений и их сохранениеХотя наше приложение уже можно использовать для просмотра контактов, было бы неплохо, если бы мы могли проводить какие-либо изменения, а потом сохранять их. Вначале добавим код к событию Change массива элементов управления TextBox для установки флажка IsDirty, который отражает изменения в любом из полей. Здесь мы на практике можем ощутить преимущество использования массива элементов управления - для установки флажка требуется всего одна строка кода:
Private Sub Text1_Change(Index As Integer) IsDirty = True End Sub Дважды щелкнем кнопку "Сохранить" и введем следующий код для вызова процедуры SaveContact:
Private Sub butSave_Click() SaveContact VScroll1.Value End Sub Скопируем код из процедуры LoadContact и изменим его следующим образом, чтобы установить свойства полей для элементов (контактов) внутри коллекции Items переменной ContactFolder. После того, как вы задали все поля, используйте метод Save для записи модифицированных полей в папку Contacts. Не забудьте установить переменную IsDirty равной False (Ложь) после того, как сохраните изменения:
Private Sub SaveContact(i%) With ContactFolder.Items(i) .FirstName = Text1(0) .LastName = Text1(1) .FullName = Text1(2) .CompanyName = Text1(3) .FileAs = Text1(4) .Save End With IsDirty = False End Sub Теперь запустите свое приложение, измените что-нибудь в данных о контактах и щелкните кнопку "Сохранить". Прокрутите вперед, а затем назад записи из папки Contacts, и вы должны увидеть обновленные данные. Шаг 4. Форматирование именТаким образом, с помощью нашего приложения мы хорошо справляемся с изменением одного контакта. Но что делать, если таких контактов у нас сотни и мы хотим внести изменения во все? Например, в папке Contacts поле FullName заполнено правильно, а вот поле FirstName в некоторых случаях содержит как FirstName, так и LastName. При этом поле LastName остается пустым. Попробуем провести анализ поля FullName и заполнить поля FirstName и LastName. Кроме того, сформируем поле FileAs как LastName, FirstName плюс поле Company, если оно заполнено. Добавим к нашей форме еще одну командную кнопку и установим для нее свойство Caption равным "Автонастройка", а свойство Name - butAuto. Дважды щелкнем на этой кнопке и введем код, позволяющий использовать встроенную в VB функцию Instr. С ее помощью мы сможем определить, есть ли пробел в поле FirstName, и не является ли поле LastName пустым:
Private Sub butAuto_Click() If InStr(Text1(0), " ") And Text1(1) = " " Then Text1(0) = ParseName(Text1(0), 1) Text1(1) = ParseName(Text1(0), 2) End If Для заполнения полей FirstName и LastName вызовем функцию ParseName (листинг 1). После этого можно заполнить поля FullName и FileAs:
Text1(2) = Text1(0) & " " & Text1(1) Text1(4) = Text1(1) & "," & Text1(0) If Len(Text1(3)) Then Text1(4) = Text1(4) & vbCrLf & Text1(3) End Sub Теперь, если вы вдруг обнаружите, что какой-либо контакт заполнен неверно, мы можете щелкнуть кнопку "Автонастройка" для автоматического заполнения полей, а затем щелкнуть кнопку "Сохранить". Таким образом, написав менее 50 строчек кода, мы создали утилиту, имеющую доступ к данным внутри Office-приложения. Теперь, после того как у вас появилось работоспособная программа, может быть, вы подумаете о том, чтобы добавить к ней и другие полезные функции. © Ольга Павлова |
|