Автоматизация приложений Microsoft Office в примерах

Часть 2. Microsoft Power Point и Microsoft Outlook

Наталия Елманова

Автоматизация Microsoft PowerPoint

    Программные идентификаторы и объектная модель Microsoft PowerPoint

    Запуск Microsoft PowerPoint, создание и открытие презентаций

    Сохранение, печать и закрытие презентаций Microsoft PowerPoint

    Оформление презентаций

    Манипуляция отдельными слайдами

    Демонстрация слайдов

Автоматизация Microsoft Outlook

    Программные идентификаторы и объектная модель Microsoft Outlook

    Запуск Microsoft Outlook, открытие и создание папок

    Манипуляция элементами папок

    Манипуляция сообщениями электронной почты

    Манипуляция контактами

    Манипуляция заметками и задачами

 

В предыдущей статье были рассмотрены общие принципы создания контроллеров автоматизации, а также задачи, наиболее часто встречающиеся при автоматизации Microsoft Word и Microsoft Excel. В настоящей статье мы продолжим знакомство с приложениями Microsoft Office как серверами автоматизации и расскажем о задачах, наиболее часто встречающихся при автоматизации Microsoft PowerPoint и Microsoft Outlook. Как и в предыдущей статье, в качестве средства разработки для приведенных ниже примеров используется Borland Delphi 5, но вполне возможно перенести этот код на другие языки программирования. Во всех примерах в данной статье используется позднее связывание, если иное специально не оговорено.

Автоматизация Microsoft PowerPoint

В этом разделе, прежде чем рассмотреть наиболее часто встречающиеся задачи, связанные с автоматизацией Microsoft PowerPoint, выясним, каковы программные идентификаторы основных объектов Microsoft PowerPoint и что представляет собой его объектная модель.

Программные идентификаторы и объектная модель Microsoft PowerPoint

Для приложения-контроллера непосредственно доступен только один объект:

 

Объект

Программный идентификатор

Комментарий

Application

PowerPoint.Application, PowerPoint.Application.9

С помощью этого программного идентификатора создается экземпляр PowerPoint без открытых презентаций

Все остальные объекты PowerPoint являются внутренними, то есть они не могут быть созданы сами по себе. Например, объект Presentation (Презентация) не может быть создан отдельно от самого приложения.

Небольшой фрагмент объектной модели Microsoft PowerPoint изображен на рис. 1.

Основным в объектной модели PowerPoint является объект Application, содержащий коллекцию Presentations объектов типа Presentation. Каждый объект типа Presentation содержит коллекцию Slides объектов типа Slide, соответствующих слайдам презентации. Слайды, в свою очередь, содержат коллекции Shapes типа Shape, соответствующие элементам слайдов презентации. Манипуляция презентациями, слайдами и их элементами реально осуществляется путем обращения к свойствам и методам этих объектов.

Далее мы остановимся на наиболее часто встречающихся задачах, связанных с автоматизацией Microsoft PowerPoint. Если вам встретится задача, не совпадающая ни с одной из нижеописанных, вам следует попытаться найти подходящий пример на Visual Basic в справочном файле VBAPPT9.CHM либо (как и в случае Microsoft Word или Microsoft Excel) записать соответствующий макрос и проанализировать его код.

В начало

В начало

Запуск Microsoft PowerPoint, создание и открытие презентаций

Для создания примеров использования Microsoft PowerPoint можно использовать следующий код создания контроллера (подробное объяснение этого фрагмента кода содержится в разделе «Общие принципы создания контроллеров автоматизации» предыдущей статьи данного цикла):

Uses ComObj, ActiveX
   ...
   procedure TForm1.Button1Click(Sender: TObject);
   var 
         ServerIsRunning   : boolean;
         Unknown               :    IUnknown;
         Result                   : HResult;
         AppProgID            :    String;
         App                     :    Variant;
   begin
   //Указать программный идентификатор приложения-сервера 
   AppProgID := 'PowerPoint.Application';
   ServerIsRunning := False;
   Result := GetActiveObject(ProgIDToClassID(AppProgID),nil,Unknown);
   if (Result = MK_E_UNAVAILABLE) then
      //Создать один экземпляр сервера
      App := CreateOleObject(AppProgID)
   else
      begin
       //Соединиться с уже запущенной копией сервера
       App := GetActiveOleObject(AppProgID);
       ServerIsRunning := True;
      end;
      //показать окно приложения на экране
      App.Visible := True;
   //----------------------------------------------------------
   //
   // Здесь выполняются другие действия с объектами приложения 
   //   Office 
   //
   //----------------------------------------------------------
   if not ServerIsRunning then App.Quit;
   App := Unassigned;
   end;

и заменить комментарии кодом, манипулирующим свойствами и методами объекта PowerPoint.Application.

Изучение создания контроллеров PowerPoint мы начнем с создания и открытия презентаций.

Создать новую презентацию PowerPoint можно с помощью метода Add коллекции Presentations объекта Application:

App.Presentations.Add;

Для открытия уже существующей презентации документа следует воспользоваться методом Open коллекции Presentations:

