К борьбе с синонимами...

Можно ли сделать приложения Microsoft Office чуточку более удобными, чем они есть на самом деле? Безусловно. Недаром же в состав каждого приложения офисного пакета включен несложный язык программирования Visual Basic for Application. С его помощью можно не только расширить функциональные возможности программы, но и упростить уже имеющиеся.


(c) Компьютерная газета

Не секрет, что с каждой новой версией Microsoft Office улучшается — становится более удобным интерфейс, появляются новые функции. Все бы хорошо, но реализация этих новинок, порой, не всегда удобна. И причина вовсе не в том, что, скажем, тому же Word не хватает изящества конкурентов в лице Corel WordPerfect и Lotus WordPro. В Word многое (если не все) основано на громоздких диалоговых окнах. Это следует отнести к недостаткам программы. Легко ли работать с диалоговыми окнами? Судите сами. Надо выбрать какую-то команду в меню, что-то ввести в полях диалога, а иногда и в дочерних диалоговых окнах, и непременно нажать на кнопку Ok. И так каждый раз.
Соглашусь, что некоторые вещи иначе и не сделаешь, но многое решается более простым способом. То есть, без диалоговых окон, а с помощью панелей инструментов. Одна из таких "вещей" — просмотр синонимов слова — эффектно решается с помощью панелей инструментов. Об этом, то есть о синонимах, и пойдет речь далее.
Итак, синонимы... Столь странная тема выбрана из-за того, что, во-первых, надо с чего-то начинать, во-вторых, создаваемая программа затрагивает много интересных особенностей Word, о которых можно узнать, лишь что-нибудь запрограммировав, и, в-третьих, программа (по личному убеждению) позволяет полностью отказаться от использования диалогового окна со страшным заголовком "Тезаурус: Русский", открываемого еще более страшной командой меню Сервис — Язык — Тезаурус.

Что понадобится для создания программы? Всего четыре вещи...

1) умение работать в Visual Basic for Application и понятие об объектах Microsoft Office;
2) объект CommandBars;
3) обработчики событий объекта Application;
4) функция SynonymInfo.

А что должно получиться в итоге? Опять же четыре вещи...
1) В контекстном меню должна появиться команда "Синонимы".
2) При выборе этой команды должна создаваться панель инструментов "Синонимы", содержащая список синонимов.
3) При выборе любого пункта панели "Синонимы" текущее слово должно быть заменено на выбранный синоним.
4) И практически никаких диалоговых окон (практически — это потому, что если синонимов нет, об этом надо каким-то образом сообщить).
Что ж, цель ясна. Можно переходить к теоретическим выкладкам.

Редактор программ на Visual Basic for Application

Редактор программ на Visual Basic for Application — это отдельное приложение, которое вызывается из любого другого приложения Microsoft Office (в данном случае из Word) с помощью клавиш Alt+F11. При этом появляется окно, подобное представленному на рисунке. Большую часть времени придется провести именно в этом редакторе. Пока в редакторе ничего нет. Модуль, форму или модуль класса нужно прежде создать, воспользовавшись меню Вставка. Но стоп! Еще рано создавать модули.
Word имеет очень интересное строение документа. Каждый новый документ создается на базе шаблона Normal.Dot. А следовательно, если поместить модули непосредственно в этот шаблон, то они будут доступны всем документам без исключения. Вставка же модулей в текущий документ ограничит их использование лишь каким-то одним документом, а кроме того, при открытии этого документа вы будете навязчиво информированы о возможной атаке вирусов — так болезненно Word реагирует на любую самую безобидную программу на Visual Basic for Application. Поскольку никаких вирусов нами создаваться не будет, то причин для беспокойств нет.

Объект CommandBars
Объект CommandBars универсален. Это одновременно и меню, и панели инструментов, и контекстное меню. Открыв справочную информацию по этому объекту, вы сможете удостовериться, что любые команды, как бы они ни выглядели, создаются с помощью свойств и методов объекта CommandBars.

