Этюды для программистов Microsoft Word

Home ] Up ] Этюд 1.1. Подгонка размера текста ] Этюд 1.2. Изменение регистра символов ] Этюд 1.3. Поиск и раскраска гиперссылок ] Этюд 1.4. Стили ] Этюд 1.5. Вставка форматированного текста ] Этюд 1.6. Вычисление высоты текста. ] Этюд 1.7. Форматирование заголовка. ]


Этюд 1.1. Подгонка размера текста

Font in printing, sometimes called Fount, a complete set of type of any one size, with all the usual points and accents; a font consists of about 100,000 characters.

http://www.websters-online-dictionary.org/definition/Font

ШРИФТ м. немецк. набор, отлитые, для печати, буквы. Шрифты (наборы) получают названья, коими их и обозначают. Сперва режутся на стали пунсоны (чеканы), коими выбиваются с одного удара в меди матрицы (льяки), а в них льется шрифт (набор) из гарту, сплава олова, свинца, цинку и железных опилков. Каждому из наборов дано, по почерку его, особое названье; строчный, обычный набор: цицеро, и к нему косой, курсив, курсик; прописной или крупный: корпус, разных названий: английский, долгий, черненький, толстый, египетский и пр. затем, мелкий: петит и косой петит, коего малейший вид бриллиантовый, на обороте наших асигнаций.

Толковый словарь Даля http://dic.academic.ru/dic.nsf/enc2p/378426

 

ШРИФТ (нем. Schrift) - в полиграфии - комплект литер, воспроизводящий какой-либо алфавит (латинский, русский, арабский, греческий и др.), а также цифры и знаки. Шрифты различаются характером рисунка (см. Гарнитура), наклоном (прямой, курсив, наклонный), насыщенностью (светлый, полужирный, жирный), размером (см. Кегль).

Большой Энциклопедический словарь http://dic.academic.ru/dic.nsf/enc3p/330770

При окончательном форматировании текста довольно часто для одного или нескольких абзацев требуется изменить размер шрифта или разрядку (так называется межсимвольное расстояние). В этом этюде рассматривается создагние и открытие шаблонов Microsoft Word, создание панели инструментов, создание модуля и несколько простых макросов на VBA.

Несмотря на то, что в Microsoft Word, по крайней мере начиная с версии 2003, есть встроенные команды "Grow Font (Ctrl+>)", "Shrink Font (Ctrl+<)", а также "Grow Font 1 Pt (Ctrl+])" и "Shrink Font 1 Pt (Ctrl+[)", представляется, что эти простые операции как нельзя лучше подходят для создания первого шаблона. Кроме того, создание собственных аналогов встроенных команд даёт возможность их изменения и улучшения в дальнейшем.

Разреженная расстановка букв в слове называется разрядкой. Увеличение расстояния между строками называется разбивкой. И то и другое по английски называется spacing.

 

Шаблоном (template) называется документ Microsoft Word специального формата, Шаблоны обычно располагаются в файлах с расширением '.DOT'.

Шаблоны, расположенные в папке автозагрузки, называются глобальными шаблонами или плагинами. Они автоматически загружаются при старте Microsoft Word и доступны при редактировании любого документа.

 

Ресурсы

Шаблон "AhTextFit.dot", 21 Кб, формат ZIP [скачать].

Описанные ниже операции "Создание пустого шаблона", "Открытие шаблона", "Создание модуля" и макросов предназначены для читателя, который не знаком ни с VBA, ни с редактором Visual Basic Editor.

Их назначение состоит в том, чтобы такой читатель, не имеющий связи с интернетом, мог представить себе связную картинку - файл шаблона Microsoft Word с расширением '.DOT' содержит модули VBA и панели инструментов. В модулях располагается код VBA макросов, форм и классов, то есть текст программы.

Если Вы скачали шаблон "AhTextFit.dot" и знакомы с VBA, то можете сразу переходить к экспериментам с шаблоном, изучению кода и заданиям в конце этюда.

Создание пустого шаблона

Создаем новый пустой документ Microsoft Word и выполняем команду "Save". В диалоге "Save As" сначала выбираем "Save as Type" "Document template (*.dot)", затем выбираем нужную папку, вводим имя файла и нажимаем кнопку "Save".

 

