Тверской государственный университет
Опубликован: 13.09.2006 | Доступ: свободный | Студентов: 2721 / 260 | Оценка: 4.03 / 3.74 | Длительность: 19:48:00
Специальности: Программист, Менеджер
Лекция 5:

Общность и схожесть объектов Office 2000

< Лекция 4 || Лекция 5: 123456 || Лекция 6 >

Работа с Помощником

Объект Assistant, задающий Помощника, появился в предыдущей версии Office 97. Этот объект используется во всех приложениях Office 97 и Office 2000 для реализации справочной системы. Для этой же цели этот объект может использоваться и при построении собственных решений. Я уделил особое внимание возможностям применения этого объекта в решениях, создаваемых на базе Office 2000.

Инструментальные панели

Инструментальные панели являются основой интерфейса документов Office 2000 любых типов. В собственных разработках не обойтись без создания собственного меню, собственных инструментальных кнопок.

Поиск файлов и свойства документа

Еще две группы объектов, общих для приложений Office 2000, связаны с такими типичными задачами, как поиск файлов и определение свойств документов. Давайте рассмотрим эти задачи чуть более подробно.

Поиск файлов

Задача поиска нужного файла периодически возникает у всех, кто работает с компьютером. В Office 2000 возможности системы поиска возросли, добавились новые критерии поиска. Нужный файл можно разыскать, используя различные ключи и их комбинацию. Ключами поиска могут служить тип файла, его размер, дата создания, дата последней модификации, любая часть имени файла, ключевые слова, наконец, любой текст, содержащийся в файле.

Я уже говорил, что в Office 2000, - во всех его приложениях изменился внешний вид диалогового окна открытия файла (меню Файл | Открыть…). Это диалоговое окно служит и для поиска файлов. Используя многочисленные флажки, окна ввода, раскрывающиеся списки можно задать сложный критерий поиска, представляющий логическое выражение, где отдельные выражения объединены логическими операциями конъюнкции и дизъюнкции - "И" и "ИЛИ".

У программиста есть две возможности в организации поиска файлов - использовать объект FileSearch или коллекцию Dialogs, которая является схожим, а не общим объектом, имея свою специфику в каждом приложении. О коллекции Dialogs поговорим позже, когда будем рассматривать объекты конкретного приложения, а сейчас займемся объектом FileSearch, который обладает всей функциональностью системы поиска файлов, не требуя при этом от пользователя формирования критериев поиска вручную в диалоговом окне. Для программистов это может быть важным, поскольку по тем или иным причинам он может не хотеть предоставлять пользователям возможности самостоятельного поиска нужного файла, оберегая их, например, от возможных ошибок.

Следует сказать, что хотя в Office 2000 возможности поиска расширились и даже, как я уже говорил, изменился интерфейс соответствующего диалогового окна, это не сказалось на объектной модели. Объект FileSearch был спроектирован достаточно хорошо, так что он сохранил практически все свои свойства и методы, а его новые возможности реализуются простым расширением набора возможных значений его параметров. Я постараюсь рассказать обо всех возможностях программной организации поиска файлов на примере, в котором использую практически все методы и свойства объекта Filesearch. Так что перейдем к примеру:

Public Sub LookingFor()
	'Для поиска файлов используется объект FileSearch
	Dim Report As String
	Dim i As Integer
	With Application.FileSearch
		.NewSearch
		.FileName = "Ch"
		.FileType = msoFileTypeWordDocuments
		.LastModified = msoLastModifiedAnyTime
		.LookIn = "e:"
		.SearchSubFolders = True
		.TextOrProperty = "Общее"
		.MatchAllWordForms = True
		.MatchTextExactly = False
		'Добавление других критериев поиска
		AddCriteria
		If .Execute(SortBy:=msoSortByLastModified, _
				 SortOrder:=msoSortOrderDescending) > 0 Then
			Report = "Найдено " & .FoundFiles.Count & " файлов!" & vbCrLf
			For i = 1 To .FoundFiles.Count
			Report = Report & .FoundFiles(i) & vbCrLf
			Next i
			Call MsgBox(Report, vbInformation, "Отчет о найденных файлах!")
		 End If
	 End With
	PrintTest