Свойство SynonymInfo
Говоря научным языком (иначе, впрочем, и не скажешь), SynonymInfo — это свойство, которое позволяет получить набор синонимов для указанного слова. Свойство имеет такой синтаксис:
SynonimInfo(<слово>, <код языка>)
где
<слово> — слово, о котором вы хотите получить информацию
<код языка> — константа wdRussian, wdEnglishUS или wdEnglishUK.
Возвращаемый свойством результат представляет собой ссылку на одноименный объект. В нем нам понадобятся свойства SynonymList и AntonymList этого объекта. Как использовать эти свойства? Лучшим ответом на вопрос является следующий пример, в котором отбираются синонимы и антонимы для слова "Большой".

Dim Alist, S
' Получаем список антонимов
AList = SynonymInfo(Word:="большой", LanguageID:=wdRussian).AntonymList
S = ""
For I = 1 To UBound(AList)
S = S & AList(I) & ", "
Next I
MsgBox S,, "Антонимы для 'Большой'"
' Получаем список синонимов
AList = SynonymInfo(Word:="большой", LanguageID:=wdRussian).SynonymList(1)
S = ""
For I = 1 To UBound(AList)
S = S & AList(I) & ", "
Next I
MsgBox S,, "Синонимы для 'Большой'"

Чтобы ввести и исполнить приведенный выше пример, нужно создать новую процедуру, набрав команды Sub Example1 и нажав клавишу Enter, затем, между появившимися на экране строками Sub и End Sub, ввести текст. Для запуска процедуры следует установить курсор на любую строку процедуры и нажать клавишу F5. Если вы все сделали правильно, на экране должно появиться диалоговое окно со списком синонимов для слова "большой". Однако сделаем важное замечание. Программа для поиска синонимов будет работоспособна лишь в том случае, если вместе с Word вы установили словарь синонимов. На всякий случай, проверьте доступность словаря, набрав в редакторе слово "большой" и нажав клавиши Shift+F7. Если на экране появится стандартное диалоговое окно Word и список синонимов в нем, то вы можете смело использовать программу. В противном случае, вам нужно установить словари.

От слов к делу

Настала пора ввести текст программы и как можно подробнее прокомментировать процесс ввода.

Этап I. Создание модуля класса.

Особенность объекта Application, вернее, событий объекта Application, состоит в том, что для их активизации требуется создать модуль класса и инициализировать в нем объект. Вот какие действия при этом вам надо выполнить:
1. Раскройте в окне проекта ветвь Normal.
2. Выполните команду меню Вставка — Модуль класса.
3. Откройте окно свойств, щелкнув по кнопке

Укажите имя нового класса — в следующих программах используется имя EventClass.
4. Введите в модуле класса следующие строки:
Public WithEvents WordApp As Word.Application
Private Sub WordApp_DocumentChange()
Prepare_PopMenu_Text
End Sub

Этап II. Создание вспомогательных процедур.

