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

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


Этюд 1.4. Стили

Style (1 syl.) is from the Latin stylus (an iron pencil for writing on waxen tablets, etc.). The characteristic of a person's writing is called his style. Metaphorically it is applied to composition and speech. Good writing is stylish, and, metaphorically, smartness of dress and deportment is so called.

"Style is the dress of thought, and a well-dressed thought, like a well-dressed man, appears to great advantage."- Chesterfield: Letter ccxl. p. 361.

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

СТИЛЬ м. штиль, немецк. в искуствах: пошиб; род, образ, вкус, манера. Стиль готический, мавританский.

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

СТИЛЬ (лат. stilus - stylus, от греч. stylos - палочка), в древности и в средние века заостренный стержень из кости, металла или дерева, которым писали на восковых дощечках или на бересте.

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

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

В разделе "Поиск и замена с использованием стилей" я выполняю обещание, данное в Задании 3 "Find and Replace" к Этюду 1.3 и рассказываю о том, как исправить ошибку кода поиска и замены автоматического генератора макросов Microsoft Word.

Ресурсы

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

 

Задание. Объект Style и коллекция Styles.

Прежде чем переходить к постановке и решению задачи, использующей стили, логично познакомиться с тем, как устроены стили Microsoft Word. В Приложении стилям посвящена специальная страница. [Читать!]

Вместе со свойствами объекта Style (Стиль) и коллекции Styles, рассматриваются также свойства объектов, являющихся частью объекта Style, такие как Font (Шрифт), Border (Граница), Frame (Рамка), Shading (Затенение), ParagraphFormat и некоторые другие. Отдельная страница Приложения посвящена перечислениям Color (Цвет) и ColorIndex (номер цвета).

В следующей таблице приведено краткое содержание справочных файлов Приложения, с которыми имеет смысл познакомиться в процессе работы с настоящим этюдом.

Цвет Цвет. Для управления цветом объекта обычно используется свойство Color или свойство ColorIndex.
Border (Граница) Объект Border (Граница)
Диалог "Borders and Shading"
Перечисление WdLineStyle - стили линий
Frame (Рамка) Объект Frame (Рамка)
Диалог "Frame"
Перечисление WdFrameSizeRule
Перечисление WdFramePosition
Перечисление WdRelativeHorizontalPosition
Перечисление WdRelativeVerticalPosition
Shading (Затенение) Объект Shading (Затенение)
Диалог "Borders and Shading"
Перечисление WdTextureIndex\
Font (Шрифт) Объект Font (Шрифт)
Перечисление WdAnimation
Перечисление WdUnderline - типы подчеркивания
Перечисление wdEmphasisMark
ParagraphFormat Объект ParagraphFormat
Перечисление WdParagraphAlignment - выравнивание параграфа
Перечисление WdBaselineAlignment - выравнивание базовой линии
Перечисление WdLineSpacing
Перечисление WdOutlineLevel
Style (Стиль) Объект Style
Перечисление WdStyleType - типы стилей
Коллекция Styles
Перечисление WdBuiltinStyle - встроенные стили

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

Поиск и замена с использованием стилей

Как уже было сказано выше, текст отформатированный заданным стилем легко искать и/или заменять, причем замена может заключаться в простом применении другого стиля. Для замены стилей нужно использовать кнопку "Format" диалога "Find and Replace".

На приведенном рисунке, изображен диалог "Find and Replace", в котором для поиска задан стиль "AH_BYLINE_1" с атрибутом шрифта Bold, а для замены задан стиль "AH_BYLINE_2". Заметьте, что оба поля "Найти" и "Заменить на" пусты - мы собираемся искать атрибуты форматирования.

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

'
' AhReplaceStyleTest
'
Sub AhReplaceStyleTest()
'
' AhReplaceStyle Macro
' Macro recorded 2/1/2006 by Evgeny Akhundzhanov
'
'
' Find
Object formatting
'
    Selection.Find.ClearFormatting
    Selection.Find.Style = ActiveDocument.Styles("AH_BYLINE_1")
    Selection.Find.ParagraphFormat.Borders.Shadow = False
