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

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

Рассмотрением инициализации подобных свойств мы и займемся в этой главе, но для начала несколько слов о форме как таковой. Если рассматривать форму с позиций программирования, то она представляет собой не что иное, как класс VBA. Членами этого класса являются элементы управления, расположенные на форме, а методами — show (показать форму), Hide (скрыть форму) и т. д. Более того, пользователь может добавлять собственные члены и методы.

Помимо этого форма обладает и рядом процедур реакции на событие, стандартными из которых для всех классов VBA являются initialize и Terminate (см. раздел "Классы и объекты").

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

Архитектура файла 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 itms As NameSpace 
Dim fldContacts As MAPIFolder 
Dim itms As Collection 
Dim itms 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 

Итак, прежде всего, мы объявляем ряд переменных, после чего получаем ссылку на папку с контактами и организуем цикл по всем ее элементам. Как видите, все достаточно просто.