Visual Basic 6. Руководство разработчика

       

Рекурсивный просмотр папки


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.


Содержание раздела