четверг, 14 февраля 2013 г.

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

Вчера разговор закончился на том, что была поставлена задача об обновлении данных в поле ввода при изменении выбора.
Решается это так. Для начала нужно научиться ловить события, которые генерирует Word. В нашем случае нужно определять, что пользователь изменил набор выбранных объектов. При этом генерируется событие WindowSelectionChange. Как его ловить? Это подробно описано в моем блоге, посвященном макросам.
Здесь же мы подробно рассмотрим вопрос, связанный с обновлением информации на ленте.
Итак. Чтобы работала обратная связь с лентой, код XML, который описывает ленту, нужно доработать.
Во-первых, нужно добавить событие onLoad. Делается это так:


Во-вторых, добавить в наше поле событие getText:

Этот код отличается от того, что я приводил раньше, но не принципиально. Я сделал имена макросов более понятными, чтобы не путаться. Параметр sizeString определяет длину поля ввода в символах.
Событие getText отвечает как раз за управление содержимым поля ввода.
В-третьих, нужно правильно написать обработчики событий onLoad и getText. Я это сделал так:
Public CustomRibbon As IRibbonUI 'указатель для хранения ссылки на ленту. Здесь необязателен, но рекомендуется
Dim MyEvents As New EventClassModule 'конструктор класса для отслеживания событий

Sub LoadRibbon(ribbon As IRibbonUI) 'загружаем ленту
   Set CustomRibbon = ribbon 'создаем указатель на ленту
   ribbon.Invalidate 'обновляем ленту
   Set MyEvents.App = Word.Application 'перенаправляем события из приложения в наш класс.
End Sub

Sub SetLineSpacing_GetText(control As IRibbonControl, ByRef text)
   text = PointsToLines(Selection.ParagraphFormat.LineSpacing) 'устанавливаем в поле ввода значение межстрочного интервала выделенного абзаца.
End Sub

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

Комментариев нет :