End Sub
Листинг 5.1.

Прежде всего, следует заметить, что объект FileSearch находится на самом верху иерархии объектов, он встроен непосредственно в объект Application и возвращается при вызове соответствующего свойства этого объекта. Таким образом, для всех документов приложения действует единый объект FileSearch, что необходимо учитывать при многократном обращении к этому объекту. Именно поэтому наш поиск начинается с вызова метода NewSearch, который восстанавливает значения параметров поиска, принятые по умолчанию, так как в противном случае будут сохраняться значения параметров, установленные в предыдущем вызове объекта FileSearch. Далее в примере устанавливаются различные свойства объекта FileSearch, задающие критерии поиска. Рассмотрим их подробнее:

  • Свойство Filename задает строку, представляющую полное имя или часть имени разыскиваемого файла. В нашем примере разыскиваются файлы, имя которых содержит сочетание "Ch".
  • Свойство FileType ограничивает поиск, задавая тип разыскиваемого файла. Значения этого свойства задаются соответствующим набором констант. В нашем примере разыскиваются файлы, представляющие документы Word.
  • Свойство LastModified задает время последней модификации файла, - это может быть последний месяц или прошлая неделя, что устанавливается соответствующей константой. В нашем примере не накладываются ограничения на время модификации файла, он мог быть модифицирован в любое время .
  • Свойство LookIn задает местоположение разыскиваемого файла. В данном случае ищутся файлы, расположенные на локальном диске "E".
  • Булево свойство SearchSubFolders позволяет указать, как в нашем примере, что поиск следует вести в глубину, используя все подпапки исследуемых каталогов.
  • Свойство TextOrProperty позволяет задать строку, вхождение которой будет разыскиваться в теле файла или в его свойствах. В нашем примере я задаю для поиска слово "общее", но будут найдены все файлы, содержащие различные словоформы, например, слово "общность".
  • Булево свойство MatchAllWordForms позволяет указать, как в нашем примере, что при поиске будут использоваться все словоформы слов текста, указанного в свойстве TextOrProperty. Необходимым условием возможности такого поиска является подключение на этапе инсталляции приложения соответствующего словаря, содержащего словоформы.
  • Булево свойство MatchTextExactly является альтернативой предыдущему свойству и, когда оно задано значением true, требует точного соответствия текста при поиске.

Как видите, многие критерии поиска можно задать, установив требуемые значения свойств объекта FileSearch. Однако этот объект имеет и другой, более общий способ задания критериев. Дело в том, что среди свойств этого объекта есть свойство PropertyTests, возвращающее одноименную коллекцию, элементами которой являются объекты класса PropertyTest. Каждый из этих объектов задает один критерий поиска, а вся коллекция в целом - сложный критерий поиска, элементы которого объединены логическими операциями конъюнкции и дизъюнкции. При задании свойств объекта FileSearch автоматически формируются элементы коллекции PropertyTests. Но эта коллекция имеет и собственный метод Add, позволяющий добавлять новые критерии. Возникает коллизия - пересечение со свойствами, поскольку одни и те же критерии можно задать, используя свойства объекта FileSearch, либо метод Add коллекции PropertyTests. Я рекомендую в таких ситуациях использовать свойства. Достоинство метода Add состоит в том, что можно добавлять новые критерии поиска, не вводя новых свойств объекта FileSearch. Давайте рассмотрим небольшую процедуру AddCriteria, добавляющую критерии поиска и вызываемую в нашем примере:

Public Sub AddCriteria()
	'Добавление критериев поиска файлов
	With Application.FileSearch
		'Первый критерий
		.PropertyTests.Add name:="Дата создания", _
		Condition:=msoConditionAnytimeBetween, _
		Value:="1/10/1999", SecondValue:="1/06/2000"
		'Второй критерий
		.PropertyTests.Add name:="Размер", _
		Condition:=msoConditionMoreThan, _
		Value:=200000, Connector:=msoConnectorOr
		
	End With
