1

Тема: Создаем полезные функции и свойства объекта Page

Для того, чтобы создавать полезные свойства для объекта Page(Страница) создадим в редакторе VBA новый модуль класса и присвоим ему оригинальное имя например clsPage
Затем clsPage создаем в классе основное свойство Page
1. Объект Rectangle является свойством объекта Page и включает в себя строки набранные в основной области страницы.
2. Массив Lines является свойством объекта Page и включает в себя строки входящие в объект Rectangle

Эти 3 созданных нами свойства являются основой для создания новых свойств, функций и событий.
Создаем полезные функции и свойства объекта Page

Для обращения к созданным свойствам функциям и событиям объявляем новый экземпляр класса

Set сPage = New clsPage

Затем в этом классе объявляем нужную нам страницу
(в данном примере будет указана страница в которой находится курсор)

Set сPage.Page = ActiveWindow.ActivePane.Pages(Selection.Information(wdActiveEndAdjustedPageNumber))

Теперь перейдем непосредственно к созданию новых свойств, функций и событий класса clsPage

Post's attachments

001.jpg
001.jpg 115.32 Кб, 2 скачиваний с 2012-05-17 

You don't have the permssions to download the attachments of this post.

2

Re: Создаем полезные функции и свойства объекта Page

После создания класса указанного в посте 1 переходим к созданию свойств класса
Первое что мы создадим это свойство mPageSetup, включающее в себя настройки страницы

Public Property Get mPageSetup() As PageSetup ' Настройка страницы
   Set mPageSetup = Me.Rectangle.Range.PageSetup
End Property

Теперь создадим основные размерные свойства страницы:

1. Ширина страницы

Public Property Get PageWidth() As Single
   PageWidth = Me.mPageSetup.PageWidth
End Property

2. Высота страницы

Public Property Get PageHeight() As Single
   PageHeight = Me.mPageSetup.PageHeight
End Property

Соответственно:

3. Площадь страницы

Public Property Get PageSpace() As Single
   PageSpace = Me.PageWidth * Me.PageHeight
End Property

ВАЖНО ПОМНИТЬ!!!

Все свойства Worda, связанные с размерами измеряются в точках(Points)

Для перевода в другие единицы измерения используются следующие встроенные функции VBA:
1. PointsToInches() - Переводит точки в дюймы
2. PointsToCentimeters() - Переводит точки в сантиметры
3. PointsToMillimeters() - Переводит точки в миллиметры

Для обратного перевода сответственно:

1. InchesToPoints()
2. CentimetersToPoints()
3. MillimetersToPoints()

Все значения возвращаются в формате Single

ТАКЖЕ ВАЖНО!!!

Все переводы размеров из одной единицы измерения в другую преблизительны

Для примера формат страницы A4 равен 210х297 мм.

При переводе созданных нами свойств PageWidth и PageHeight в миллиметры

PointsToMillimeters(PageWidth) = 210,0086
PointsToMillimeters(PageHeight) = 297,0036

3

Re: Создаем полезные функции и свойства объекта Page

Создав свойства ширины, высоты и площади страницы (пост 2) переходим к созданию внутренних размеров страницы.

Для начала создадим свойства полей страницы используя уже созданное нами свойство mPageSetup

Public Property Get LeftMargin() As Single
   LeftMargin = Me.mPageSetup.LeftMargin
End Property

Public Property Get RightMargin() As Single
   RightMargin = Me.mPageSetup.RightMargin
End Property

Public Property Get TopMargin() As Single
   TopMargin = Me.mPageSetup.TopMargin
End Property

Public Property Get BottomMargin() As Single
   BottomMargin = Me.mPageSetup.BottomMargin
End Property

Содав свойства полей, на их основе создаем свойства Ширины, Высоты и Площади печатной области

Public Property Get PrinttableWidth() As Single
   PrinttableWidth = Me.PageWidth - (Me.LeftMargin + Me.RightMargin)
End Property

Public Property Get PrinttableHeight() As Single
   PrinttableHeight = Me.PageHeight - (Me.TopMargin + Me.BottomMargin)
End Property

Public Property Get PrinttableSpace() As Single
   PrinttableSpace = Me.PrinttableWidth * Me.PrinttableHeight
End Property

4

Re: Создаем полезные функции и свойства объекта Page

Для продолжения данной темы создайте форму которая описана в теме
http://wordexpert.ru/forum/viewtopic.php?id=1273
Проверьте чтобы созданная форма и класс clsPage находились в одном проекте VBA, желательно в Normal

5

Re: Создаем полезные функции и свойства объекта Page

Далее модифицируем созданные нами ранее свойства:

Public Property Get PageWidth() As Single
   PageWidth = form_ClassInfo.Value(Me.mPageSetup.PageWidth)