App.Presentations.Open('C:\MyPresentation.ppt');

Следует отметить, что свойство ActivePresentation объекта PowerPoint.Application указывает на текущую активную презентацию среди одной или нескольких открытых. Кроме того, к рабочей книге можно обращаться по ее порядковому номеру. Например, ко второй открытой рабочей книге можно обратиться так:

App.Presentations.Item(2)

Обратите внимание на то, что в Delphi при использовании позднего связывания синтаксис, применяемый для обращения к членам коллекций объектов PowerPoint, аналогичен синтаксису, применяемому при обращении к объектам Word, и отличен от синтаксиса, применяемого при обращении к объектам Excel.

Отметим также, что в случае PowerPoint, в отличие от Word и Excel, объект Application не имеет метода Activate для того, чтобы сделать активной конкретную презентацию среди нескольких открытых. Для решения этой задачи следует обращаться к коллекции Windows объекта Presentation либо к объектам DocumentWindow и SlideShowWindow, например:

App.Presentations.Item(1).Windows.Item(1).Activate;

А теперь поговорим о том, как сохранять презентации в файлах.

В начало

В начало

Сохранение, печать и закрытие презентаций Microsoft PowerPoint

Закрытие презентации можно осуществить, используя метод Close:

App.Presentations.Item(2).Close;

или:

App.ActivePresentation.Close;

Обратите внимание на то, что в случае PowerPoint метод Close закрывает презентацию, не предлагая пользователю сохранить изменения, и к тому же не имеет параметров, с помощью которых можно было бы повлиять на возможность сохранения изменений (напоминаем, что в случае Word и Excel этот метод обладал параметрами, влияющими на возможность сохранения документа перед его закрытием).

Для сохранения презентации следует воспользоваться методом Save или SaveAs:

App.Presentations.Item(2).Save;

Или:

App.Presentations.Item(2).SaveAs('C:\MyPres1.ppt');

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

Второй параметр (необязательный в случае позднего связывания) указывает, в каком формате сохраняется презентация. Это целый параметр, принимающий такие значения:

 const
      ppSaveAsPresentation = $00000001; //формат    текущей версии PowerPoint
      ppSaveAsPowerPoint7 = $00000002; //формат PowerPoint 7
      ppSaveAsPowerPoint4 = $00000003; //формат PowerPoint 4
      ppSaveAsPowerPoint3 = $00000004; //формат PowerPoint 3
      ppSaveAsTemplate    = $00000005; //сохранить как шаблон
      ppSaveAsRTF = $00000006; //формат RTF
      ppSaveAsShow = $00000007; //формат SlideShow (*.pps)
      ppSaveAsAddIn = $00000008; //формат PowerPoint AddIn (*.ppa)
      ppSaveAsPowerPoint4FarEast = $0000000A;    //формат PowerPoint 4 Far East    (версия для Китая, Японии, стран Юго-Восточной Азии)
      ppSaveAsDefault = $0000000B; //формат по умолчанию, определяемый    текущими настройками PowerPoint
      ppSaveAsHTML = $0000000C; //формат HTML
      ppSaveAsHTMLv3 = $0000000D; //формат    HTML 3
      ppSaveAsHTMLDual = $0000000E; //формат HTML для текстов в    двухбайтовой кодировке
      ppSaveAsMetaFile = $0000000F; //формат WMF
      ppSaveAsGIF = $00000010; //формат GIF
      ppSaveAsJPG = $00000011; //формат JPG[-]   ppSaveAsPNG    = $00000012; //формат PNG
      ppSaveAsBMP = $00000013; //формат BMP

В случае использования Visual Basic описывать эти константы нет необходимости.

Третий параметр указывает, нужно ли внедрять в презентацию используемые в ней шрифты. Он может принимать значения True (внедрять шрифты) или False (не внедрять шрифты); по умолчанию используется значение False.

Закрыть PowerPoint можно с помощью метода Quit объекта PowerPoint.Application. В случае PowerPoint этот метод параметров не имеет.

Вывод документа PowerPoint на устройство печати можно осуществить с помощью метода PrintOut объекта Presentation, например:

App.Presentations.Item(2).PrintOut;

Если нужно изменить параметры печати, следует указать значения соответствующих (необязательных в случае позднего связывания) параметров метода PrintOut. В случае PowerPoint их пять. Первые два целых параметра указывают номера слайдов, которые должны быть напечатаны. Третий параметр представляет собой строку с именем файла, если вывод происходит в файл вместо принтера. Четвертый (целый) параметр указывает, сколько экземпляров печатать. Пятый параметр определяет, должен ли быть напечатанный документ разобран по экземплярам, и принимает значения True (по умолчанию) или False. Так, для вывода с пятого по двадцатый слайды в файл C:\MyOutput.prn в трех экземплярах можно использовать следующий код:

App.Presentations.Item(2).PrintOut(5,20,'c:\MyOutput.prn',3);

