Программное управление смарт-тегами

Алексей Малинин

Управление режимами применения смарт-тегов

Обработка смарт-тегов с помощью объекта 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


Наш канал на Youtube

1999 1 2 3 4 5 6 7 8 9 10 11 12
2000 1 2 3 4 5 6 7 8 9 10 11 12
2001 1 2 3 4 5 6 7 8 9 10 11 12
2002 1 2 3 4 5 6 7 8 9 10 11 12
2003 1 2 3 4 5 6 7 8 9 10 11 12
2004 1 2 3 4 5 6 7 8 9 10 11 12
2005 1 2 3 4 5 6 7 8 9 10 11 12
2006 1 2 3 4 5 6 7 8 9 10 11 12
2007 1 2 3 4 5 6 7 8 9 10 11 12
2008 1 2 3 4 5 6 7 8 9 10 11 12
2009 1 2 3 4 5 6 7 8 9 10 11 12
2010 1 2 3 4 5 6 7 8 9 10 11 12
2011 1 2 3 4 5 6 7 8 9 10 11 12
2012 1 2 3 4 5 6 7 8 9 10 11 12
2013 1 2 3 4 5 6 7 8 9 10 11 12
Популярные статьи
КомпьютерПресс использует