Рекурсивный просмотр папки
Contacts
В проекте Contacts из предыдущего параграфа подразумевалось, что все контакты хранятся в папке Contacts (точно также и в других проектах подразумевается, что все сообщения постоянно находятся в одной папке) Это приемлемо для пользователей с небольшим числом контактов (или полностью неорганизованных пользователей), но в общем случае это не так. Большинство пользователей организует контакты в подпапки для упрощения поиска. Но организовать просмотр папки Contacts вместе с подпапками не так-то просто. Для реализации такой возможности требуется использовать методы рекурсивного программирования. Если во время чтения гл. 11 " Использование рекурсивных методов" могло показаться, что рассматриваемые методы больше нигде не понадобятся, то в данном случае есть возможность убедиться в обратном. Пусть это не покажется вам навязчивой пропагандой в пользу применения рекурсии, но есть задачи, которые невозможно решить другими способами. Сколь трудным и непривычным не казался бы рекурсивный подход к программированию, но без него невозможно организовать циклический просмотр папки Contacts, при условии, что в ней содержатся подпапки (точно так же, как выполнить обход дерева Tree View).
VB6 в действии: проект AIIContacts
Одноименное приложение, демонстрирующее рекурсивную процедуру просмотра папки Contacts, может быть найдено в папке ALLCONTS, находящейся на компакт-диске в папке, посвященной этой главе. Если после загрузки формы приложения щелкнуть на кнопке Populate Tree, то окно элемента управления TreeView будет заполнено названиями всех подпапок папки Contacts (рис. 14.22). После этого можно открывать различные папки в окне элемента управления TreeView и просматривать список всех контактов в окне элемента управления ListBox (справа).