Отметим, однако, что помимо параметров метода PrintOut, влияющих на то, какой принтер используется и сколько экземпляров печатается, на режим печати презентации влияет также свойство PrintOptions объекта Presentation. Это свойство представляет собой объект PrintOption, имеющий, в свою очередь, набор свойств, влияющих на то, в каком виде печатается презентация (слайды, выдачи, заметки и др.), печатаются ли рамки вокруг слайдов, сколько слайдов на странице располагается в случае печати выдач, печатается ли фон слайдов и т.д. Указанный набор свойств примерно отражает то, что именно пользователь PowerPoint может изменить, выбрав опцию File | Print из меню PowerPoint (в том числе и имя принтера, и имя презентации, и число копий).

Далее мы рассмотрим, как изменить оформление презентации.

В начало

В начало

Оформление презентаций

Для оформления презентации обычно применяются цветовые схемы, шаблоны и образцы. Применить шаблон к презентации можно с помощью метода ApplyTemplate объекта Presentation:

App.Presentations.Item(1).ApplyTemplate('C:\Program Files\Microsoft Office\Templates\Presentation Designs\Bamboo.pot');

Следует отметить, что если до применения шаблона к слайдам презентации были применены стандартные цветовые схемы (о них речь пойдет чуть позже), то эти цветовые схемы после применения шаблона будут утеряны.

Для получения образцов слайдов, титульного слайда, раздаточных материалов и заметок используются свойства SlideMaster, TitleMaster, HandoutMaster и NotesMaster объекта Presentation. К образцам можно применять фоновую заливку, добавлять графические объекты, элементы управления ActiveX, изменять оформление текста.

Для изменения цветовой схемы в образце слайдов, титульного слайда, раздаточных материалов или заметок необходимо воспользоваться свойством ColorScheme объекта Master. Это свойство возвращает объект ColorScheme, содержащий коллекцию Colors из восьми цветов. Элементы данной коллекции соответствуют следующим элементам цветового оформления:

 const
   ppBackground = $00000001; //цвет фона
   ppForeground = $00000002; //цвет текста и границ автофигур
   ppShadow = $00000003; //цвет тени 
   ppTitle = $00000004; //цвет текста заголовка
   ppFill = $00000005; //цвет заливки автофигур
   ppAccent1 = $00000006; //цвет, применяемый в диаграммах
   ppAccent2 = $00000007; //цвет, применяемый в диаграммах и гипертекстовых ссылках
   ppAccent3 = $00000008; //цвет, применяемый в диаграммах и выбранных гипертекстовых ссылках

В частности, приведенный ниже фрагмент кода устанавливает для слайдов презентации серый фон и темно-красный цвет заголовков:

App.Presentations.Item(1).SlideMaster.ColorScheme.Colors(ppBackGround).RGB := RGB(128, 128, 128);
App.Presentations.Item(1).SlideMaster.ColorScheme.Colors(ppTitle).RGB :=   RGB(200, 0, 0);

Пользователи Delphi и C++Builder могут использовать и стандартные цвета, определенные в этих средствах разработки. Например, следующий фрагмент кода устанавливает желтый цвет заливки автофигур:

App.Presentations.Item(1).SlideMaster.ColorScheme.Colors(ppFill).RGB:= clYellow;

Для добавления объектов в образцы слайдов следует обращаться к коллекции Shapes объекта Master. Приведем фрагмент кода, который содержит пример добавления прямоугольника размером 100x200 пикселов в образец слайдов на расстоянии 50 пикселов от левого и верхнего краев слайда:

const
msoShapeRectangle = $00000001;
... 
App.Presentations.Item(1).SlideMaster.Shapes.AddShape(msoShapeRectangle, 50, 50, 100, 200);

Возможные значения параметра, отвечающего за тип автофигуры, можно найти в справочном файле (или в интерфейсном модуле, сгенерированном для библиотеки MSO9.DLL).

Чтобы изменить оформление текста в презентации, следует обратиться к свойству TextStyles объекта Master, содержащему три объекта типа TextStyle (для текста заголовков, основного и стандартного текстов):

 const
   ppDefaultStyle = $00000001; //стандартный текст
   ppTitleStyle = $00000002; //текст заголовков
   ppBodyStyle = $00000003; //основной текст

Объект TextStyle обладает свойствами TextFrame (содержит сведения о расположении текста внутри текстового поля) и Ruler (содержит сведения о позициях табуляции и сдвигах между различными уровнями). Свойство Levels объекта TextStyle содержит пять объектов TextStyleLevel, содержащих сведения об оформлении текста различных уровней. Нижеприведенный фрагмент кода устанавливает отступ для основного текста от левого края содержащего его объекта равным 10 пунктам, размер шрифта первого уровня основного текста равным 42 пунктам, а имя этого шрифта — Courier:

App.Presentations.Item(1).SlideMaster.TextStyles.Item(ppBodyStyle).TextFrame.MarginLeft := 10;
App.Presentations.Item(1).SlideMaster.TextStyles.Item(ppBodyStyle).Levels.Item(1).Font.Size := 42;
App.Presentations.Item(1).SlideMaster.TextStyles.Item(ppBodyStyle).Levels.Item(1).Font.Name := 'Courier';