'
' Due to the bug in MS Word Macro Generator
' changes in font attributes don't reflect in VBA code.
' You need to add the required attributes manually.
'
    Selection.Find.Font.Bold = True
   
'
' Replacement
Objectformatting
'
    Selection.Find.Replacement.ClearFormatting
    Selection.Find.Replacement.Style = ActiveDocument.Styles("AH_BYLINE_2")
    Selection.Find.Replacement.ParagraphFormat.Borders.Shadow = False
    ' Selection.Find.Replacement.Font.Italic = True
    With Selection.Find
        .Text = ""
        .Replacement.Text = ""
        .Forward = True
        .Wrap = wdFindContinue
        .Format = True
        .MatchCase = False
        .MatchWholeWord = False
        .MatchWildcards = False
        .MatchSoundsLike = False
        .MatchAllWordForms = False
    End With
    Selection.Find.Execute Replace:=wdReplaceAll
End Sub

 

Из-за ошибки в генераторе макросов Microsoft Word, код для атрибутов шрифта объектов Find и Replacement не генерируется автоматически. Соответствующий код нужно добавлять в макрос вручную.

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

Selection.Find.Font.Bold = True

Изменение атрибутов шрифта замены производится аналогично:

Selection.Find.Replacement.Font.Italic = True

Функциональная спецификация

Задача

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

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

Панель инструментов "AhTextStyles" имеет следующий вид.

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

Кнопка

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

Help

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

Create

Создание стилей AhHeadlineStyle1 и AhHeadlineStyle2.

Delete

Удаление стилей AhHeadlineStyle1 и AhHeadlineStyle2.

Style1

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

Style2

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

Fonts Demo

Создать новый документ с образцами всех шрифтов, установленных в системе.

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

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

Создание пользовательских стилей

При нажатии кнопки "Create" создаются стили с именами "AhHeadlineStyle1" и "AhHeadlineStyle2". В случае если стиль с таким именем уже существует, выдается сообщение и существующий стиль не переопределяется.

Удаление пользовательских стилей

При нажатии кнопки "Delete" удаляются стили с именами "AhHeadlineStyle1" и "AhHeadlineStyle2". В случае если стилей с такими именами не существует, ничего не происходит.

Применение стиля 1

Применение стиля 1 отображено на следующем рисунке.

 

 

Применение стиля 2

В определении стиля 2 заданы параметры объекта Frame.

Применение стиля 2 отображено на следующем рисунке.

 

При попытке редактирования текста, отформатированного стилем 2, отображается рамка.

 

Образцы шрифтов, установленных в системе

На следующей картинке приведена часть документа, демонстрирующего примеры установленных в системе шрифтов. Документ был сгенерирован автоматически с помощью макроса AhTextFontsDemo, который, в свою очередь основан на макросах модуля FontSampleGenerator шаблона Macros9.dot, созданном в Microsoft Technical Support. Макросы были адаптированы автором в процессе изучения чужого опыта. Автор вообще имеет обыкновение адаптировать "под себя" всё интересное, что попадает в поле зрения в процессе работы или обучения. Заметьте, что в отличие от выпадающего списка "Шрифт", полученный документ можно распечатать.

Реализация - шаблон "AhTextStyles.dot"

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

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

Операция

Имя макроса

Создание стиля

AhCreateHeadlineStyles

Удаление стиля

AhDeleteHeadlineStyle, AhDeleteHeadlineStyles

Проверка существования стиля

AhStyleExists

Применение стиля

AhStyleSelection, AhStyle1, AhStyle2

Исходные тексты макросов приведены далее.

'
' File AhTextStyles.dot|AhTextStyles
'
' Etudes for Microsoft Word Programmers.
' Etude
1.4. Styles.
'
' First published on http://www.transcriber.ru
'
' © 2000-2007. Evgeny Akhundzhanov. All rights reserved.
'
 

Константы

'
' Constants
'
Private Const cStrHeadlineStyle1 As String = "AhHeadlineStyle1"
Private Const cStrHeadlineStyle2 As String = "AhHeadlineStyle2"