Открытие шаблона

Для открытия шаблона нужно применить команду "Open" контекстного меню Windows или выбрать имя шаблона из списка ранее открытых файлов в меню "File" текстового процессора Microsoft Word.

 

При двойном щелчке левой кнопкой мыши по имени файла шаблона Microsoft Word создает новый документ, основанный на выбранном шаблоне. Эта операция нам практически никогда не понадобится, так как в книге не рассматривается тема создания документов на основе существующих шаблонов.

Создание модуля

Открываем созданный шаблон (файл с расширением '.DOT') и переключаемся в редактор Visual Basic Editor (выбираем команду меню Microsoft Word "Tools\Macro\Visual Basic Editor" или нажимаем Alt+F11). С помощью контекстного меню, создаём в нашем проекте (открытом шаблоне) новый модуль

 

В редакторе свойств изменяем имя модуля с "Module1" на "AhTextFit".

 

 

Переносим в текст модуля приведенные ниже макросы.

На всякий случай, ещё раз напомню, что описанные выше операции нужно делать только если у Вас нет готового шаблона. Другими словами, если Вы читаете этот текст на бумаге и рядом нет подключенного к сети компьютера.

Шаблон "AhTextFit.dot"

В шаблоне "AhTextFit.dot" реализованы простые операции форматирования. Панель инструментов "AhTextFit" предоставляет пользовательский интерфейс к основным операциям форматирования - изменению размера шрифта и изменению разрядки.

Основной функцией, изменяющей размер шрифта является AhTextFitFontSizeChange. В ней же происходит и обработка ошибок. Процедуры AhTextFitFontInc и AhTextFitFontDec просто вызывают функцию AhTextFitFontSizeChange, предоставляя необходимые аргументы.

Аналогично, основной функцией, изменяющей величину разрядки, является AhTextFitFontSpacingChange. В ней происходит обработка ошибок. Процедуры AhTextFitSpacingInc, AhTextFitSpacingDec и AhTextFitSpacingNormal просто вызывают функцию AhTextFitFontSpacingChange, предоставляя необходимые аргументы.

Далее приведен полный код модуля AhTextFit, расположенного в шаблоне "AhTextFit.dot".

Константы

'
' File AhTextFit.dot|AhTextFit
'
' Etudes for Microsoft Word Programmers.
' Etude 1. Text Fit.
' First published on http://www.transcriber.ru
'
' © 2000-2007. Evgeny Akhundzhanov. All rights reserved worldwide.
'
Option Explicit
'
' Constants
'
Private Const ciFontSizeStep As Long = 1
Private Const ciFontSpacingStep As Long = 1
Private Const cbProcessEachCharIfWdUndefined As Boolean = False

Сообщения об ошибках

'
' Messages
'
Private Const cErrFontSizeUndefined As String = "Font size = wdUndefined."
Private Const cErrFontSpacingUndefined As String = "Font spacing = wdUndefined."
Private Const cErrFontSizeError As String = "Cannot change font size."
Private Const cErrFontSpacingError As String = "Cannot change font spacing."

Процедура AhTextFitAbout

Sub AhTextFitAbout()
MsgBox "Etudes for Microsoft Word Programmers." & vbCrLf & _
    "Etude 1. Text Fit." & vbCrLf & _
    "http://www.transcriber.ru" & vbCrLf & vbCrLf & _
    "Template AhTextFit.dot - Font size and spacing Fit" & vbCrLf & vbCrLf & _
    "Parameters are as follows:" & vbCrLf & _
    "Font Size Step = " & ciFontSizeStep & vbCrLf & _
    "Font Spacing Step = " & ciFontSpacingStep & vbCrLf
End Sub

Процедура AhTextFitFontSizeChange

'
' AhTextFitFontSizeChange
'
Private Sub AhTextFitFontSizeChange(ByVal dwStep As Long)
If Documents.Count = 0 Then Exit Sub
 
