Разбираем по кусочкам новый «ленточный» интерфейс Word 2007. Здесь нет и не будет советов о том, как его сделать похожим на Word 2003. Только усовершенствования уже существующего. Также приглашаю посетить мой блог, посвященный работе с макросами в Word.

Напоминаю, что все коды программ, приведенных в блоге, вы используете на свой страх и риск. Не забывайте создавать резервные копии.

суббота, 27 декабря 2008 г.

Обновление ленты в зависимости от внешних условий

Вчера разговор закончился на том, что была поставлена задача об обновлении данных в поле ввода при изменении выбора.
Решается это так. Для начала нужно научиться ловить события, которые генерирует Word. В нашем случае нужно определять, что пользователь изменил набор выбранных объектов. При этом генерируется событие WindowSelectionChange. Как его ловить? Это подробно описано в моем блоге, посвященном макросам.
Здесь же мы подробно рассмотрим вопрос, связанный с обновлением информации на ленте.
Итак. Чтобы работала обратная связь с лентой, код XML, который описывает ленту, нужно доработать.
Во-первых, нужно добавить событие onLoad. Делается это так:
1 <customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui"
2 onLoad="LoadRibbon">


Во-вторых, добавить в наше поле событие getText:
1 <editBox id="SetLineSpacing"
2 onChange="УстановитьМежстрочныйИнтервал"
3 sizeString="3"
4 screentip="Установить междустрочный интервал"
5 supertip="Укажите число для междустрочного интервала.&#13;Для одинарного указать 1,5, для двойного — 2 и т.д.&#13;Значение интервала применяется к выделенному тексту."
6 getText="SetLineSpacing_GetText"/>

Этот код отличается от того, что я приводил раньше, но не принципиально. Я сделал имена макросов более понятными, чтобы не путаться. Параметр sizeString определяет длину поля ввода в символах.
Событие getText отвечает как раз за управление содержимым поля ввода.
В-третьих, нужно правильно написать обработчики событий onLoad и getText. Я это сделал так:
Обработчики событий ленты onLoad и getText   Копировать код без номеров строк
1 Public CustomRibbon As IRibbonUI 'указатель для хранения ссылки на ленту. Здесь необязателен, но рекомендуется
2 Dim MyEvents As New EventClassModule 'конструктор класса для отслеживания событий
3
4 Sub LoadRibbon(ribbon As IRibbonUI) 'загружаем ленту
5 Set CustomRibbon = ribbon 'создаем указатель на ленту
6 ribbon.Invalidate 'обновляем ленту
7 Set MyEvents.App = Word.Application 'перенаправляем события из приложения в наш класс.
8 End Sub
9
10 Sub SetLineSpacing_GetText(control As IRibbonControl, ByRef text)
11 text = PointsToLines(Selection.ParagraphFormat.LineSpacing) 'устанавливаем в поле ввода значение межстрочного интервала выделенного абзаца.
12 End Sub

Еще раз напомню, что узнать о том, как работать с событиями приложения можно здесь.