Однако помимо применения цветовых схем, шаблонов и образцов ко всей презентации, PowerPoint позволяет создавать оформление для отдельных слайдов. Об этом мы и расскажем ниже.

В начало

В начало

Манипуляция отдельными слайдами

Доступ к слайдам презентации осуществляется с помощью коллекции Slides объекта Presentation. Эта коллекция содержит объекты типа Slide, каждый из которых соответствует отдельному слайду презентации.

Добавить к презентации новый слайд можно с помощью метода Add коллекции Slides. Этот метод имеет два обязательных целых параметра. Первый из них указывает, каким по счету в презентации должен быть вставляемый слайд (это число не должно превышать текущее число слайдов плюс один), второй представляет собой номер образца в галерее слайдов. Следующий фрагмент кода иллюстрирует, каким образом можно добавить слайд, содержащий диаграмму, чтобы он был вторым в презентации:

const
   ppLayoutChart = $00000008;
... 
App.Presentations.Item(1).Slides.Add(2,ppLayoutChart);

Cписок возможных значений второго параметра можно найти в справочном файле или интерфейсном модуле.

Обратиться к слайду можно по его номеру, например:

App.Presentations.Item(1).Slides.Item(1)

Поскольку порядковые номера слайдов в процессе редактирования презентации иногда необходимо изменить, для обращения к слайду можно также пользоваться уникальным идентификатором SlideID, являющимся свойством объекта Slide. В этом случае для поиска слайда можно использовать метод FindBySlideID:

Var MyID: integer;
...
const
   ppLayoutText = $00000002;
...   

MyID := App.Presentations.Item(1).Slides.Item(2).SlideID;
...
App.Presentations.Item(1).Slides.FindBySlideID(MyID).Layout := ppLayoutText;

Отметим, что при копировании слайда в другую презентацию его SlideID изменяется.

Свойство Layout объекта Slide, использованное в приведенном примере, позволяет изменить тип слайда.

Для изменения цветового оформления слайда используется свойство ColorScheme объектов Slide или SlideRange сответственно. Это свойство возвращает объект ColorScheme, использование которого уже было описано выше в разделе «Оформление презентаций». Следующий пример показывает, как установить синий цвет заголовка второго слайда презентации:

App.Presentations.Item(1).Slides.Item(2).ColorScheme.Colors(ppTitle).RGB:= clBlue;

Добавление объектов к слайду осуществляется с помощью коллекции Shapes, о применении которой было рассказано там же. Свойства каждого объекта слайда можно изменять, обращаясь к членам этой коллекции. Любой объект на слайде имеет уникальный номер и уникальное имя. Имя присваивается при создании объекта по умолчанию, однако его можно заменить и на что-нибудь осмысленное, например:

App.Presentations.Item(1).Slides.Item(2).Shapes.Item(1).Name := 'MyText';

Поскольку наиболее часто в слайдах приходится добавлять в объекты текст, остановимся на этом поподробнее. Для добавления текста к объекту Shape следует использовать его свойство TextFrame. Покажем на примере добавление текста заголовка слайда, имя которого было заменено выше:

 App.Presentations.Item(1).Slides.Item(2).Shapes.Item('MyText').TextFrame.TextRange.Text   := 'Это заголовок слайда';

Для добавления перечислений в текст между строками текста следует вставлять символы конца строки, как это показано в следующем фрагменте кода:

 App.Presentations.Item(1).Slides. Item(2).Layout := ppLayoutText;
App.Presentations.Item(1).Slides.Item(2).Shapes.Item(2).TextFrame.TextRange.Text :='Текст 1'+chr(13)+chr(10)+'Текст 2';

Чтобы изменить расположение объектов друг поверх друга, можно использовать свойство Zorder объекта Shape, а для изменения типа заливки — свойство Fill этого же объекта. Подробности об использовании этих свойств и список соответствующих констант можно найти в справочном файле.

Научившись программно создавать презентации и манипулировать слайдами и их объектами, мы можем перейти к автоматизации показа презентаций. Об этом и пойдет речь далее.

В начало

В начало

Демонстрация слайдов

Для показа слайдов используется метод Run объекта SlideShowSettings, являющегося свойством объекта Presentation:

App.Presentations.Item(1).SlideShowSettings.Run;

Для установки режима показа слайдов также используется объект SlideShowSettings. Его свойство RangeType указывает, какой именно фрагмент презентации нужно демонстрировать. Возможные значения этого свойства следующие:

 const
   ppShowAll = $00000001; //вся презентация
   ppShowSlideRange = $00000002; //выделенный диапазон слайдов
   ppShowNamedSlideShow = $00000003; //именованная демонстрация

Свойства StartingSlide и EndingSlide объекта SlideShowSettings содержат номера первого и последнего слайда демонстрируемого фрагмента. Эти свойства имеет смысл применять в случае, если свойство RangeType этого же объекта равно ppShowSlideRange.

Свойство AdvanceMode объекта SlideShowSettings указывает, каким образом производится смена слайдов при демонстрации:

 const
   ppSlideShowManualAdvance = $00000001; //ручная смена слайдов
   ppSlideShowUseSlideTimings = $00000002; //смена слайдов в соответствии с временем показа каждого слайда
   ppSlideShowRehearseNewTimings = $00000003; //запись времени показа слайдов

