Программное управление смарт-тегами
Управление режимами применения смарт-тегов
Обработка смарт-тегов с помощью объекта SmartTag
Программное создание смарт-тегов
Создание смарт-тегов в Excel 2002
В этой статье мы продолжим рассмотрение технологии Smart Tags, впервые появившейся в Microsoft Office XP для реализации расширенных функций интеллектуальной обработки текстовых документов (предыдущие статьи на эту тему: «Смарт-теги в Microsoft Office фирменного и кустарного приготовления» и «DLL-обработчики смарт-тегов» — вы сможете найти на нашем CD-ROM в КомпьютерПресс № 11 и 12’2001). Сейчас мы рассмотрим встроенные объекты Word 2002 и Excel 2002, используя которые, можно выполнять управление режимами применения смарт-тегов и обработку самих смарт-тегов на программном уровне с помощью VBA.
Управление режимами применения смарт-тегов
ак мы уже отмечали в первой статье, управление параметрами смарт-тегов в Word 2002 выполняется с помощью вкладки «Сервис | Параметры автозамены | Смарт-теги», приведенной на рис. 1.
Кроме того, на вкладке «Сервис | Параметры | Вид» в области «Показывать» имеется флажок «Смарт-теги», который включает/выключает выделение смарт-тегов с помощью подчеркивания. Объектная модель Word 2002 включает набор новых свойств и методов, которые фактически полностью воспроизводят действия флажков и кнопок, доступных через меню «Сервис»:
- ActiveDocument.RemoveSmartTags — удалить смарт-теги;
- ActiveDocument.EmbedSmartTags — внедрять смарт-теги (оставить при сохранении документа);
- ActiveDocument.RecheckSmartTags — повторная проверка;
- Application.Options.LabelSmartTags — показывать смарт-теги;
- ActiveWindow.View.DisplaySmartTags — показывать выделение смарт-тегов;
- Application.EmailOptions.EmbedSmartTag — сохранять информации о смарт-тегах в электронных письмах в формате HTML при работе в Outlook 2002;
- ActiveDocument.SmartTagsAsXMLProps — сохранять на Web-страницах свойства смарт-тегов в виде XML.
В Excel 2002 управление режимами также выполняется с помощью «Сервис | Параметры автозамены | Смарт-теги» (рис. 2), но легко заметить, что набор предлагаемых функций отличается от Word 2002 (как и названия одинаковых по смыслу операций).
Честно говоря, это вызывает некоторое недоумение: одно дело, когда различия объектных моделей двух наиболее популярных офисных приложений могут объясняться «наследием прошлого», но ведь в данном случае речь идет о новой технологии и о новых объектах.
Отметим, что стандартные распознаватели, поставляемые с пакетом Office XP, в Excel 2002 не используются. Более того, проведенное тестирование показало, что Excel 2002 может применять распознаватели смарт-тегов только в случае, если в ячейке записано одно слово (не очень понятно почему, но это так).
В Excel 2002 для программного управления режимами предлагаются следующие свойства и методы:
- ActiveWorkbook.SmartTagOptions.EmbedSmartTags — включение/выключение (True/False) режима «Внедрение смарт-тегов»;
- ActiveWorkbook.SmartTagOptions.DisplaySmartTags — режим показа смарт-тегов (значения xlButtonOnly, xlDisplayNone, xlIndicatorAndButton);
- Application.SmartTagRecognizers.Recognize — включение/выключение режима распознавания.
Мы видим, что в Excel 2002 почему-то нет операции удаления смарт-тегов. Но в Word 2002 мы не можем программно управлять подключением отдельных распознавателей из списка, а в Excel это делается с помощью объекта SmartTagRecognizers. Пример этого иллюстрирует такой макрос:
Sub RecognizersList() Dim i% With Application.SmartTagRecognizers If .Count > 0 Then For i = 1 To .Count MsgBox i & " " & .Item(i).progID & _ " " & .Item(i).Enabled Next End If End With End Sub
При его выполнении получается описание всех распознавателей. С помощью свойства Enabled можно выполнять программное подключение или отключение соответствующего распознавателя.
Обработка смарт-тегов с помощью объекта SmartTag
а наш взгляд, самое интересное сегодня в технологии смарт-тегов — это возможность их обработки на уровне VBA-кода, в общем случае никак не связанной с использованием распознавателей и обработчиков смарт-тегов, о которых шла речь в предыдущих статьях.
Здесь ключевым является наличие объекта SmartTag (и коллекции SmartTags) с соответствующим набором свойств и методов.
Для ознакомления с объектом SmartTag создадим документ Word 2002 с таким текстом:
Алексей Малинин, 09/20/1953.
В этом примере мы исходим из того, что у нас на машине установлены два обработчика смарт-тегов: распознаватель русских имен (программа Person_K, которую можно скачать по адресу http://www.microsoft.ru/offext/ в библиотеке разработок в разделе К) и стандартный английский распознаватель дат (входит в состав поставки). Они выделят во введенном тексте соответственно «Алексей Малинин» и «09/20/1953».
Далее напишем такой макрос:
Sub PrintAllSmartTags() ' ' Вывод информации обо всех смарт-тегах текущего документа Dim i%, j% With ActiveDocument.SmartTags If .Count > 0 Then ' получение информации о смарт-тегах For i = 1 To .Count With .Item(i) ' текущий смарт-тег Debug.Print i & ". Смарт-тег, тип = " & .Name Debug.Print " XML-описание: " & vbCrLf & .XML If .Properties.Count > 0 Then Debug.Print " Свойства смарт-тега:" For j = 1 To .Properties.Count Debug.Print " имя = " & .Properties(j).Name & _ " значение = " & .Properties(j).Value Next Else MsgBox "У этого смарт-тега нет свойств" End If End With Next Else MsgBox "Нет смарт-тегов в документе" End If End With End Sub
В результате его выполнения мы получим такую информацию о смарт-тегах созданного документа:
1. Смарт-тег, тип = Malinin-SmartTags#Person_k XML-описание: <xml xmlns:st1="Malinin-SmartTags"> <st1:Person_k>Алексей Малинин</st1:Person_k> </xml> У этого смарт-тега нет свойств 2. Смарт-тег, тип = urn:schemas-microsoft-com:office:smarttags#date XML-описание: <xml xmlns:st1="urn:schemas-microsoft-com:office:smarttags"> <st1:date Month="9" Day="20" Year="1953">09/20/1953</st1:date> </xml> Свойства смарт-тега: Имя = Month значение = 9 Имя = Day значение = 20 Имя = Year значение = 1953
Тут мы видим, что с помощью свойства Name мы получили имя типа смарт-тега (имя распознавателя), а свойство XML содержит наиболее полную информацию о смарт-теге: тип, сам текст документа, а также его дополнительные параметры (свойства). Кроме того, с помощью свойства Properties можно напрямую получить доступ к именам и значениям параметров конкретного смарт-тега.
Здесь еще раз хотелось бы вернуться к вопросу: что же называется сматр-тегом? Довольно часто в литературе этот термин используется для программы-обработчика (например, «смарт-тег русских имен»), что неверно. Смарт-тег — это специфический элемент (объект) документа, который состоит из фрагмента текста документа, идентификатора распознавателя (типа смарт-тега) и набора (в том числе, возможно, пустого) дополнительных свойств. Смысл этого определения хорошо виден из примера приведенного выше кода с XML-описанием смарт-тега.
Откуда берутся свойства смарт-тега? Они могут формироваться программой-распознавателем, создаваться программно с помощью VBA-кода, а также передаваться через сохранный документ. В приведенном выше примере свойства смарт-тега «Дата» были созданы распознавателем смарт-тега.
Если бы мы захотели создать какие-то свойства для распознавателя Person_K, то можно было бы добавить соответствующие операторы в код процедуры.
Например, в используемом нами распознавателе русских имен в процедуре ISmartTagRegognizer_Rеcognize можно было бы написать такой код для формирования свойств найденного смарт-тега:
Set propbag = RecognizerSite.GetNewPropertyBag ' новый объект propbag.Write "Имя ", FirstName propbag.Write "Фамилия", LastName …
В частности, было бы вполне логичным в момент распознавания имен указать пол персоны. Тогда бы мы при выполнении макроса PrintAllSmartTags узнали бы, что Алексей Малинин не относится к прекрасной половине человечества. Свойства смарт-тегов могли бы пригодиться и в процедуре ISmartTagAction_InvokeVerb обработчика смарт-тегов: можно было бы узнать число свойств и их значения для уточнения требуемой операции.
Можно также написать макрос, который будет извлекать заданные свойства заданного типа смарт-тегов:
Sub GetSmartTags() ' ' Выборка свойства "День" смарт-тегов с типом "Дата" ' Dim st As SmartTag With ActiveDocument For Each st In .SmartTags If st.Name = "urn:schemas-microsoft-com:office:smarttags#date" Then Debug.Print st.Properties("Day").Value End If Next End With End Sub
Программное создание смарт-тегов
днако еще интереснее то, что смарт-теги можно создавать вообще без использования распознавателя, а только с помощью VBA-кода! Убедимся в этом. При этом хотелось бы привести пример полезного применения смарт-тегов. Создайте новый документ в среде Word 2002 и напишите для него два таких макроса:
Sub NewSmartTag() ' ' Вставка текста и объявление ' его объектом SmartTag ' Selection.Text = "Ольга Павлова" Selection.SmartTags.Add _ ("MySmartTag#MyTest") ActiveDocument.SmartTags(1).Properties.Add _ Name:="Email", _ Value:="OlgaP@Mail.ru" End Sub Sub TestSmartTag() ' ' Выборка информации о смарт-теге If ActiveDocument.SmartTags.Count > 0 _ Then ' есть смарт-теги With ActiveDocument.SmartTags(1) MsgBox .XML & vbCrLf & vbCrLf & _ "Email = " & .Properties("Email") End With End If End Sub
Выполните сначала макрос NewSmartTag — в документ будет вставлен текст, который к тому же на программном уровне определяется как смарт-тег с дополнительным параметром (адрес Email). Чтобы убедиться в этом, выполните второй макрос — появится окно с XML-описанием смарт-тега, а также со значением его свойства в отдельной строке. Обратите внимание: мы создали смарт-тег без каких-либо распознавателей! Правда, визуально наш текст никак не выделен специфическим подчеркиванием, но нам ничто не мешает задать любое удобное собственное форматирование подобных фрагментов. При этом мы можем найти нужные нам смарт-теги программным образом и создать любые необходимые нам операции обработки документа!
Но самое главное — вся эта дополнительная информация о персоне сохраняется при передаче документа с компьютера на компьютер. Закройте Word 2002, загрузите его заново (лучше на другом компьютере), откройте сохраненный документ, запустите макрос TestSmartTag и убедитесь в этом сами!
Создание смарт-тегов в Excel 2002
опробуем теперь произвести операции по программному формированию смарт-тега в Excel 2002 (это будет выглядеть несколько иначе, чем в Word):
Sub NewSmartTagExcel() ' Создание смарт-тега 'Включение режима внедрения смарт-тегов ActiveWorkbook.SmartTagOptions. _ EmbedSmartTags = True ' Влючение режима распознавания Application.SmartTagRecognizers. _ Recognize = True Range("A1").Formula = "Ольга Павлова" ' Создание смарт-тега Range("A1").SmartTags.Add _ ("MySmartTag#Mytest") _ .Properties.Add _ Name:="Email", _ Value:= "OlgaP@mail.ru" End Sub
Выполнив этот макрос, мы обнаружим, что, в отличие от Word, данный смарт-тег распознается в рабочей книге, правда, не предлагая никаких специальных функций обработки. После перезапуска Excel и загрузки документа картина повторяется, то есть смарт-тег сохраняется.
А аналог макроса TestSmartTag для программной выборки смарт-тегов будет выглядеть следующим образом:
Sub TestSmartTag() ' Dim i% With Application.ActiveSheet If .SmartTags.Count Then For i = 1 To .SmartTags.Count With .SmartTags(i) MsgBox "Name = " & .Name & _ vbCrLf & vbCrLf & _ "XML = " & .XML & _ vbCrLf & vbCrLf & _ "Имя первого свойства = " _ & .Properties(1).Name ' тут подразумевается, что ' есть одно свойство! End With Next End If End With End Sub
К сожалению, при вводе кода интеллектуальная подсказка для конструкции Application.ActiveSheet почему-то не работает.
В заключение нужно добавить, что в Excel 2002 у объекта SmartTag есть метод SmartTagActions, который позволяет обращаться к обработчику смарт-тегов из VBA-кода, например, следующим образом:
Sub ExecuteASmartTag() Dim strAction As String strAction = "Insert refreshable stock price" ActiveWorkbook.SmartTagOptions.EmbedSmartTags = True Application.SmartTagRecognizers.Recognize = True With Range("A1") .Formula = "MSFT" .SmartTags( _ "urn:schemas-microsoft-com:office:smarttags#stockticker") _ .SmartTagActions(strAction).Execute End With End Sub
На этом мы заканчиваем тему «Смарт-теги в Office XP» и предлагаем читателям продолжить самостоятельные эксперименты. На самом деле, если покопаться в этой технологии, можно найти немало полезного для работы.
КомпьютерПресс 3'2002