Персональный сайт Безмалой Елены
www.bezmalaya.narod.ru

Главная страница


Создание приложений для Outlook

Ольга Павлова

В Office 97 на смену системам Microsoft Schedule+ и Exchange пришел новый персональный информационный менеджер (ПИМ) - Outlook, который объединяет в себе электронную почту, календарь, список контактов и менеджер заданий (рис.1). И хотя в текущую версию Outlook не встроен VBA, он содержит расширенную объектную модель, используемую любым Automation-контроллером. Тем не менее научиться работать с этой моделью - задача не из простых, так как документация по программированию Outlook встречается довольно редко. Чтобы восполнить этот пробел, рассмотрим примеры по созданию полезных Outlook-приложений с использованием Visual Basic.

Рисунок 1
Рис. 1

Модель 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. Кроме того, у вас будет возможность исправлять эту информацию и сохранять свои изменения, а благодаря автоматизации некоторых функций - форматировать имена так, как вам хочется.

Рисунок 2
Рис. 2

В начало статьи

Шаг 1. Создание пользовательского интерфейса

Запустите VB5 и выберите Standard EXE. Нарисуйте на форме элемент управления TextBox, а над ним - Label. Выделите оба элемента управления, скопируйте их в буфер обмена и затем четырежды поместите их на форму как массив элементов управления. Созданные таким образом элементы управления будут использоваться для вывода полей из папки Contacts. Применение массива элементов управления очень удобно при работе с формами ввода, поскольку они совместно используют одни и те же процедуры событий. Чтобы написать код, реагирующий на изменения во всех элементах управления, вам понадобится только одна процедура.

Добавьте вертикальную линейку прокрутки на правой стороне формы, а внизу разместите командную кнопку, свойство Caption которой замените на "Сохранить" и имя - на butSave (рис. 3).

Рисунок 3
Рис. 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-приложения. Теперь, после того как у вас появилось работоспособная программа, может быть, вы подумаете о том, чтобы добавить к ней и другие полезные функции.

В начало статьи

© Ольга Павлова
© Оформление и подготовка к публикации Корпорация Microsoft

 
Персональный сайт Безмалой Елены
www.bezmalaya.narod.ru

Главная страница


Hosted by uCoz