On Error GoTo ErrorLabel
With Selection.Font
    If dwStep = 0 Then
        ' just do nothing
    Else
        If .Size = wdUndefined Then
            If cbProcessEachCharIfWdUndefined Then
                Dim dwChar As range
                On Error Resume Next
                For Each dwChar In Selection.Characters
                    dwChar.Font.Size = dwChar.Font.Size + dwStep
                Next dwChar
            Else
                MsgBox cErrFontSizeUndefined
            End If
        Else
            .Size = .Size + dwStep
        End If
    End If
End With
Exit Sub
ErrorLabel:

    MsgBox cErrFontSizeError

End Sub

Процедура AhTextFitFontInc

'
' AhTextFitFontInc
'
Public Sub AhTextFitFontInc()
    AhTextFitFontSizeChange ciFontSizeStep

End Sub

Процедура AhTextFitFontDec

'
' AhTextFitFontDec
'
Public Sub AhTextFitFontDec()
    AhTextFitFontSizeChange -ciFontSizeStep

End Sub

Процедура AhTextFitSpacingChange

'
' AhTextFitSpacingChange
'
Private Sub AhTextFitSpacingChange(ByVal dwStep As Long)
If Documents.Count = 0 Then Exit Sub
 
On Error GoTo ErrorLabel
With Selection.Font
    If dwStep = 0 Then
        .Spacing = 0
    Else
        If .Spacing = wdUndefined Then
            If cbProcessEachCharIfWdUndefined Then

                Dim dwChar As range
                On Error Resume Next
                For Each dwChar In Selection.Characters
                    dwChar.Font.Spacing = dwChar.Font.Spacing + dwStep
                Next dwChar
            Else
                MsgBox cErrFontSpacingUndefined
            End If
        Else
            .Spacing = .Spacing + dwStep
        End If
    End If
End With
Exit Sub
ErrorLabel:

    MsgBox cErrFontSpacingError

End Sub

Процедура AhTextFitSpacingInc

'
' AhTextFitSpacingInc
'
Public Sub AhTextFitSpacingInc()
    AhTextFitSpacingChange ciFontSpacingStep

End Sub

Процедура AhTextFitSpacingDec

'
' AhTextFitSpacingDec

'

Public Sub AhTextFitSpacingDec()
    AhTextFitSpacingChange -ciFontSpacingStep
End Sub

Процедура AhTextFitSpacingNormal

'
' AhTextFitSpacingNormal
'
 Public Sub AhTextFitSpacingNormal()
     AhTextFitSpacingChange 0
 End Sub

Константа wdUndefined

В случае, если выделенный текст состоит из символов разного размера, свойство Selection.Font.Size не определено (в качестве значения свойства возвращается константа wdUndefined). Можно было бы увеличить или уменьшить размер шрифта каждого символа выделенного текста, однако такое поведение не всегда является приемлемым. Почему? Поведение приведенного выше кода (точнее говоря, функции AhTextFitSpacingChange) зависит от константы cbProcessEachCharIfWdUndefined, определенной в начале модуля. В случае, если значение константы равно True, программа изменяет размер шрифта каждого символа. В противном случае выводится сообщение об ошибке.

Панель инструментов "AhTextFit"

Теперь переходим к созданию простейшего пользовательского интерфейса - панели инструментов Нашей целью является вызов созданных (или существующих) макросов при помощи одного щелчка мыши на кнопке панели инструментов. Используя меню "Customize", создаем новую панель инструментов с именем "AhTextFit".

Добавляем кнопки на панель инструментов. Назначаем кнопкам соответствующие макросы, вставляем иконки. Текст кнопок изначально содержит полное имя вызываемого при нажатии кнопки макроса, поэтому заменяем его на более короткий и осмысленный. Панель инструментов готова к использованию.

Не рекомендуется изменять имена макросов, которые вызываются по нажатию кнопок панели инструментов. Полное имя макроса включает в себя имя модуля, поэтому изменение имени модуля после создания панели инструментов приводит к её полной неработоспособности. Для переноса макросов и панелей инструментов из одного шаблона в другой следует использовать специальный диалог, который вызывается по команде меню "Tool\Macro\Macros\Organizer".

 

Ниже приведен вид панели инструментов в следующих режимах - плавающая панель, панель среди других панелей Microsoft Word, панель в режиме "только иконки".

 

 

 

 