Свойство LoopUntilStopped объекта SlideShowSettings, принимающее значения True или False, указывает, демонстрируются ли слайды непрерывно до нажатия пользователем клавиши Esc. Это свойство целесообразно применять, если свойство AdvanceMode объекта SlideShowSettings установлено равным ppSlideShowUseSlideTimings. Отметим также, что время показа слайдов, если таковое не записано пользователем вручную, также можно установить программно — с помощью свойства SlideShowTransition объекта Slide, например:

App.Presentations.Item(2).Slides.Item(5).SlideShowTransition.AdvanceTime := 1;
App.Presentations.Item(2).Slides.Item(5).SlideShowTransition.AdvanceOnTime := True;

Следующий пример иллюстрирует применение описанных выше свойств и методов:

for i:=2 to 7 do
begin
 App.Presentations.Item(1).Slides.Item(i).SlideShowTransition.AdvanceTime := 1;
 App.Presentations.Item(1).Slides.Item(i).SlideShowTransition.AdvanceOnTime := True;
end;
App.Presentations.Item(1).SlideShowSettings.StartingSlide:=2;
App.Presentations.Item(1).SlideShowSettings.EndingSlide:=7;
App.Presentations.Item(1).SlideShowSettings.AdvanceMode:=ppSlideShowUseSlideTimings;
App.Presentations.Item(1).SlideShowSettings.LoopUntilStopped:=True;
App.Presentations.Item(1).SlideShowSettings.RangeType:=ppShowSlideRange;
App.Presentations.Item(1).SlideShowSettings.Run;

В данном фрагменте кода время показа слайдов со второго по седьмой устанавливается равным одной секунде, далее указывается, что эти слайды будут демонстрироваться в соответствии с заданным временем непрерывно до нажатия клавиши Esc, а затем запускается показ слайдов.

Свойство SlideShowTransition объекта Slide может быть использовано для определения анимационных эффектов при смене слайдов. Следующий фрагмент кода иллюстрирует, каким образом устанавливаются анимационные эффекты и звуковое сопровождение при смене слайда:

Const
   ppEffectBlindsVertical = $00000302;
… 
App.Presentations.Item(1).Slides.Item(2).SlideShowTransition.EntryEffect := ppEffectBlindsVertical;
App.Presentations.Item(1).Slides.Item(2).SlideShowTransition.SoundEffect.ImportFromFile ('C:\Program Files\NetMeeting\blip.wav');

Константы, соответствующие различным эффектам, можно найти в интерфейсном модуле или справочном файле.

А теперь кратко остановимся на управлении поведением объектов при показе слайдов. Для управления анимацией объектов на слайдах следует использовать свойство AnimationSettings объекта Shape. Это свойство возвращает объект AnimationSettings, свойства которого и отвечают за анимацию данного объекта. Так, свойство AdvanceMode указывает, каким образом появляется объект, а свойство AdvanceTime — через какое время после показа слайда появляется объект. Свойство TextLevelEffect определяет, до какого уровня текста происходит анимация объекта. И наконец, свойство Animate (принимающее значения False или True) указывает, должен ли объект вообще отображаться с анимацией. Пример управления поведением объекта на слайде приведен ниже:

const
    ppAnimateByAllLevels = $00000010;
    ppAdvanceOnTime = $00000002;
... 
App.Presentations.Item(1).Slides.Item(3).Shapes.Item(1).AnimationSettings.AdvanceMode := _
ppAdvanceOnTime; App.Presentations.Item(1).Slides.Item(3).Shapes.Item(1).AnimationSettings.AdvanceTime := 1;
App.Presentations.Item(1).Slides.Item(3).Shapes.Item(1).AnimationSettings.TextLevelEffect := _
ppAnimateByAllLevels; App.Presentations.Item(1).Slides.Item(3).Shapes.Item(1).AnimationSettings.Animate := True;

Этот фрагмент кода устанавливает автоматическую анимацию первого объекта на третьем слайде через одну секунду после показа слайда.

Итак, в данном разделе мы изучили основные операции, которые наиболее часто применяются при автоматизации Microsoft PowerPoint. Естественно, возможности автоматизации этого сервера отнюдь не исчерпываются приведенными примерами, и при необходимости подобные сведения об этом всегда можно найти в соответствующем справочном файле. Описания некоторых операций, аналогичных соответствующим операциям при автоматизации Microsoft Word и Excel (например, обращение к свойствам документов), были опущены во избежание повторов.

Следующим приложением Microsoft Office, автоматизацию которого мы рассмотрим, будет Microsoft Outlook — один из самых популярных на сегодняшний день персональных информационных менеджеров (Personal Information Manager, PIM).

В начало

В начало

Автоматизация Microsoft Outlook

Этот раздел посвящен наиболее часто встречающимся задачам, связанным с автоматизацией Microsoft Outlook. Но прежде мы рассмотрим, каковы программные идентификаторы основных объектов Microsoft Outlook и что представляет собой его объектная модель.