1. В шаблоне Normal создайте новый модуль, выбрав в меню команду Вставка — Модуль.
2. Введите в нем процедуру Prepare_PopMenu_Text.
Sub Prepare_PopMenu_Text()
' Добавляет команду "Синонимы" к контекстному меню Text.
If Windows.Count = 0 Then Exit Sub
Application.CustomizationContext = ActiveDocu-
ment.AttachedTemplate
CommandBars("Text").Reset
With CommandBars("Text").Controls.Add(Type:=mso-
ControlButton)
.Caption = "Синонимы"
.OnAction = "ShowSynCtrlBars"
End With
End Sub
3. Введите процедуру ShowSynCtrlBars.
Sub ShowSynCtrlBars()
' Создает панель инструментов "Синонимы" и отображает ее на экране
Dim SList, temp, I
Dim mySI As SynonymInfo
Set mySI = SynonymInfo(Word:=Selection.Words(1))
' удалить старую копию панели "Синонимы"
On Error Resume Next
If CommandBars("Синонимы").Visible Then
CommandBars("Синонимы").Delete
Else
CommandBars("Синонимы").Delete
End If
On Error GoTo 0
Dim SynCombo As CommandBarComboBox
If mySI.MeaningCount = 0 Then
MsgBox "Синонимы не обнаружены"
Exit Sub
End If
With CommandBars.Add("tmpsyno", Temporary:=True)
.NameLocal = "Синонимы"
For I = 1 To mySI.MeaningCount — 1
SList = mySI.SynonymList(I)
Set cComboPopup =.Controls.Add(Type:=msoCon-
trolPopup)
cComboPopup.Caption = mySI.MeaningList(I)
If TypeName(SList) <> "String" Then
For j = 1 To UBound(SList)
With cComboPopup.Controls.Add(Type:=mso-
ControlButton)
.Caption = SList(j)
.Parameter = SList(j)
.OnAction = "InsertMenuCommand"
End With
Next j
Else
With cComboPopup.Controls.Add(Type:=msoCon-
trolButton)
.Caption = SList
.Parameter = SList
.OnAction = "InsertMenuCommand"
End With
End If
Next I
Set cComboPopup =.Controls.Add(Type:=msoCon-
trolPopup)
cComboPopup.Caption = "(антонимы)"
SList = mySI.AntonymList
If TypeName(SList) <> "String" Then
For j = 1 To UBound(SList)
With cComboPopup.Controls.Add(Type:=msoCon-
trolButton)
.Caption = SList(j)
.Parameter = SList(j)
.OnAction = "InsertMenuCommand"
End With
Next j
If UBound(SList) < 1 Then
With cComboPopup.Controls.Add(Type:=msoCon-
trolButton)
.Caption = "<слова не найдены>"
End With
End If
Else
With cComboPopup.Controls.Add(Type:=msoCon-
trolButton)
.Caption = SList
.Parameter = SList
.OnAction = "InsertMenuCommand"
End With
End If
.Position = msoBarTop
.Visible = True
End With
End Sub

4. Введите процедуру InsertMenuCommand.
Sub InsertMenuCommand()
' Заменяет слово на выбранное в меню
Selection.Words(1) = CommandBars.ActionControl.Parameter + " "
End Sub

Этап III. Создание событий для объекта Document.

Чтобы при создании или открытии документа в контекстном меню появлялась команда "Синонимы", надо инициализировать события Document_New и Document_Open.
Для этого откройте ветвь Microsoft Word Объекты для шаблона Normal и введите следующий код.
Dim W As New EventClass

Private Sub Document_New()
Set W.WordApp = Application
End Sub

Private Sub Document_Open()
Set W.WordApp = Application
End Sub

Этап IV. Заключительный этап.

1. Убедитесь, что программа введена правильно и без ошибок.
2. Сохраните шаблон Normal.dot, нажав клавиши Ctrl-S.
3. Создайте новый документ.
4. Введите в нем слово "большой". Установите в нем курсор и щелкните правой кнопкой мыши.
5. Должно появиться меню, в котором находится пункт "Синонимы".
6. Выберите его. А затем в панели инструментов укажите нужное вам слово — оно заменит слово "большой".

Проблемы с Word 2000

Данная программа была разработана для Microsoft Office 97. В силу того, что Visual Basic for Application мало изменился в Microsoft Office 2000, она будет работоспособна и в новой версии текстового процессора. Единственная проблема заключается в том, что если вы используете неруссифицированную версию Word 2000, то в строках, где вызывается функция SynonymInfo, должны явно указать язык, присвоив параметру LanguageID значение wdRussian при поиске русских слов, и wdEnglish — при поиске английских слов.
AList = SynonymInfo(Word:="большой", LanguageID:=wdRussian).AntonymList
Кроме того, контекстное меню Word 2000 уже содержит команду "Синонимы", поэтому нужно позаботиться о другом ее наименовании или положении.

Напоследок

Хотелось бы узнать ваше мнение о предложенном макросе (любые комментарии, предложения по усовершенствованию и др.), а заодно услышать, что бы вам хотелось иметь под рукой в Word, Excel, Outlook или Access.

Сергей Лосев


Компьютерная газета. Статья была опубликована в номере 39 за 1999 год в рубрике программирование :: разное

©1997-2024 Компьютерная газета