В следующей таблице приведено краткое описание кнопок панели инструментов "AhTextFit".

Кнопка панели

Макрос

Краткое описание

Help

AhTextFitAbout

Краткая подсказка по кнопкам панели инструментов.

Increase font size

AhTextFitFontInc

Увеличение размера шрифта.

Decrease font size

AhTextFitFontDec

Уменьшение размера шрифта.

Increase spacing

AhTextFitSpacingInc

Увеличение межсимвольного расстояния.

Decrease spacing

AhTextFitSpacingDec

Уменьшение межсимвольного расстояния.

Normal spacing

AhTextFitSpacingNormal

Нормальное межсимвольное расстояние.

 

Создание панелей инструментов будет подробно описано далее в этюдах, посвященных работе с меню и панелями инструментов. В этом этюде намеренно приведено именно краткое описание.

Тестирование

Копируем (предварительно сохраненный или существующий) шаблон "AhTextFit.dot" в папку автозагрузки и (пере)запускаем Microsoft Word. Если загрузка шаблона не запрещена и установлен необходимый для работы макросов уровень безопасности, то созданный шаблон автоматически загружается и панель инструментов доступна для использования при редактировании любого документа. Другими словами, копирование шаблона в папку автозагрузки превращает его в глобальный шаблон или плагин.

Открываем произвольный документ и тестируем кнопки панели инструментов "AhTextFit", не забывая предварительно выделить один или несколько абзацев.

После успешного тестирования шаблон "AhTextFit.dot" готов к использованию.

Краткая подсказка

Краткая подсказка по кнопкам панели инструментов имеет следующий вид.

Краткая подсказка для панели инструментов AhTextFit

Увеличение размера шрифта

При нажатии на кнопку "Увеличить размер шрифта" размер шрифта выделенных абзацев увеличивается на единицу. Если выделенный текст содержит шрифты разного размера, то поведение программы зависит от значения константы cbProcessEachCharIfWdUndefined.

В случае, если константа cbProcessEachCharIfWdUndefined = True изменение размера происходит даже в том случае, если выделенный текст содержит шрифты разного размера.

В случае, если константа cbProcessEachCharIfWdUndefined = False и выделенный текст содержит символы с разным размером шрифта появляется сообщение об ошибке

На следующей картинке изображен текст до и после изменения размера шрифта.

 В случае попытки сделать размер шрифта нулевым или слишком большим появляется сообщение об ошибке

Попытка вручную установить нулевой размер шрифта приводит к следующему сообщению

Размер шрифта может изменяться от 1 до 1638 пунктов.
Или от 1/72 до 22.75 дюйма.
Или от 0.035 до 57.785 сантиметров.

Уменьшение размера шрифта

При нажатии на кнопку "Уменьшить размер шрифта" размер шрифта выделенных абзацев уменьшается на единицу. Если выделенный текст содержит шрифты разного размера, то поведение программы зависит от значения константы cbProcessEachCharIfWdUndefined. В случае, если значение константы равно True изменение размера происходит даже в том случае, если выделенный текст содержит шрифты разного размера. В случае, если значение константы равно False и выделенный текст содержит символы с разным размером шрифта появляется сообщение об ошибке.

Увеличение межсимвольного расстояния

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

На следующей картинке изображен текст с разным значением межсимвольного расстояния (разрядки).

Если выделенный текст содержит разные межсимвольные расстояния, то поведение программы зависит от значения константы cbProcessEachCharIfWdUndefined. В случае, если значение константы равно True изменение происходит даже в том случае, если выделенный текст содержит разные межсимвольные расстояния. В случае, если значение константы равно False появляется сообщение об ошибке.

 

Уменьшение межсимвольного расстояния

При нажатии на кнопку "Уменьшить межсимвольное расстояние" межсимвольное расстояние для выделенных абзацев уменьшается на единицу. Если выделенный текст содержит символы с разным межсимвольным расстоянием, появляется сообщение об ошибке.

Нормальное межсимвольное расстояние

При нажатии на кнопку "Нормальное межсимвольное расстояние" для выделенных абзацев устанавливается нормальное межсимвольное расстояние.

Выводы