Программные идентификаторы и объектная модель Microsoft Outlook

Как и в случае Microsoft PowerPoint, для приложения-контроллера доступен непосредственно один объект:

 

Объект

Программный идентификатор

Комментарий

Application

Outlook.Application, Outlook.Application.9

С помощью этого программного идентификатора создается экземпляр приложения

Все остальные объекты Outlook являются внутренними объектами.

На рис. 2 дан небольшой фрагмент объектной модели Microsoft Outlook:

В объектной модели Outlook основным объектом является Application. В отличие от рассмотренных выше корневых объектов Word.Application, Excel.Application, PowerPoint.Application, объект Outlook.Application не содержит коллекций. Однако с помощью метода GetNameSpace он позволяет получить объект NameSpace, предоставляющий доступ к источникам данных. В текущей версии Outlook подерживается единственный источник данных — «MAPI», предоставляющий доступ ко всем данным Outlook. Объект NameSpace содержит коллекции Folders объектов типа MAPIFolder, AddressLists объектов типа AddressList и некоторые другие. Каждый объект MAPIFolder (представляющий папку Outlook), в свою очередь, содержит коллекцию Items объектов типа Item (элементы, содержащиеся в папке, например сообщения), а каждый объект Item содержит несколько других коллекций (например, Attachments, Recipients, Links). Каждый объект AddressList (список адресов) содержит коллекцию AddressItems объектов AddressItem.

Ниже мы рассмотрим наиболее часто встречающиеся задачи, связанные с автоматизацией Microsoft Outlook. Если ваша задача не совпадает ни с одной из перечисленных, вы можете обратиться в поисках подходящего примера на Visual Basic в справочный файл VBAOUTLL9.CHM либо, как и в случае других приложений Microsoft Office, записать соответствующий макрос и проанализировать его код.

В начало

В начало

Запуск Microsoft Outlook, открытие и создание папок

Для создания примеров использования Microsoft Outlook можно взять код создания контроллера, приведенный в разделе об автоматизации PowerPoint, заменив первый оператор в представленном примере на следующий:

AppProgID := 'Outlook.Application';

и заменить комментарии кодом, манипулирующим свойствами и методами объекта Outlook.Application. Добавим также несколько переменных для объектов NameSpace и MAPIFolder:

var
      App, NS, FLD               : Variant;

Создать новую сессию Outlook можно с помощью метода Logon объекта NameSpace. Этот метод имеет четыре параметра. Первые два параметра строковые и содержат имя профиля пользователя и его пароль. Третий параметр, принимающий значение True или False, указывает, следует ли выводить диалог ввода имени и пароля, четвертый — создавать ли новую сессию, например:

NS := App.GetNamespace('MAPI');
NS.Logon('MyProfile','MyPasssword', False, False);

Все эти параметры не являются обязательными в случае позднего связывания. Так, при отсутствии профилей пользователя можно применить такой фрагмент кода:

NS := App.GetNamespace('MAPI');
NS.Logon;

Чтобы завершить работу Outlook, следует вызвать метод Logoff объекта NameSpace:

NS.Logoff;
App.Quit;

Для открытия папки Outlook нужно с помощью метода GetDefaultFolder объекта указать, какая папка будет открыта, а затем показать окно Outlook с помощью метода Display объекта MAPIFolder:

FLD := NS.GetDefaultFolder(olFolderInbox);
FLD.Display;

Возможные значения параметра метода GetDefaultFolder, соответствующие стандартным, создаваемым по умолчанию папкам Outlook, перечислены ниже:

 const
   olFolderDeletedItems = $00000003; //папка «Deleted Items»
   olFolderOutbox = $00000004; //папка «Outbox»
   olFolderSentMail = $00000005; //папка «Sent»
   olFolderInbox = $00000006; //папка «Inbox»
   olFolderCalendar = $00000009; //папка «Calendar»
   olFolderContacts = $0000000A; //папка «Contacts»
   olFolderJournal = $0000000B; //папка «Journal»
   olFolderNotes = $0000000C; //папка «Notes»
   olFolderTasks = $0000000D; //папка «Tasks»
   olFolderDrafts = $00000010; //папка «Drafts»

Стандартные папки могут содержать элементы определенного типа (например, почтовые сообщения). Подробнее об элементах мы поговорим ниже.

Для смены папки в процессе работы Outlook можно снова вызвать метод GetDefaultFolder объекта NameSpace.

Папки Outlook представляют собой иерархию вложенных объектов, поэтому каждый объект MAPIFolder обладает свойством Folders; корневым объектом в этой иерархии является объект NameSpace. Создание новой папки можно осуществить с помощью метода Add коллекции Folders. Например, представленный ниже фрагмент кода создает папку MyBox1 внутри заданной папки:

FLD := NS.GetDefaultFolder(olFolderInbox);
FLD.Display;
FLD.Folders.Add('MyBox1');

По умолчанию дочерняя (вложенная) папка наследует тип родительской папки.

Объект MAPIFolder обладает свойством Parent, указывающим на папку верхнего уровня. Следующий пример кода иллюстрирует создание новой папки на том же уровне иерархии, где находится папка, соответствующая переменной FLD:

