Показаны сообщения с ярлыком Установка междустрочного интервала. Показать все сообщения
Показаны сообщения с ярлыком Установка междустрочного интервала. Показать все сообщения

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

Получение данных из текстового поля

При работе с текстовыми документами мне часто приходится изменять междустрочный интервал. Постоянно открывать для этого соответствующее меню мне надоело. Поэтому я подумал:«А как сделать, чтобы интервал задавать числом? 2 — для двойного интервала, 1 — для одинарного, или просто конкретное значение?»
Во-первых, поместить на ленту поле editbox.
Вот так, например:

 

Во-вторых, написать код макроса, который бы брал текст из поля и соответственно устанавливал междустрочный интервал. Довольно долгие поиски дали вот такой результат (с этого сайта):
Sub УстановитьМежстрочныйИнтервал(editbox As IRibbonControl, text As String)/>
    Selection.ParagraphFormat.LineSpacing = LinesToPoints(Val(text))
End Sub

Как видно код очень даже не сложный, но очень сложно вообще откопать информацию, особенно на русском языке, по работе с новым интерфейсом. На MSDN при вводе в поле поиска фразы «ribbon vba» страница просто закрывалась. Прямо масонский заговор
Итак, весь секрет заключался в параметре text, который очень не очевиден, и просто объявляется.
Теперь задача в другом: как выставлять значение в этом поле в соответствии со строчным интервалом уже выделенного текста? И все это только средствами VBA.

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

Вчера разговор закончился на том, что была поставлена задача об обновлении данных в поле ввода при изменении выбора.
Решается это так. Для начала нужно научиться ловить события, которые генерирует 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

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