End Property

Public Property Get PageHeight() As Single
   PageHeight = form_ClassInfo.Value(Me.mPageSetup.PageHeight)
End Property

Public Property Get PageSpace() As Single
   PageSpace = Me.PageWidth * Me.PageHeight
End Property

Public Property Get LeftMargin() As Single
   LeftMargin = form_ClassInfo.Value(Me.mPageSetup.LeftMargin)
End Property

Public Property Get RightMargin() As Single
   RightMargin = form_ClassInfo.Value(Me.mPageSetup.RightMargin)
End Property

Public Property Get TopMargin() As Single
   TopMargin = form_ClassInfo.Value(Me.mPageSetup.TopMargin)
End Property

Public Property Get BottomMargin() As Single
   BottomMargin = form_ClassInfo.Value(Me.mPageSetup.BottomMargin)
End Property

Public Property Get PrinttableWidth() As Single
   PrinttableWidth = Me.PageWidth - (Me.LeftMargin + Me.RightMargin)
End Property

Public Property Get PrinttableHeight() As Single
   PrinttableHeight = Me.PageHeight - (Me.TopMargin + Me.BottomMargin)
End Property

Public Property Get PrinttableSpace() As Single
   PrinttableSpace = Me.PrinttableWidth * Me.PrinttableHeight
End Property

Отредактировано aap77 (17.05.2012 21:57:54)

6

Re: Создаем полезные функции и свойства объекта Page

Далее мы создаем процедуру иницилизации класса:

Private Sub Class_Initialize()
    Load form_ClassInfo
        Options.MeasurementUnit = wdMillimeters
        form_ClassInfo.opb_UnitApplication.Value = True
            With form_ClassInfo
                .opb_UnitInches.Enabled = False
                .opb_UnitCentimeters.Enabled = False
                .opb_UnitMillimeters.Enabled = False
                .opb_UnitPoints.Enabled = False
                .opb_Lines.Enabled = False
                .opb_UnitPicas.Enabled = False
                .Caption = "Информация о свойствах класса clsPage"
            End With
End Sub

В данной процедуре мы загружаем форму созданную нами в теме
http://wordexpert.ru/forum/viewtopic.php?id=1273

Задаем единицы измерения приложения Word в миллиметрах.
Блокируем все радиокнопки формы кроме opb_UnitApplication у нас автоматически свойство Unit формы становится равным текущим единицам измерения приложения. Также создаем заголовок формы.

Теперь создаем свойство InfoText в котором будем размещать информацию о созданных нами свойствах

Public Property Get InfoText() As String
   InfoText = InfoText & "Ширина страницы = " & Me.PageWidth & Chr(13)
   InfoText = InfoText & "Высота страницы = " & Me.PageHeight & Chr(13)
   InfoText = InfoText & "Площадь страницы = " & Me.PageSpace & Chr(13)
   InfoText = InfoText & "Левое поле страницы = " & Me.LeftMargin & Chr(13)
   InfoText = InfoText & "Правое поле страницы = " & Me.RightMargin & Chr(13)
   InfoText = InfoText & "Вернее поле страницы = " & Me.TopMargin & Chr(13)
   InfoText = InfoText & "Нижнее поле страницы = " & Me.BottomMargin & Chr(13)
   InfoText = InfoText & "Ширина внутреннего поля страницы = " & Me.PrinttableWidth & Chr(13)
   InfoText = InfoText & "Высота внутреннего поля страницы = " & Me.PrinttableHeight & Chr(13)
   InfoText = InfoText & "Площадь внутреннего поля страницы = " & Me.PrinttableSpace & Chr(13)
End Property

Данное свойство по мере добавления новых свойств будет модернизироваться.

И последнее на сегодня в Модуле ThisDocument создадим макрос Тестирования созданного нами класса

Public Sub Test_clsPage()
Dim cPage As clsPage
    Set cPage = New clsPage
        Set cPage.Page = ActiveWindow.ActivePane.Pages(Selection.Information(wdActiveEndAdjustedPageNumber))
        form_ClassInfo.txtInfo = cPage.InfoText
        form_ClassInfo.Show
End Sub

Файл примера созданного нами класса на данном этапе находится во вложении
Для запуска тестирования откройте файл и запустите макрос Test_clsPage

Post's attachments

Blog1.dot 57 Кб, 2 скачиваний с 2012-05-17 

You don't have the permssions to download the attachments of this post.

7

Re: Создаем полезные функции и свойства объекта Page

Создадим в классе clsPage функцию форматирования числа и модернизируем свойства

Public Function FormatValue(Num As Variant) As Single
   FormatValue = Format(Num, "#####.#")