FLD.Parent.Folders.Add('MyBox2');

Для удаления папки Outlook можно использовать метод Delete объекта MapiFolder:

FLD.Folders('MyBox1').Delete;

Освоив манипуляцию папками, перейдем к манипуляции элементами внутри папок.

В начало

В начало

Манипуляция элементами папок

Доступ к элементам внутри папок Outlook осуществляется с помощью коллекции Items объекта MAPIFolder. К конкретному элементу можно обращаться по имени, например:

FLD.Items('MIDAS Essential Pack')

либо по порядковому номеру в коллекции:

FLD.Items(1)

Отметим, что, в зависимости от того, какой папке принадлежат элементы, коллекция Items может содержать различные типы соответствующих им объектов. Например, объекты типа TаskItem соответствуют задачам, MailItem — письмам, ContactItem — контактам и т.д. Они могут иметь разные наборы свойств, которые различны для разных типов элементов. Некоторые элементы могут содержать коллекции других элементов, например объект MailItem содержит коллекцию Recipients объектов Contact (адресов электронной почты, куда отправляется сообщение).

Для добавления объекта в папку используется метод Add коллекции Items. Он имеет один необязательный целый параметр, указывающий на тип добавляемого объекта:

FLD.Items.Add(olMailItem);

Возможны следующие значения этого параметра:

 const
   olMailItem = $00000000; //почтовое сообщение
   olAppointmentItem = $00000001; //встреча
   olContactItem = $00000002; //контакт
   olTaskItem = $00000003; //задача
   olJournalItem = $00000004; //запись в журнале
   olNoteItem = $00000005; //заметка
   olPostItem = $00000006; //сообщение, помещаемое для общего доступа

Если параметр метода Add коллекции Items не указан, то по умолчанию создается элемент, соответствующий типу родительской папки. Если же папке не присвоен конкретный тип, создается объект MailItem.

Отметим, что если тип создаваемого элемента не соответствует типу родительской папки, то такой элемент будет помещен в стандартную папку, соответствующую его типу.

Кроме того, создать новый элемент можно с помощью метода CreateItem объекта Application:

Var MyItem: Variant;
... 
MyItem:=App.CreateItem(olContactItem);

В этом случае новый элемент окажется в соответствующей стандартной папке.

Печать текста элемента осуществляется обычно с помощью метода PrintOut, например:

FLD.Items('MIDAS Essential Pack').PrintOut;

Ознакомившись с элементами папок в целом, мы рассмотрим манипуляции элементами конкретных типов. Начнем с управления почтовыми сообщениями.

В начало

В начало

Манипуляция сообщениями электронной почты

Для доступа к сообщениям электронной почты следует обратиться к коллекции Items соответствующих папок и добавлять в них объекты MailItem либо воспользоваться методом CreateItem объекта Application, например:

Var IM: Variant;
... 
IM:=FLD.Items.Add(olMailItem);

Как известно, почтовое сообщение должно иметь хотя бы одного адресата. Имена адресатов содержатся в коллекции Recipients объекта MailItem. Добавить е-mail адресата можно следующим образом:

IM.Recipients.Add('Ivanov@ivanovconsulting.ru');

Если адресат зарегистрирован в адресной книге, то можно добавить его, сославшись не на e-mail, а на имя:

