Инициализация формы


В предыдущем разделе мы говорили о статическом изменении свойств элементов управления, но это лишь первичная настройка объектов формы. Как правило, основные свойства, связанные с инициализацией данных, переносятся в программный модуль формы.
Рассмотрением инициализации подобных свойств мы и займемся в этой главе, но для начала несколько слов о форме как таковой. Если рассматривать форму с позиций программирования, то она представляет собой не что иное, как класс VBA. Членами этого класса являются элементы управления, расположенные на форме, а методами — show (показать форму), Hide (скрыть форму) и т. д. Более того, пользователь может добавлять собственные члены и методы.
Помимо этого форма обладает и рядом процедур реакции на событие, стандартными из которых для всех классов VBA являются initialize и Terminate.
Вернемся к нашей задаче и вспомним, что нам необходимо проинициализи-ровать три списка нашей формы, а именно: series, author и duration. Если duration фиксирован и состоит из 12 элементов (12 месяцев), то относительно списков авторов и серий так сказать нельзя. Количество членов в группе писателей может увеличиваться и уменьшаться, ровно также дело обстоит и с сериями. Исходя из этого пользователь должен иметь возможность, не модифицируя кода программы, изменить количество элементов любого из списков.
В следующих разделах подробно описываются способы инициализации списков.
Статическое заполнение списка
Начнем, пожалуй, с самого простого статического заполнения списка duration, который просто состоит из двенадцати цифр, одну из которых пользователь (редактор) должен выбрать в качестве ориентировочной длительности проекта.
Статическое заполнение списка
{На панели 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.
Вызов процедуры из конструктора
Private Sub UserForm_Initialize()
Init_Duration End Sub
Теперь, нажав клавишу <F5>, вы можете убедиться, что список duration инициализируется верно.
Работа с файлами
Следующий список, который необходимо инициализировать, — series. В отличие от duration, как было отмечено выше, этот список может изменяться, поэтому мы решили хранить список с названием серий в специальном файле bookseries.ini и забирать информацию для инициализации именно оттуда.

Таким образом, пользователю необходимо лишь добавить название новой серии в данный файл, как сделанные изменения тут же отобразятся в форме. Архитектура файла инициализации показана на.
Итак, перейдем непосредственно к написанию кода процедуры. Для ввода кода программы опять необходимо перейти в окно редактора кода, для чего выделите форму и нажмите клавишу <F7>.
Работа с файлами
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, который теперь будет выглядеть следующим образом.
Вызов процедуры lnit_Series из конструктора
Private Sub UserForm_Initialize()
Init_Duration
Init_Series End Sub
Взятие данных из Outlook
В предыдущей программе мы заполняли список динамически, считывая данные из файла. Переходя к инициализации списка авторов, отметим, что эта информация также способна динамически изменяться, но в отличие от серии книг, информация о писателях (по условиям задачи) хранится в Outlook, более того, условимся, что она хранится в отдельной папке Writers, являющейся подпапкой папки Contacts. Тогда процедура инициализации будет выглядеть следующим образом.
Инициализация данных из 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
Итак, прежде всего, мы объявляем ряд переменных, после чего получаем ссылку на папку с контактами и организуем цикл по всем ее элементам. Как видите, все достаточно просто.