Иллюстрированный самоучитель по Outlook 2002
Глава 1
Инициализация
формы
В предыдущем
разделе мы говорили о статическом изменении свойств элементов управления, но
это лишь первичная настройка объектов формы. Как правило, основные свойства,
связанные с инициализацией данных, переносятся в программный модуль формы.
Рассмотрением
инициализации подобных свойств мы и займемся в этой главе, но для начала несколько
слов о форме как таковой. Если рассматривать форму с позиций программирования,
то она представляет собой не что иное, как класс VBA. Членами этого класса являются
элементы управления, расположенные на форме, а методами — show (показать форму),
Hide (скрыть форму) и т. д. Более того, пользователь может добавлять собственные
члены и методы.
Помимо этого
форма обладает и рядом процедур реакции на событие, стандартными из которых
для всех классов VBA являются initialize и Terminate (см. раздел 20.5 "Классы
и объекты").
Вернемся
к нашей задаче и вспомним, что нам необходимо проинициализи-ровать три списка
нашей формы, а именно: series, author и duration. Если duration фиксирован и
состоит из 12 элементов (12 месяцев), то относительно списков авторов и серий
так сказать нельзя. Количество членов в группе писателей может увеличиваться
и уменьшаться, ровно также дело обстоит и с сериями. Исходя из этого пользователь
должен иметь возможность, не модифицируя кода программы, изменить количество
элементов любого из списков.
В следующих
разделах подробно описываются способы инициализации списков.
Статическое заполнение списка
Начнем, пожалуй,
с самого простого статического заполнения списка duration, который просто состоит
из двенадцати цифр, одну из которых пользователь (редактор) должен выбрать в
качестве ориентировочной длительности проекта.
Программа
22.1. Статическое заполнение списка
{На панели
Project} 1R UserForml & View Code {В окне кода}
Private Sub
Init_Duration() 'Инициализация списка duration With duration
For i = 1
To 12
.Addltem
i Next i
.Listlndex
= 0 End With End Sub
Поясним код
программы. Во-первых, мы создаем процедуру, которую впоследствии будем вызывать
из конструктора формы. Во-вторых, используя оператор with, обращаемся к объекту
формы duration. И наконец, в цикле от 1 до 12 инициализируем список.
После того
как мы создали процедуру, ее необходимо вызвать. Естественно, что все процедуры
инициализации мы будем размещать в конструкторе формы — процедуре — реакции
на событие initialize.
Программа
22.2. Вызов процедуры из конструктора
Private Sub
UserForm_Initialize()
Init_Duration
End Sub
Теперь, нажав
клавишу <F5>, вы можете убедиться, что список duration инициализируется
верно.
Работа с файлами
Следующий
список, который необходимо инициализировать, — series. В отличие от duration,
как было отмечено выше, этот список может изменяться, поэтому мы решили хранить
список с названием серий в специальном файле bookseries.ini и забирать информацию
для инициализации именно оттуда.
Рис.
22.4. Архитектура файла bookseries.ini
Таким образом,
пользователю необходимо лишь добавить название новой серии в данный файл, как
сделанные изменения тут же отобразятся в форме. Архитектура файла инициализации
показана на рис. 22.4.
Итак, перейдем
непосредственно к написанию кода процедуры. Для ввода кода программы опять необходимо
перейти в окно редактора кода, для чего выделите форму и нажмите клавишу <F7>.
Программа
22.3. Работа с файлами
Sub Init_Series()
Dim inifile
As Integer
Dim srv As
String
inifile =
FreeFile
iniPath =
"C:\bookseries.ini" 'Открываем файл для чтения
Open iniPath
For Input As tinifile
Do
Input tinifile,
tmp series.Addltem tmp 'Цикл до конца файла
Loop Until
EOF(inifile)
series.Listlndex
= 0 End Sub
Прокомментируем
эту программу. Сначала объявляется переменная inifile, с которой будет отождествлен
файл. Далее открывается файл bookseries. ini (хранящийся в корне диска С), после
чего в цикле от начала до конца файла считываются построчно значения для списка
серий.
Естественно,
что и вызов процедуры init_Series необходимо поместить в тело конструктора userForm_initialize,
который теперь будет выглядеть следующим образом.
Программа
22.4. Вызов процедуры lnit_Series из конструктора
Private Sub
UserForm_Initialize()
Init_Duration
Init_Series
End Sub
Взятие данных из Outlook
В предыдущей
программе мы заполняли список динамически, считывая данные из файла. Переходя
к инициализации списка авторов, отметим, что эта информация также способна динамически
изменяться, но в отличие от серии книг, информация о писателях (по условиям
задачи) хранится в Outlook, более того, условимся, что она хранится в отдельной
папке Writers, являющейся подпапкой папки Contacts. Тогда
процедура инициализации будет выглядеть следующим образом.
Программа
22.5. Инициализация данных из Outlook
Sub Init_Authors()
Объявление
переменных
Dim nms As
NameSpace
Dim fldContacts
As MAPIFolder
Dim itms
As Collection
Dim itm As
Integer
Создание
объекта, указывающего на данные Outlook
Set nms =
Application.GetNamespace("MAPI") 'Создание объекта, указывающего на
папку Контакты
Set fldContacts
= nms.GetDefaultFolder(olFolderContacts) 'Присваеваем объекту значение подпапки
Writers
Set fldContacts
= fldContacts.Folders("Writers") 'создание объекта (семейство), содержащего
все элементы папки Контакты
Set itms
= fldContacts.items 'Организация цикла по всем контактам в папке
For itm =
1 То itms.Count
With itms(itm)
'Инициализация списка именами контактов
authors.Addltem
.LastNameAndFirstName .End With
Next
authors.Listlndex
= 0 End Sub
Итак, прежде
всего, мы объявляем ряд переменных, после чего получаем ссылку на папку с контактами
и организуем цикл по всем ее элементам. Как видите, все достаточно просто.