IM.Recipients.Add('Ivan Ivanov’);

Отметим, однако, что если такое имя не зарегистрировано в адресной книге, то адресат найден не будет и пользователь получит сообщение об ошибке.

Если адресат должен получить копию письма (то есть его адрес должен находиться в полях CC или BCC), следует изменить свойство Type соответствующего элемента коллекции Recipients, например:

IM.Recipients.Add('Sidorov@ivanovconsulting.ru');
IM.Recipients.Add('Petrov@ivanovconsulting.ru');
IM.Recipients('Sidorov@ivanovconsulting.ru').Type:=olCC;
IM.Recipients('Petrov@ivanovconsulting.ru').Type:=olBCC;

Возможные значения этого свойства таковы:

 const
   olTo = $00000001; // поле «To»
   olCC = $00000002; // поле «СС»
   olBCC = $00000003; // поле «BCC»

Для почтовых сообщений это свойство по умолчанию равно olTo.

С помощью свойств To, CC и BCC объекта MailItem можно определить содержимое этих полей почтового сообщения. Адрес автора письма содержится в свойстве SenderName.

Адрес получателя письма — обязательный атрибут почтового сообщения. Однако в подавляющем большинстве случаев такие сообщения обладают также темой и текстом. Тема сообщения может быть определена в свойстве Subject объекта MailItem:

IM.Subject := 'Your last invoice   ';

Текст сообщения содержится в свойстве Body объекта MailItem, например:

 IM.Body := 'Ваш счет оплачен сегодня'+chr(13)+'С уважением, А.А.Козлов’;

либо

IM.Body := Memo1.Text;

Для добавления к почтовому сообщению вложений следует использовать коллекцию Attachments объекта MailItem, к примеру:

IM.Attachments.Add(‘C:\screen.zip’);

Чтобы указать степень приоритетности письма, используют свойство Importance объекта MailItem. Кроме того, можно использовать свойства Sent, Saved, UnRead для определения того, отправлено ли это письмо, сохранено либо осталось непрочтенным.

Для сохранения письма в папке Drafts используется метод Save, для помещения его в папку Outbox с целью отправки — метод Send, для отображения в стандартном окне Outlook — метод Display.

При ответе на почтовое сообщение можно применить метод Reply объекта MailItem, возвращающий другой объект MailItem, например:

 IM:=FLD.Items(1).Reply;
IM.Body := 'Спасибо за высланные материалы'+chr(13)+'С уважением, И.И.Иванов’;

Для пересылки сообщения другому адресату используется метод Forward, также возвращающий объект MailItem:

IM:=FLD.Items(‘MIDAS Essential Pack’).Forward;
IM.Recipients.Add('Ivan Ivanov’);

Как было сказано выше, адреса для отправки сообщений электронной почты обычно содержатся в адресной книге. Далее мы поговорим о том, как манипулировать контактами, содержащимися в адресной книге (то есть в папке Contacts).

В начало

В начало

Манипуляция контактами

Для доступа к контактам следует обращаться к коллекции Items папок, содержащих контакты (по умолчанию это папка Contacts). Контакты создаются путем добавления в них объектов ContactItem либо с помощью метода CreateItem объекта Application, например:

Var CT: Variant;
... 
CT:=FLD.Items.Add(olContactItem);

Набор свойств объекта ContactItem соответствует данным, которые могут относиться к конкретному человеку (имя, фамилия, служебный и домашний телефоны, e-mail, домашняя страница, дата рождения, пол, имена детей и др.). Названия свойств соответствуют этим данным: FirstName, LastName, BusinessPhone, HomePhone, Birthday, Gender, Children и т.д. Всего таких названий несколько десятков, и подробности о них можно найти в справочном файле. Ниже представлен пример создания контакта, содержащего сведения об имени, фамилии, компании, адресе электронной почты и мобильном телефоне:

 CT.Email1Address:='ivanov@ivanovconsulting.ru';
CT.FirstName:='Иван';
CT.LastName:='Иванов';
CT.CompanyName:='Ivanov Consulting';
CT.MobileTelephoneNumber:='123-4567';
CT.Save;

Как видно из этого кода, для сохранения контакта в адресной книге следует применить метод Save объекта ContactItem.

Манипуляция заметками и задачами

Для доступа к заметкам нужно обратиться к коллекции Items папок, содержащих заметки (по умолчанию это папка Notes). Заметки создаются путем добавления в эти папки объектов NoteItem либо с помощью метода CreateItem объекта Application, например:

Var Note: Variant;
… 
Note := App.CreateItem(olNoteItem);

Как и в предыдущих примерах, создав элемент Outlook, нужно определить его свойства, а затем сохранить его:

Note := App.CreateItem(olNoteItem);
Note.Color := olBlue;
Note.Body := 'This is a body of note    fff';
Note.Save;

Возможные значения цветов подложки заметок приведены ниже:

 const
   olBlue = $00000000; //синий
   olGreen = $00000001; //зеленый
   olPink = $00000002; //розовый
   olYellow = $00000003; //желтый
   olWhite = $00000004; //белый

Для доступа к задачам следует обращаться к коллекции Items папок, содержащих задачи (по умолчанию это папка Tasks). Здесь, как и в предыдущих случаях, задачи создаются путем добавления в эти папки объектов TaskItem либо с помощью метода CreateItem объекта Application, например:

Task:=App.CreateItem(olTaskItem);

Аналогично предыдущим примерах, создав задачу, нужно определить ее свойства (текст, описание, время напоминания о задаче и др.), сохранить ее. В приведенном ниже примере создается задача, о которой следует напомнить 6 сентября 2000 года в 17 часов 30 минут:

 Task:=App.CreateItem(olTaskItem);
 Task.Body:='Позвонить Сидорову по поводу завтрашней встречи';
 Task.Subject:='Звонок Сидорову';
 Task.ReminderSet:=True;
 Task.ReminderTime:=StrToDateTime('06.09.2000 17:30:00');
 Task.ReminderPlaySound := True;
 Task.Save;

Отметим, что в Delphi и C++Builder при определении свойств объектов Outlook, содержащих дату и время, можно использовать переменные типа TDateTime.

Манипуляция другими объектами Outlook осуществляется примерно таким же образом; напомним, однако, что наборы свойств и методов различных типов объектов не совпадают. Более подробно о манипуляции другими типами объектов можно узнать из справочного файла.

Итак, в этом разделе мы изучили основные операции, которые наиболее часто применяются при автоматизации Microsoft Outlook. Сведения о других возможных операциях при автоматизации Outlook и примеры для Visual Basic for Applications можно найти в сответствующем справочном файле.

В следующей статье данного цикла будет рассмотрена автоматизация Microsoft Access — одной из наиболее популярных в настоящий момент настольных СУБД.

КомпьютерПресс 12'2000