Сообщения

'
' Messages
'
Private Const cStrStylesHelp As String = _
    "Etudes for Microsoft Word Programmers." & vbCrLf & _
    "Etude
1.4. Styles." & vbCrLf & _
    "http://www.transcriber.ru" & vbCrLf & vbCrLf & _
    "Template AhTextStyles.dot - Working with styles." & vbCrLf & vbCrLf & _
        "Create - creates styles %1 and %2" & vbCrLf & _
        "Delete - deletes styles %1 and %2" & vbCrLf & vbCrLf & _
        "Style 1 - applies Style %1" & " to the selection" & vbCrLf & _
        "Style 2 - applies Style %2" & " to the selection" & vbCrLf & _
        "" & vbCrLf
Private Const cStrStyleExists As String = "Style <%1> exists."
Private Const cStrStyleDoesntExist As String = "Style <%1> doesn't exist."
Private Const cStrSelectionIsEmpty As String = "Selection is empty."

 

Процедура AhStylesHelp

'
' AhStylesHelp
'
Sub AhStylesHelp()
Dim strStylesHelp As String
    strStylesHelp = cStrStylesHelp
    strStylesHelp = Replace(strStylesHelp, "%1", cStrHeadlineStyle1)
    strStylesHelp = Replace(strStylesHelp, "%2", cStrHeadlineStyle2)
   
    MsgBox strStylesHelp
End Sub

Процедура AhStyleExists

'
' AhStyleExists
'
Public Function AhStyleExists(ByVal strStyleName As String) As Boolean
On Error GoTo ErrorLabel
With ActiveDocument.Styles(strStyleName)
    AhStyleExists = True
    Exit Function
End With
ErrorLabel:
    AhStyleExists = False
End Function

Процедура AhDeleteStyle

'
' AhDeleteStyle
'
Sub AhDeleteHeadlineStyle(ByVal strStyleName As String)
If Documents.Count = 0 Then Exit Sub
    If AhStyleExists(strStyleName) Then
        ActiveDocument.Styles(strStyleName).Delete
    End If
End Sub

Процедура AhDeleteHeadlineStyles

'
' AhDeleteHeadlineStyles
'
Sub AhDeleteHeadlineStyles()
    AhDeleteStyle cStrHeadlineStyle1
    AhDeleteStyle cStrHeadlineStyle2
End Sub

Процедура AhCreateHeadlineStyles

'
' AhCreateHeadlineStyles
'
Sub AhCreateHeadlineStyles()
Dim strStyleName As String
Dim strStyleExists As String
 
If AhStyleExists(cStrHeadlineStyle1) Then
    strStyleExists = Replace(cStrStyleExists, "%1", cStrHeadlineStyle1)
    MsgBox strStyleExists