End Function
Public Property Get PageWidth() As Single
   PageWidth = Me.FormatValue(form_ClassInfo.Value(Me.mPageSetup.PageWidth))
End Property

Public Property Get PageHeight() As Single
   PageHeight = Me.FormatValue(form_ClassInfo.Value(Me.mPageSetup.PageHeight))
End Property

Public Property Get PageSpace() As Single
   PageSpace = Me.FormatValue(Me.PageWidth * Me.PageHeight)
End Property

Public Property Get LeftMargin() As Single
   LeftMargin = form_ClassInfo.Value(Me.mPageSetup.LeftMargin)
End Property

Public Property Get RightMargin() As Single
   RightMargin = Me.FormatValue(form_ClassInfo.Value(Me.mPageSetup.RightMargin))
End Property

Public Property Get TopMargin() As Single
   TopMargin = Me.FormatValue(form_ClassInfo.Value(Me.mPageSetup.TopMargin))
End Property

Public Property Get BottomMargin() As Single
   BottomMargin = Me.FormatValue(form_ClassInfo.Value(Me.mPageSetup.BottomMargin))
End Property

Public Property Get PrinttableWidth() As Single
   PrinttableWidth = Me.FormatValue(Me.PageWidth - (Me.LeftMargin + Me.RightMargin))
End Property

Public Property Get PrinttableHeight() As Single
   PrinttableHeight = Me.FormatValue(Me.PageHeight - (Me.TopMargin + Me.BottomMargin))
End Property

Public Property Get PrinttableSpace() As Single
   PrinttableSpace = Me.FormatValue(Me.PrinttableWidth * Me.PrinttableHeight)
End Property

8

Re: Создаем полезные функции и свойства объекта Page

Теперь создадим в нашем классе свойство PrinttableBounds, которое представляет собой коллекцию из 9 точек определяющих границы внутреннего поля страницы.
Данная коллекция представлена 4-мя элементами:
1. Подколлекция координат 3-х Верхних точек;
2. Подколлекция координат 3-х Центральных точек;
3. Подколлекция координат 3-х Нижних точек;
4. Элемент представляющий текстовую информацию о координатах всех точек

Public Property Get PrinttableBounds() As Collection
Dim TopBounds As Collection, lstXY As Collection, Info As String
Dim CenterBounds As Collection
Dim BottomBounds As Collection
    Set PrinttableBounds = New Collection
    Set TopBounds = New Collection
    Set CenterBounds = New Collection
    Set BottomBounds = New Collection
        Set lstXY = New Collection
            lstXY.Add Me.FormatValue(Me.LeftMargin), "X"
            lstXY.Add Me.FormatValue(Me.TopMargin), "Y"
                Info = Info & "    Точка_1: X = " & lstXY(1) & "; "
                Info = Info & "Y = " & lstXY(2) & Chr(13)
            TopBounds.Add lstXY, "Bounds_1"
        Set lstXY = New Collection
            lstXY.Add Me.FormatValue((Me.LeftMargin + Me.PrinttableWidth) / 2), "X"
            lstXY.Add Me.FormatValue(Me.TopMargin), "Y"
                Info = Info & "    Точка_2: X = " & lstXY(1) & "; "
                Info = Info & "Y = " & lstXY(2) & Chr(13)
            TopBounds.Add lstXY, "Bounds_2"
        Set lstXY = New Collection
            lstXY.Add Me.FormatValue(Me.LeftMargin + Me.PrinttableWidth), "X"
            lstXY.Add Me.FormatValue(Me.TopMargin), "Y"
                Info = Info & "    Точка_3: X = " & lstXY(1) & "; "
                Info = Info & "Y = " & lstXY(2) & Chr(13)
            TopBounds.Add lstXY, "Bounds_3"
        Set lstXY = New Collection
            lstXY.Add Me.FormatValue(Me.LeftMargin), "X"
            lstXY.Add Me.FormatValue((Me.TopMargin + Me.PrinttableHeight) / 2), "Y"
                Info = Info & "    Точка_4: X = " & lstXY(1) & "; "
                Info = Info & "Y = " & lstXY(2) & Chr(13)
            CenterBounds.Add lstXY, "Bounds_4"
        Set lstXY = New Collection
            lstXY.Add Me.FormatValue((Me.LeftMargin + Me.PrinttableWidth) / 2), "X"
            lstXY.Add Me.FormatValue((Me.TopMargin + Me.PrinttableHeight) / 2), "Y"
                Info = Info & "    Точка_5: X = " & lstXY(1) & "; "
                Info = Info & "Y = " & lstXY(2) & Chr(13)
            CenterBounds.Add lstXY, "Bounds_5"
        Set lstXY = New Collection
            lstXY.Add Me.FormatValue(Me.LeftMargin + Me.PrinttableWidth), "X"
            lstXY.Add Me.FormatValue((Me.TopMargin + Me.PrinttableHeight) / 2), "Y"
                Info = Info & "    Точка_6: X = " & lstXY(1) & "; "
                Info = Info & "Y = " & lstXY(2) & Chr(13)
            CenterBounds.Add lstXY, "Bounds_6"
        Set lstXY = New Collection
            lstXY.Add Me.FormatValue(Me.LeftMargin), "X"
            lstXY.Add Me.FormatValue(Me.TopMargin + Me.PrinttableHeight), "Y"
                Info = Info & "    Точка_7: X = " & lstXY(1) & "; "
                Info = Info & "Y = " & lstXY(2) & Chr(13)
            BottomBounds.Add lstXY, "Bounds_7"
        Set lstXY = New Collection
            lstXY.Add Me.FormatValue((Me.LeftMargin + Me.PrinttableWidth) / 2), "X"
            lstXY.Add Me.FormatValue(Me.TopMargin + Me.PrinttableHeight), "Y"
                Info = Info & "    Точка_8: X = " & lstXY(1) & "; "
                Info = Info & "Y = " & lstXY(2) & Chr(13)
            BottomBounds.Add lstXY, "Bounds_8"
        Set lstXY = New Collection
            lstXY.Add Me.FormatValue((Me.LeftMargin + Me.PrinttableWidth)), "X"
            lstXY.Add Me.FormatValue(Me.TopMargin + Me.PrinttableHeight), "Y"
                Info = Info & "    Точка_9: X = " & lstXY(1) & "; "
                Info = Info & "Y = " & lstXY(2) & Chr(13)
            BottomBounds.Add lstXY, "Bounds_9"
    PrinttableBounds.Add TopBounds, "TopBounds"
    PrinttableBounds.Add CenterBounds, "CenterBounds"
    PrinttableBounds.Add BottomBounds, "BottomBounds"
    Info = "Координаты точек внутреннего поля:" & Chr(13) & Info
    PrinttableBounds.Add Info