End Sub
Листинг 5.2.

У метода Add пять параметров:

  • Name - задает имя критерия. Оно должно принадлежать фиксированному набору возможных критериев. Для добавления новых критериев поиска достаточно просто расширить набор возможных имен.
  • Condition - задает одно из возможных условий для данного критерия. Каждому критерию соответствует свой набор условий, задаваемых соответствующими константами.
  • Value - задает значение условия. Тип значения зависит от используемого условия.
  • SecondValue - некоторые условия требуют задания двух значений, как правило, определяющих границы интервала возможных значений.
  • Connector - этот параметр имеет два возможных значения и определяет логическую связку "И" или "ИЛИ", используемую при добавлении критерия к общему условию поиска.

В нашем примере добавлены два критерия к тем, что были заданы с помощью свойств объекта FileSearch. В соответствии с выбранными установками будут разыскиваться файлы, созданные в течение 8 месяцев, начиная с 1-го октября 1999 года до 1-го июня 2000 года, либо файлы, чей размер превосходит 200К. Заметьте, что при задании размера файла единицей измерения является байт, так что можно задать точный размер файла, если он конечно известен.

Но вернемся к рассмотрению процедуры LookingFor. После того, как критерий поиска сформирован, в ней вызывается метод Execute, запускающий сам поиск. В результате работы этого метода формируется коллекция файлов FoundFiles, удовлетворяющих условиям поиска. Эту коллекцию можно получить, вызвав свойство FoundFiles объекта FileSearch. Метод Execute возвращает в качестве результата число найденных файлов или, что тоже, число элементов коллекции FoundFiles. Параметры метода Execute позволяют отсортировать требуемым образом элементы этой коллекции. Взгляните, как выглядит сформированный отчет о результатах работы поиска:

Отчет о найденных файлах

Рис. 5.1. Отчет о найденных файлах

Заметьте, коллекция FoundFiles обладает одной интересной особенностью, отличающей ее от других коллекций, - ее элементы не являются объектами некоторого класса (FoundFile), как это обычно бывает. Но, конечно, обращение FoundFiles(i) позволяет получить доступ к i-му элементу этой коллекции - строке, задающей полный путь к файлу.

В заключение приведу тестовую процедуру печати всех свойств объекта FileSearch:

Public Sub PrintTest()
	'Печать свойств объекта FileSearch
	With Application.FileSearch
		Debug.Print "Имя файла содержит ", .FileName
		Debug.Print "Тип файла", .FileType
		Debug.Print "Последняя модификация", .LastModified
		Debug.Print "Поиск ведется в ", .LookIn
		Debug.Print "Учет словоформ ", .MatchAllWordForms
		Debug.Print "Точное соответствие", .MatchTextExactly
		Debug.Print "Поиск в подпапках", .SearchSubFolders
		Debug.Print "Текст или свойство", .TextOrProperty
		
	End With
	'Печать критериев поиска
	Dim Ptest As PropertyTest
	For Each Ptest In Application.FileSearch.PropertyTests
		With Ptest
			Debug.Print "Имя =", .name
			Debug.Print "Номер условия =", .Condition
			Debug.Print "Коннектор =", .Connector
			Debug.Print "Значение =", .Value
			Debug.Print "Второе значение =", .SecondValue
			
		End With
	Next Ptest
	'Печать найденных файлов
		Dim Namefile As Variant
		With Application.FileSearch
			Debug.Print "Найдено файлов - ", .FoundFiles.Count
			For Each Namefile In .FoundFiles
				Debug.Print "Путь найденного файла -", Namefile
			Next Namefile
		End With

End Sub
Листинг 5.3.

Я не буду приводить результатов тестовой печати, отмечу лишь, в коллекции PropertyTests содержится пять элементов, три из которых сформированы на основе заданных свойств объекта FileSearch, а два добавлены в результате вызова метода Add.

< Лекция 4 || Лекция 5: 123456 || Лекция 6 >