Рис. 14.22. В проекте AIIContacts в окне элемента управления TreeView (слева) выводится список (дерево) всех подпапок папки Contacts приложения Outlook
Исходный текст приложения
Программа, как всегда, начинается с описания переменных. Сначала объявляются следующие объектные переменные, используемые большинством процедур:
Public OutlookApp As outlook.Application
Public OlObjects As outlook.NameSpace
Public OlContacts.As outlook.MAPIFolder
Затем в событии Load формы введите следующие операторы для создания нового экземпляра Outlook и объектных переменных, необходимых для обращения к его папкам.
Программа 14.24. Создание объектной переменной Outlook
Private Sub Form Load()
Set OutlookApp = CreateObject ("Outlook.Application.8")
If Err Then
MsgBox "Could not create Outlook Application object!"
'(He удалось создать объект Outlook Application!)
End
End If
Set OlObjects = OutlookApp.GetNamespace("MAPI")
Set OlContacts = OlObjects.GetDefaultFolder(olFolderContacts)
If Err Then
MsgBox "Could not get MAPI NameSpace" , YbCritical
' (He удалось получить место расположения MAPI...)
End If
End Sub
Переменная
OutlookApp
представляет приложение. Переменная OlObjects - все папки, предоставленные Outlook, и переменная OlContacts -
папку Contacts. Эти переменные объявлены следующим образом:
Public OlObjects As outlook.NameSpace
Public OlContacts As outlook.MAPIFolder
Ядром приложения является обработчик события Click команды Populate Tree, который заполняет окно элемента управления TreeView с помощью рекурсивной процедуры.
Программа 14.25. Заполнение окна элемента управления TreeView
Private Sub Command1_Click ()
Dim allFolders As outlook.Folders
Dim Folder As outlook.MAPIFolder
Dim Folders As outlook.Folders
Dim thisPolder As outlook.MAPIFolder
Dim newNode As Node
' Добавление корневого узла
Set newNode = TreeViewl.Nodes.Add(, , OlContacts.EntryID, "Contacts")
newNode.Expanded =
True
' Получение списка подпапок в папке Contacts
Set allFolders = OlContacts.Folders
' Обработка отдельных подпапок в папке Contacts
For Each Folder In allFolders
Set newNode = TreeViewl.Nodes.Add(OlContacts.EntryID, _
tvwChild, Folder.Name, Folder.Name)
Set Folders = Folder.Folders
For Each thisFolder In Folders
Set newNode = TreeViewl.Nodes.Add(Folder.Name, _
tvwChild, thisFolder.EntryID,
thisFolder.Name)
newNode.Expanded = True
' теперь просматривается содержимое подпапок текущей папки
ScanSubFolders thisFolder
Next
Next
End Sub
Чтобы заполнить окно элемента управления TreeView, сначала добавляется корневой узел, который, в данном случае, является папкой Contacts. Этот узел не имеет родительского узла, а ключом для него является значение свойства Entry ID папки Contacts:
Set newNode = TreeViewl.Nodes.Add(, , OlContacts.EntryID, _
"Contacts")
newNode.Expanded = True
Как только узел добавлен, он дополняется таким образом, чтобы пользователь видел имена подпапок под ним и знак "плюс" перед их именами. Затем необходимо создать семейство allFolders,
которое содержит все подпапки папки Contacts:
Set allFolders = OlContacts.Folders
Цикл, приведенный в программе 14.26, просматривает каждый элемент этого семейства и добавляет имя текущей папки к содержимому окна элемента управления TreeView. Новый узел становится дочерним узлом узла Contacts, а его ключом является значение свойства EntryID родительского узла.
Затем следует создать другое семейство - Folders, содержащее подпапки текущей папки. Элементы этого семейства добавляются к содержимому окна элемента управления TreeView, после чего вызывается подпрограмма ScanSubFolders(), позволяющая просмотреть подпапки каждого элемента семейства. Код подпрограммы ScanSubFoldersO приведен ниже.
Программа 14.26.
Подпрограмма ScanSubFolders()
Sub ScanSubFolders(thisFolder As Object)
Dim subFolders As outlook.Folders
Dim subFolder As outlook.MAPIFolder
Set subFolders = thisFolder.Folders
If subFolders.Count <> 0 Then
strFolderKey = thisFolder.EntryID
For Each subFolder In subFolders
TreeViewl.Nodes.Add thisFolder.EntryID, _
tvwChild, subFolder.EntryID, subFolder.Name
ScanSubFolders subFolder
Next
End If
End Sub
Это очень простая программа (для рекурсивной процедуры, разумеется). Она позволяет создать семейство subFolders
подпапок текущей папки. Затем программа просматривает каждый элемент семейства, добавляет его имя к содержимому окна элемента управления TreeView и, при этом, выполняет этот просмотр рекурсивно. Это означает, что она вызывает сама себя, передавая в качестве параметра имя текущей папки.
Просмотр контактов папки
После заполнения окна элемента управления TreeView подпапками папки Contacts можно с помощью мыши в этом окне выбрать папку, чтобы отобразить ее контакты в окне элемента управления ListBox (с правой стороны формы). После того как в окне элемента управления TreeView выполнен щелчок, вызывается обработчик события NodeClick.
Это событие возвращает узел, на котором был выполнен щелчок, после чего можно получить ключ узла, который является ID выбранной папки. Как только стал известен ID выбранной папки, можно создать ссылку на эту папку (переменная thisFolder)
и использовать ее для просмотра содержащихся в ней элементов (т. е. контактов). Ниже приводится текст обработчика события NodeClick в окне элемента управления TreeView.
Программа 14.27. Получение списка содержимого выбранной папки
Private Sub TreeViewl NodeClick(ByVal Node As ComctlLib.Node)
Dim thisFolder As outlook.MAPIFolder
Dim contacts As outlook.Items
Dim Contact As outlook.Contactltem
On Error Resume Next
List1.Clear
Labell.Caption = "Selected Folder: " & Node.Text
' (Выбранная папка:...)
Set thisFolder = OlObjects.GetFolderFromID(Node.Key)
If Err Then
Exit Sub
Else
Set contacts = thisFolder.Items
For Each Contact In contacts
List1.AddItem Contact.LastName & ", " & _
Contact.FirstName
Next
End If
End Sub
Программа позволяет отобразить только значения свойств
LastName и FirstName контакта. Пользователь может изменить программу, чтобы можно было отображать содержимое любых полей. Например, можно получать адрес электронной почты контакта и автоматически разослать по этим адресам сообщения (как это было сделано в предыдущем примере). Если эти примеры представляются вам интересными, можете вставить фрагмент программы AlIContacts в проект Contacts.
Этим примером заканчивается введение в автоматизацию
OLE. Если добавить ссылки на различные Office-приложениям в пользовательских проектах, а затем открыть Object Browser, то можно обнаружить, что теперь они предоставляют много объектов, которые, в свою очередь, предоставляют многочисленные свойства и методы. Автоматизация Office-приложений с помощью VBA вполне по силам среднему программисту, и, кроме того. она предоставляет возможность ознакомиться с объектами, предоставляемыми Office-приложениями (или любыми другими приложениями, которые поддерживают VBA). После чтения этой главы читатель получит знания об основах программирования в VBA и понимание того обстоятельства, что программирование в VBA не многим отличается от программирования BVB6.
Глава 15 Конструирование компонентов ActiveX
• Модули и модули классов
• Конструирование модулей классов
• Реализация свойств и методов
• Инициирование событий из кода класса
• Создание и использование объектных переменных
• Регистрация компонентов ActiveX
• Обработка ошибок в классах
В предыдущей главе было показано, как установить связь с приложением-сервером и как управлять его работой с помощью объектов, которые оно предоставляет. В этой главе объясняется, как создавать свои собственные приложения-серверы или так называемые компоненты ActiveX. Компонент ActiveX — это общий термин, который относится к трем (в будущем, возможно, и более) типам проектов: ActiveX DLL, ActiveX EXE и элементам управления ActiveX. В этой главе мы познакомимся с конструированием программных компонентов
(ActiveX DLL и ActiveX EXE), которые являются приложениями-серверами, интерфейс которых состоит из свойств, методов и событий.
В следующей главе будет показано, как создавать свои собственные элементы управления ActiveX, которые могут быть добавлены на панель элементов управления любого проекта и использоваться разработчиками при конструировании пользовательских интерфейсов. В гл. 20 показано, как элементы управления ActiveX могут быть использованы на Web-страницах.
Главные отличия между элементами управления ActiveX и программными компонентами ActiveX заключаются в их интерфейсах и способе встраивания в среду разработки Visual Basic. В то время как элементы управления ActiveX полностью интегрированы в Visual Basic и имеют визуальный интерфейс, программные компоненты, напоминающие по функциональным возможностям элементы управления ActiveX, менее интегрированы со средой разработчика (их, например, нельзя поместить на форму, как это можно сделать с элементом управления) и не имеют визуального интерфейса. Программные компоненты ActiveX являются классами, которые доступны через объявляемую соответствующим образом объектную переменную.
Другой категорией компонентов ActiveX являются документы ActiveX — это приложения, которые могут располагаться в таких контейнерах, как Internet Explorer и Office Binder. В этой книге мы не будем рассматривать документы ActiveX, которые, на самом деле, очень похожи на программные компоненты ActiveX и элементы управления ActiveX.