В этой главе кратко описаны процессы создания шаблона, открытия шаблона, создания нового модуля и панели инструментов. Подробно эти вопросы рассматриваются во второй главе книги, которая целиком посвящена панелям инструментов. Реализованы простые операции форматирования - изменение размера шрифта, и изменение межсимвольного расстояния между символами. Создана панель инструментов "AhTextFit", предоставляющая пользовательский интерфейс к простым операциям форматирования текста.

 

Задание 1

Измените макросы так, чтобы обрабатывалась ситуация когда выделение содержит шрифты разного размера или разные межсимвольные расстояния.

Подсказка. Установите для константы cbProcessEachCharIfWdUndefined значение True и протестируйте полученное решение. Поэкспериментируйте с обоими вариантами. Примите решение о том, какой вариант поведения функции устраивает лично Вас и реализуйте его.

 

Задание 2

Если Вы плохо знаете английский язык или Вас раздражают подсказки на английском языке, просто возьмите и самостоятельно переведите на русский язык сообщения об ошибках (секция 'Messages' в коде) и строки подсказки в тексте процедуры AhTextFitAbout. Должно получиться примерно следующее:

 

'
' Messages
'
Private Const cErrFontSizeUndefined As String = "
Выделение содержит символы с разным размером шрифт
а."
Private Const cErrFontSpacingUndefined As String = "
Выделение содержит символы с разной величиной разрядки."
Private Const cErrFontSizeError As String = "
Ошибка изменения размера шрифта."
Private Const cErrFontSpacingError As String = "
Ошибка изменения разрядки."

'
' AhTextFitAbout
'
Sub AhTextFitAbout()
MsgBox "Этюды для программистов Microsoft Word." & vbCrLf & _
    "Этюд 1.1. Подгонка размера текста." & vbCrLf & _
    "http://www.transcriber.ru" & vbCrLf & vbCrLf & _
     "Шаблон AhTextFit.dot - Подгонка размера текста. Изменение размера шрифта и величины разрядки." & vbCrLf & vbCrLf & _
     "
Параметры:" & vbCrLf & _
     "
Шаг изменения размера шрифта = " & ciFontSizeStep & vbCrLf & _
     "
Шаг изменения разрядки = " & ciFontSpacingStep & vbCrLf
End Sub

Не забудьте сохранить сделанные изменения.

Честно говоря, мне ничего не стоило поместить на сайте несколько вариантов этого и других шаблонов с сообщениями на разных языках. Однако я этого не сделал специально. С тем, чтобы у читателя был лишний повод всё же открыть редактор Visual Basic Editor и заменить таки пару строк в коде, написанном на VBA. Лиха беда начало!

 

Задание 3

Если встроенные команды "Grow Font (Ctrl+>)", "Shrink Font (Ctrl+<)", "Grow Font 1 Pt (Ctrl+])" и "Shrink Font 1 Pt (Ctrl+[)" нравятся Вам больше рассмотренных в этом этюде, просто измените текст соответствующих макросов. Сделайте это самостоятельно. И вообще, не стесняйтесь экспериментировать. Если что-то пойдёт не так, всегда можно вернуться к первоначальной версии шаблона.

 

Задание 4

Помимо межсимвольного (разрядки), существует ещё и межстрочное расстояние (разбивка). При необходимости добавьте в шаблон кнопки панели инструментов и макросы для изменения разбивки. Не забудьте о том, что по нажатию кнопки вызывается уже существующий макрос.

 

Задание 5

Если желание экспериментировать не ослабевает, изучите все методы и свойства объекта Font. После этого подумайте о том - какие встроенные возможности форматирования шрифтов Microsoft Word не устраивают лично Вас. Составьте список необходимых улучшений. А затем, шаг за шагом, реализуйте все поставленные задачи.

В приведенном коде, помимо 'слова' (или объекта) Font (шрифт), встречаются ещё такие 'слова', как 'Documents', 'Selection' и 'Range'. Если Вы ещё не догадались об их значении, то в заданиях к следующему этюду есть подсказка.

 


Этюды для программистов Microsoft Word. Этюд 1.1. Подгонка размера текста.


© 2000-2009 Евгений Ахунджанов, Все Права Сохранены.
www.transcriber.ru | Послать письмо автору