Else
    strStyleName = cStrHeadlineStyle1
    ActiveDocument.Styles.Add Name:=strStyleName, Type:=wdStyleTypeParagraph
    With ActiveDocument.Styles(strStyleName)
    .AutomaticallyUpdate = False
    With .Font
        .Name = "Times New Roman"
        .Size = 16
        .Bold = True
        .Italic = False
        .Underline = wdUnderlineNone
        .UnderlineColor = wdColorAutomatic
        .StrikeThrough = False
        .DoubleStrikeThrough = False
        .Outline = False
        .Emboss = False
        .Shadow = True
        .Hidden = False
        .SmallCaps = False
        .AllCaps = False
        .Color = wdColorBlue
        .Engrave = False
        .Superscript = False
        .Subscript = False
        .Scaling = 100
        .Kerning = 0
        .Animation = wdAnimationNone
    End With
    With .ParagraphFormat
        .LeftIndent = InchesToPoints(0)
        .RightIndent = InchesToPoints(0)
        .SpaceBefore = 0
        .SpaceBeforeAuto = False
        .SpaceAfter = 0
        .SpaceAfterAuto = False
        .LineSpacingRule = wdLineSpaceSingle
        .Alignment = wdAlignParagraphLeft
        .WidowControl = True
        .KeepWithNext = False
        .KeepTogether = False
        .PageBreakBefore = False
        .NoLineNumber = False
        .Hyphenation = True
        .FirstLineIndent = InchesToPoints(0)
        .OutlineLevel = wdOutlineLevelBodyText
        .CharacterUnitLeftIndent = 0
        .CharacterUnitRightIndent = 0
        .CharacterUnitFirstLineIndent = 0
        .LineUnitBefore = 0
        .LineUnitAfter = 0
    End With
    .NoSpaceBetweenParagraphsOfSameStyle = False
    .ParagraphFormat.TabStops.ClearAll
    With .ParagraphFormat
        With .Shading
            .Texture = wdTextureNone
            .ForegroundPatternColor = wdColorAutomatic
            .BackgroundPatternColor = wdColorAutomatic
        End With
        .Borders(wdBorderLeft).LineStyle = wdLineStyleNone
        .Borders(wdBorderRight).LineStyle = wdLineStyleNone
        .Borders(wdBorderTop).LineStyle = wdLineStyleNone
        .Borders(wdBorderBottom).LineStyle = wdLineStyleNone
        With .Borders
            .DistanceFromTop = 1
            .DistanceFromLeft = 4
            .DistanceFromBottom = 1
            .DistanceFromRight = 4
            .Shadow = False
        End With
    End With
    .LanguageID = wdEnglishUS
    .NoProofing = False
    .Frame.Delete
    End With
End If
   
If AhStyleExists(cStrHeadlineStyle2) Then
    strStyleExists = Replace(cStrStyleExists, "%1", cStrHeadlineStyle2)
    MsgBox strStyleExists
Else
    strStyleName = cStrHeadlineStyle2
    ActiveDocument.Styles.Add Name:=strStyleName, Type:=wdStyleTypeParagraph
    With ActiveDocument.Styles(strStyleName)
    .AutomaticallyUpdate = False
    With .Font
        .Name = "Arial"
        .Size = 14
        .Bold = True
        .Italic = True
        .Underline = wdUnderlineNone
        .UnderlineColor = wdColorAutomatic
        .StrikeThrough = False
        .DoubleStrikeThrough = False
        .Outline = False
        .Emboss = False
        .Shadow = False
        .Hidden = False
        .SmallCaps = False
        .AllCaps = False
        .Color = wdColorRed
        .Engrave = True
        .Superscript = False
        .Subscript = False
        .Scaling = 100
        .Kerning = 0
        .Animation = wdAnimationNone
    End With
    With .ParagraphFormat
        .LeftIndent = InchesToPoints(0)
        .RightIndent = InchesToPoints(0)
        .SpaceBefore = 0
        .SpaceBeforeAuto = False
        .SpaceAfter = 0
        .SpaceAfterAuto = False
        .LineSpacingRule = wdLineSpaceSingle
        .Alignment = wdAlignParagraphLeft
        .WidowControl = True
        .KeepWithNext = False
        .KeepTogether = False
        .PageBreakBefore = False
        .NoLineNumber = False
        .Hyphenation = True
        .FirstLineIndent = InchesToPoints(0)
        .OutlineLevel = wdOutlineLevelBodyText
        .CharacterUnitLeftIndent = 0
        .CharacterUnitRightIndent = 0
        .CharacterUnitFirstLineIndent = 0
        .LineUnitBefore = 0
        .LineUnitAfter = 0
    End With
    .NoSpaceBetweenParagraphsOfSameStyle = False
    .ParagraphFormat.TabStops.ClearAll
    With .ParagraphFormat
        With .Shading
            .Texture = wdTextureNone
            .ForegroundPatternColor = wdColorAutomatic
            .BackgroundPatternColor = wdColorAutomatic
        End With
        .Borders(wdBorderLeft).LineStyle = wdLineStyleNone
        .Borders(wdBorderRight).LineStyle = wdLineStyleNone
        .Borders(wdBorderTop).LineStyle = wdLineStyleNone
        .Borders(wdBorderBottom).LineStyle = wdLineStyleNone
        With .Borders
            .DistanceFromTop = 1
            .DistanceFromLeft = 4
            .DistanceFromBottom = 1
            .DistanceFromRight = 4
            .Shadow = False
        End With
    End With
    .LanguageID = wdEnglishUS
    .NoProofing = False
    ' .Frame.Delete
    .Frame.LockAnchor = True    ' we leave the Frame here !    End With