End Property

Следующим шагом будет создание очень важного свойства PrinttableCenterBounds, которое представляет собой координату центральной точки внутреннего поля и составляет коллекцию из 2-х элементов:
1. Подколлекция координат центральной точки;
2. Элемент представляющий текстовую информацию о координатах центральной точки внутреннего поля.

Public Property Get PrinttableCenterBounds() As Collection
Dim lstXY As Collection, Info As String
    Set PrinttableCenterBounds = New Collection
        Set lstXY = New Collection
            lstXY.Add Me.FormatValue((Me.LeftMargin + Me.PrinttableWidth) / 2), "X"
            lstXY.Add Me.FormatValue((Me.TopMargin + Me.PrinttableHeight) / 2), "Y"
        PrinttableCenterBounds.Add lstXY
        Info = "Центр внутреннего поля:" & Chr(13)
        Info = Info & "    Точка_5: X = " & lstXY(1) & "; "
        Info = Info & "Y = " & lstXY(2) & Chr(13)
        PrinttableCenterBounds.Add Info
End Property

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

Далее модернизируем уже созданное поле InfoText и проверяем правильность созданных нами свойств макросом Test_clsPage

Public Property Get InfoText() As String
   InfoText = InfoText & "Ширина страницы = " & Me.PageWidth & Chr(13)
   InfoText = InfoText & "Высота страницы = " & Me.PageHeight & Chr(13)
   InfoText = InfoText & "Площадь страницы = " & Me.PageSpace & Chr(13)
   InfoText = InfoText & "Левое поле страницы = " & Me.LeftMargin & Chr(13)
   InfoText = InfoText & "Правое поле страницы = " & Me.RightMargin & Chr(13)
   InfoText = InfoText & "Вернее поле страницы = " & Me.TopMargin & Chr(13)
   InfoText = InfoText & "Нижнее поле страницы = " & Me.BottomMargin & Chr(13)
   InfoText = InfoText & "Ширина внутреннего поля страницы = " & Me.PrinttableWidth & Chr(13)
   InfoText = InfoText & "Высота внутреннего поля страницы = " & Me.PrinttableHeight & Chr(13)
   InfoText = InfoText & "Площадь внутреннего поля страницы = " & Me.PrinttableSpace & Chr(13)
   InfoText = InfoText & Me.PrinttableBounds(4)
   InfoText = InfoText & Me.PrinttableCenterBounds(2)
End Property

Модернизированный файл прилагаю

Post's attachments

Blog1.dot 92 Кб, 1 скачиваний с 2012-05-18 

You don't have the permssions to download the attachments of this post.