End If
End Sub

Процедура AhStyleSelection

'
' AhStyleSelection
'
Private Sub AhStyleSelection(ByVal strStyleName As String)
If Documents.Count = 0 Then Exit Sub
    If AhStyleExists(strStyleName) Then
        If Selection.Start = Selection.End Then
            MsgBox cStrSelectionIsEmpty
        Else
            Selection.Style = strStyleName
        End If
    Else
        Dim strStyleMsg As String
        strStyleDoesntExist = Replace(cStrStyleDoesntExist, "%1", strStyleName)
        MsgBox strStyleDoesntExist
    End If
End Sub

Процедура AhStyle1

'
' AhStyle1
'
Sub AhStyle1()
    AhStyleSelection cStrHeadlineStyle1
End Sub

Процедура AhStyle2

'
' AhStyle2
'
Sub AhStyle2()
    AhStyleSelection cStrHeadlineStyle2
End Sub

Процедура AhFontsDemo

Процедура AhFontsDemo вызывает процедуру FontSampleGenerator из модуля AhTextFontsDemo.
Процедура FontSampleGenerator взята из шаблона Macros9.dot, созданном в Microsoft Technical Support.
Соответствующий VBA код в тексте книги не приводится, его можно
посмотреть в шаблоне AhTextStyles.dot.

'
' AhFontsDemo
'
Sub AhFontsDemo()
Dim iAnswer As Long
    iAnswer = MsgBox("AhFontsDemo", vbYesNo)
    If iAnswer = vbYes Then
        AhTextFontsDemo.FontSampleGenerator
    End If
End Sub

Выводы

В этой главе рассмотрены свойства и методы объекта Style, коллекции Styles и некоторых других объектов, связанных с форматированием. Рассмотрены как встроенные, так и пользовательские стили. Созданы макросы для создания, удаления и изменения стилей, а также для проверки существования стилей.

На основе спецификации создан шаблон "AhTextStyles.dot", который содержит макросы для работы со стилями.

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

Задание 1

Измените макросы и панель инструментов шаблона "AhTextStyles.dot" таким образом, чтобы им стало удобно пользоваться лично Вам.

 

Задание 2. Часто используемые встроенные стили.

Количество часто используемых встроенных стилей, как правило, не очень велико. Обычно пользователи используют всего несколько встроенных стилей. Создайте новый шаблон для ускорения работы со встроенными стилями. Создайте макросы, применяющие к выделенному тексту пять (или семь) наиболее часто используемых Вами встроенных стилей. Добавьте в панель инструментов кнопки для применения каждого из Ваших стилей. Результат должен выглядеть примерно следующим образом

Для "нормальных стилей" можно использовать, например, следующие встроенные стили - "Normal", "Normal (Web)" и "Body Text". Для стилей заголовков - "H1", "H2" и "H3" подойдут следующие встроенные стили - "Heading 1","Heading 2" и "Heading 3". Встроенные стили для кнопок "Agate" подберите самостоятельно.

Если встроенных стилей для Ваших  целей недостаточно, то необходимо создать код (и, конечно, кнопки), в котором к выделенному тексту применяются как встроенные, так и пользовательские стили. Я надеюсь, что после тщательного изучения этого Этюда Вы легко сможете это сделать. Ведь сможете?

Для большего количества  стилей, вероятно, удобнее использовать выпадающий список. Создание выпадающих списков на панели инструментов рассматривается в Этюде 10 "Программное создание панели инструментов".


				

Задание 3. Демонстрация всех доступных стилей

По аналогии с макросом демонстрации шрифтов (процедура AhFontsDemo вызывается при нажатии кнопки "Fonts Demo") создайте макрос, демонстрирующий все стили, используемые  в текущем открытом документе.
Результат должен выглядеть примерно следующим образом
.

 


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


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