Язык WordBasic - практический подход

         

Операторы OutlineCollapse и OutlineExpand


 
Оператор OutlineExpand расширяет диапазон показываемых уровней заголовков на один. Противоположный ему оператор OutlineCollapse сужает на один уровень этот диапазон. Активный документ должен находиться в режиме просмотра структуры документа или быть главным документом.
 
Пример.
 
Перейти при просмотре документа на один уровень вверх по структуре заголовков:
 
Sub MAIN
ViewOutline
EditSelectAll
OutlineCollapse
End Sub
 



Операторы перемещения объектов в стеке


 
В WordBasic есть возможность изменять положение рисованного объекта в стеке объектов, перемещая его либо в обоих направлениях по стеку, а также переводить рисунок с уровня “перед текстом” на уровень “за текстом” и обратно. Для этой цели служат две группы операторов, совершенно симметричные и отличающихся только словами Bring (перемещение вперёд) и Send (в обратном направлении).
Первая группа. Оператор DrawBringForward перемещает выбранный рисованный объект на одну позицию выше в стеке объектов, а DrawBringToFront перемещает объект в вершину стека. Эти операторы не перемещают объект с уровня позади текста на уровень перед текстом – это делает оператор DrawBringInFrontOfText.
Вторая группа. Оператор DrawSendBackward – перемещает объект на одну позицию ниже в стеке объектов, а DrawSendToBack – соответственно, перемещает его в низ стека. DrawSendBehindText переводит объект с уровня перед текстом на уровень за текстом.


Все эти операторы генерируют ошибку, если выбран не рисованный объект.
 
Операторы вставки
 
WinWord позволяет вставлять в документ рисунки, подготовленные в других пакетах (хотя при этом, возможно, у вас могут возникнуть проблемы).
 



Операторы перемещения рисунка



Рисунок перемещается по экрану в четырёх направлениях: вправо, влево, вверх и вниз. Для перемещения по диагонали используется составное движение. В WordBasic есть две сходные по действию группы операторов, которые помогают переместить объект.
Первая группа. Оператор DrawNudgeDownPixel – перемещает выбранный рисованный объект или объекты на одну точку вниз. Аналогично работают операторы DrawNudgeUpPixel, DrawNudgeRightPixel и DrawNudgeLeftPixel, только перемещают объект они соответственно вверх, вправо и влево.
Вторая группа. Это операторы DrawNudgeDown, DrawNudgeUp, DrawNudgeRight и DrawNudgeLeft, перемещающие выбранный объект на 10 точек вниз или, если в диалоговом окне Snap To Grid Moves (меню Drawing) выбрано Snap To Grid, перемещает выбранные объекты вниз на измерение, указанное в окне Vertical Spacing. Аналогично работают операторы только перемещают объект они соответственно вверх, вправо и влево.
Пример.
 
Нарисуем круг и переместим его в середину страницы. Для переноса рисунка послужит подпрограмма moveXY.
 
Sub MAIN
 DrawEllipse
 moveXY 115, 120
End Sub
 
Sub moveXY(X, Y)
i = Int(X / 10)
i2 = X - i
j = Int(Y / 10)
j2 = Y - j
For kx = 1 To i
DrawNudgeRight
Next kx
For mx = 1 To i2
DrawNudgeRightPixel
Next mx
For ky = 1 To j
DrawNudgeDown
Next ky
For my = 1 To j2
DrawNudgeDownPixel
Next my
End Sub
 



Операторы рисования


 
Каждый из перечисленных ниже операторов делает следующие:
переводит режим просмотра из обычного в просмотр расположения страницы; помещает соответствующий объект рисования по умолчанию в верхний левый угол текущей страницы до начала текста. Объекты обычно ориентированы с левого верхнего к правому нижнему углу. Слова “объект по умолчанию” означают, что такой объект имеет фиксированные размеры и форму, но так как это объект рисования, то с ним можно производить всевозможные преобразования: перемещать, растягивать, поворачивать и т.д. Важно то, что рисунок наносится поверх текста.
Оператор DrawLine
– помещает прямую линию перед текстом в начале текущей страницы. Для макрокоманды этот оператор почти бесполезен, важнее было бы иметь возможность рисовать линию между заданными точками.
Оператор DrawArc – помещает дугу.
Оператор DrawEllipse

эллипс (правда он по умолчанию круг).
Пример. Нарисуем калейдоскоп из кругов произвольного размера, цвета и разбросанных случайным образом по заданной области.
 
Sub MAIN
For i = 1 To 100
c = Int(Rnd() * 16)
f = Int(Rnd() * 16)
x = Int(Rnd() * 300)
y = Int(Rnd() * 200)
DrawEllipse
h1 = Int(Rnd() * 75)
FormatDrawingObject .FillColor = f, .LineColor = c, /
.HorizontalPos = x, .VerticalPos = y, .Height = h1, /
.Width = h1
Next i
End Sub
 
DrawRectangle – добавляет прямоугольник (по умолчанию квадрат).
DrawRoundRectangle – добавляет прямоугольник со скруглёнными углами.
DrawTextBox – добавляет ограниченную текстовую область к уровню рисунка. Это квадрат со стороной один дюйм.
DrawCallout – добавляет выноску (пояснение). Выноска содержит текст в прямоугольной области и стрелку, указывающую на поясняемую часть рисунка. С ней связан целый ряд операторов, которые рассмотрены чуть далее.
 
Более сложно рисуется произвольная ломанная линия, которая может быть замкнутой. Делается это с помощью двух операторов (DrawFreeformPolygon и DrawSetPolyPoints) и двумерного массива с координатами вершин.
Первая размерность массива должна быть не меньше числа вершин, иначе линия будет построена лишь частично и будет выдано сообщение об ошибке. Начало координат расположено в верхнем левом углу, первая координата задает расстояние по вертикали, а вторая по горизонтали. Оператор DrawFreeformPolygon просто помещает объект типа отрезок прямой в начало текущей страницы, а DrawSetPolyPoints применяет его к массиву с координатами. Лучше это видно на примере. Построим прямоугольник.
 
Sub MAIN
DrawFreeformPolygon
Dim вершины$(5, 2)
вершины$(1, 1) = "5 cm"
вершины$(1, 2) = "8 cm"
вершины$(2, 1) = "5 cm”
вершины$(2, 2) = "3 cm"
вершины$(3, 1) = "7 cm"
вершины$(3, 2) = "3 cm"
вершины$(4, 1) = "7 cm"
вершины$(4, 2) = "8 cm"
вершины$(5, 1) = "5 cm"
вершины$(5, 2) = "8 cm"
DrawSetPolyPoints 5, вершины$()
End Sub
 
При записи координат можно указать в каких единицах считать координаты (cm, pt). Сложный объект можно строить, например, пересчитывая координаты в массиве вершины$. Однако при большом количестве вершин это не самое простое занятие, поэтому для рисования произвольной ломанной линии существует несколько вспомогательных операторов и функций.
Функция DrawCountPolyPoints, как следует из её названия, возвращает число точек в произвольном полигоне.
Синтаксис:
DrawCountPolyPoints [(объект)]
Аргумент – либо номер объекта, принимающий значение от 1 до DrawCount(), либо, если аргумент опущен, текущий рисованный объект. Иначе возникает ошибка. Кстати, объект номер 1 тот, который отмечен якорем оператором с помощью оператора DrawSetRange (см. ниже).
Оператор DrawGetPolyPoints позволяет присвоить элементам двумерного массива координаты вершин ломанной линии.
Синтаксис:
DrawGetPolyPoints массив[$]() [, объект]
 
Заполняет двумерный массив координатами точек указанного рисованного объекта, который должен быть ломанной линией. Этот массив можно использовать в качестве аргумента оператора DrawSetPolyPoints для рисования другого объекта такого же типа.


Для определения размера массива следует применять функцию DrawCountPolyPoints(). Массив
может быть как числовым, так и символьным.
 
Следующие операторы работают только с объектами, нарисованными из меню Рисование. Если объект встроенный произойдёт ошибка.
DrawFlipHorizontal
– переворачивает выбранный рисованный объект слева направо.
DrawFlipVertical –
переворачивает выбранный рисованный объект сверху вниз.
Вот интересный пример с этими операторами, который я нашёл в Microsoft TechNet
#6/1996 г.:
 
Sub MAIN
If SelInfo(27) = - 1 Then FileNewDefault
DrawArc
FormatDrawingObject .HorizontalPos = 225, /
.VerticalPos = 110
For Cnt = 1 To 1000
DrawFlipHorizontal
DrawFlipVertical
Next Cnt
End Sub
 
DrawRotateLeft –
переворачивает выбранный рисованный объект на 90 градусов против часовой стрелки.
DrawRotateRight – переворачивает выбранный рисованный объект на 90 градусов по часовой стрелке.
 
Задание. Используя операторы поворота, добейтесь, чтобы в предыдущем примере дуга вращалась вокруг обеих диагоналей квадрата.
 
Массив параметров
 
В WordBasic, в отличие от других Бейсиков, существует множество операторов с громадным количеством параметров. Конечно можно каждый раз задавать аргументы оператора, но есть более интересный путь: для облегчения работы с параметрами в язык введены так называемые “массивы параметров”. Такой массив (по синтаксису его правильнее было бы называть структурой) объявляется оператором Dim c указанием какому оператору (а на самом деле диалоговому окну) он соответствует.
Синтаксис:
 
Dim dlg as имя_оператора
 
Например.
 
Dim dlg As FormatDrawingObject
 
Оператор FormatDrawingObject позволяет установить цвет и тип линии, цвет заливки, тень и множество других вещей. Заполнить массив параметров текущими значениями можно с помощью оператора:
 
GetCurValues dlg
 
Их можно извлекать оттуда и анализировать отдельно, что тоже одно из преимуществ этого метода.
К элементам массива можно обращаться как к элементам структуры с помощью составного имени: имя_массива.имя_аргумента
Например.
 
dlg.LineType = 1
dlg.LineColor = 5
 
Для изменения параметров следует выполнить оператор с массивом параметров в качестве аргумента:
 
FormatDrawingObject dlg
 

Операторы вставки


 
Операторы InsertDateField, InsertDateTime, InsertFormField, InsertMergeField, InsertPageField, InsertTimeField выполняют действия описанные в таблице для полей, названия которых входят в качестве второго слова в имя оператора.
 



Переменные документа и их использование в программе


 
name$ = GetDocumentVarName$(i)
GetDocumentVar$(имя_переменной)
SetDocumentVar name$, ""
 
Функция CountDocumentVars() возвращает число переменных документа созданных с помощью оператора SetDocumentVar или функции SetDocumentVar().
 



Прибамбасы


Ряд операторов позволяют выделять текст по признакам его оформления. Это особенно важно для больших документов, которые создавались на разных машинах и/или писались разными людьми.
SelectCurAlignment расширит выделение вперёд от точки вставки до параграфа с отличающимся типом выравнивания (по левому или правому краю, по центру или по ширине).
SelectCurSpacing расширит выделение вперёд от точки вставки до абзаца с отличающимся интерлиньяжем.
SelectCurIndent расширит выделение вперёд от точки вставки до параграфа с отличающимся левым или правым отступом.
SelectCurTabs расширит выделение вперёд от текущей точки до параграфа с отличающимися установками точек табуляции.
SelectCurColor расширит выделение вперёд от текущей точки до начала текста, выделенного другим цветом.
SelectCurFont расширит выделение вперёд от текущей точки до начала текста имеющего другой шрифт или иной размер шрифта.
Весьма полезные примеры использования перечисленных операторов выделения по оформлению приведены в Справке.
Заканчивая рассмотрение операторов и функций выделения текста, стоит упомянуть о мощном операторе SetSelRange Pos1, Pos2, выделяющем символы между позицией Pos1 и позицией Pos2. Его хорошо дополняет функция GetText$ Pos1 Pos2, возвращающая текст, заключенный между позициями, заданными ее аргументами.
Теперь, зная операторы перемещения и выделения, попробуем сделать что-нибудь полезное, напишем, например, макрос, помечающий все слова в тексте, начинающиеся с латинских букв, как английские. Это может вам сильно упростить проверку орфографических ошибок в смешанном тексте (например, в программной документации или в статье для журнала, так как текст после обработки этим макросом проверяется и по русскому, и по английскому словарю (для этого они, конечно же, должны быть установлены).
 
Sub MAIN
StartOfDocument
While AtEndOfDocument() <> -1
WordRight
SelectCurWord
a$ = Left$(Selection$(), 1)
If Asc(a$)< 123 Then Language "English (US)"
ShrinkSelection

Wend
End Sub
 
Пояснение. Оператор Language
устанавливает признак языка для выделенного участка текста.
Задание.
1. Модифицируйте эту макрокоманду, чтобы она работала только на выделенном вами участке текста.
2. Если подряд идет несколько английских слов, то попробуйте отмечать такой участок целиком, а не отдельные слова.
 
Если сохранить файл после его обработки этой макрокомандой, то он заметно “потолстеет”. Чтобы этого не произошло, после проверки орфографии можно выполнить макрос, возвращающий все к исходному состоянию:
 
Sub MAIN
EditSelectAll
Language "Русский"
While GetSelStartPos()<>GetSelEndPos()
ShrinkSelection
Wend ‘убрать выделение текста
End SUB
 
Популярная в языке WordBasic группа операторов Insert позволяет добавить текст или специальные символы начиная с позиции точки вставки. Например,
 
Insert Date$() – добавить в текст текущую дату;
InsertPara – вставить метку конца абзаца.
Insert Chr$(9) – вставить символ табуляции
Name$ = "Эдуард "                     ' присвоить значение переменной
Insert Name$                               ' и вставить его в текст
 
В WinWord нет операции по выделению слов в разрядку. Это сделает следующая макрокоманда.
 
Sub MAIN
‘ Вставляет дефис между непробельными символами.
b$ = Selection$()
c$ = ""
For i = 1 To Len(b$) - 1
c$ = c$ + Left$(b$, 1)
If (Left$(b$, 1) <> " ") And (Mid$(b$, 2, 1) <> " ") \
Then c$ = c$ + "-"
b$ = Mid$(b$, 2)
Next i
c$ = c$ + b$
EditCut  'вырезать выделенный участок
Insert c$ 'и вставить новый текст
End SUB
 
Все свои базы данных (БД) я начинал вести в редакторе Word 4.0 под DOS (на “ноутбуке” без жесткого диска трудно было придумать что-либо лучшее), затем перевел их под WinWord. Если нет необходимости формировать отчеты и делать сложные выборки, то средств этого редактора вполне достаточно для работы и поиска записей в такой БД. Так как моя БД растет со средней скоростью 1 Кбайт в день, момент, когда этот текстовый файл станет слишком большим, настанет весьма нескоро.Это не агитация за отказ от использования СУБД: просто в каждом конкретном случае следует выбирать наиболее соответствующее поставленной задаче средство. Так вот, в одной из баз дата обновления каждой записи весьма существенна. Простая макрокоманда
 
Sub MAIN
      Insert “ lch=” + Date$()
End SUB
 
позволяет при модификации записи записывать и текущую дату.
Симметричную оператору Insert операцию удаления слова, находящегося после точки вставки, делает оператор:
 
DeleteWord
 
Оператор DeleteBackWord соответственно удаляет слово, предшествующее точке вставки. Пробел, знак табуляции и знаки пунктуации считаются за целое слово. Обратите внимание, что оба эти оператора без операндов.
 

использования полей



Мне позвонил читатель “КомпьютерПресс” и рассказал о своей проблеме. Он, как наверное и многие, ведёт на компьютере турнирные таблицы различных соревнований, в частности, по футболу и баскетболу. Многие читатели возможно ведут такие турнирные таблицы по шахматам, водному поло или по волейболу. Проблема на самом деле общая: как с помощью макрокоманд облегчить себе работу с такими таблицами.
Давайте рассмотрим эту задачу для таблицы шахматного турнира, как самой простой по форме. Вообще говоря, подобная задача совсем просто решается в электронной таблице. Но ведь и обычной элементы таблицы в WinWord нумеруются точно также, как ячейки электронной таблицы, т.е. строки цифрами, а столбцы – латинскими буквами. Так номера ячеек верхней строки таблицы (слева направо) будут: А1, А2, А3, …, Аn.
Соответственно, в многочисленных встроенных функциях и макрокомандах ссылки на конкретные элементы таблицы разделяются запятыми, а двоеточием разделяются ссылки на первый и последний элементы некоторого диапазона ячеек. Например, если таблица имеет размер 4 на 4, то функция sum(c1:c4) позволит найти просуммировать содержимое ячеек третьего столбца.
Выберите в меню Вставка пункт Поле, а затем в диалоговом окне Поле строку Выражения и формулы. После этого нажмите клавишу F1, чтобы вызвать Справку. В неё посмотрите разделы Операторы, Формулы и Ссылки. Обратите внимание, что для функций ссылки на элементы таблицы выглядят немного иначе, чем для ЭТ. В отличие от Excel, эти ссылки всегда задают абсолютные адреса. Кроме того, для обновления значений в таблице нужно либо вызвать макрокоманду, либо, если формулы записаны в полях, нажать клавишу F9.
Подготовка таблицы. Можно предложить три способа подготовки таблиц такого вида.
 
1.         Конечно Вы можете один раз создав такую таблицу, элементарно просто запомнить её под каким-либо именем в таблице Автотекста (меню Редактирование), и затем вставлять таблицу в документ используя это имя.
2.         Сложнее написать макрокоманду, которая вставит в документ таблицу подобного вида и настроит её длину на число команд, участников турнира.


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

Место
Ф.И.О.
1-й
круг
2-й
круг
3-й
круг
N-й
круг
Сумма очков
1.
Петров
 
0,5
1
1
2,5
2.
Карасёв
0,5
 
0,5
1
2
3.
Ефремов
0
0,5
 
0,5
1
4.
Орлов
0
0
0,5
 
0,5

 
В столбце сумма очков вставляется(меню Вставка, пункт Поле) поле с формулой. Для этого в диалоговом окне Поле нужно выбрать верхнюю строку, озаглавленную в левой колонке (все). А затем в окне Код поля ввести sum(c2:d2).
Пронумеровать строки можно вставив поле AutoNum в первую ячейку каждой строки таблицы. Для этого, в частности, можно использовать следующую макрокоманду:
 
Sub Main
TableSelectTable
StartOfRow
LineDown 2 ‘обойти заголовок
While SelInfo(12) = - 1
StartOfLine
InsertField .Field = "autonum"
LineDown 1
Wend
End Sub
 
После каждой корректировки таблицы достаточно обновить столбец с суммой очков, отсортировать строки по этому столбцу и обновить (нажав F9) столбец с местами в турнире.
 

Проверка правописания


В Word 7.0 для
Windows 95 появились операторы поддерживающие проверку грамматики и ряд других операций. Теперь очень удобно отслеживать так называемые "глазные ошибки" при вводе текста, вот только ОРФО не слишком хорошо различает слова набранные кириллицей от слов в латинице и поэтому в двуязычных текстах красной чертой подчеркнуты правильно набранные слова из-за того что у такого слова стоит не тот признак языка, который нужен. На самом деле это не так безобидно как кажется. При переходе с Word 6.0 на 7.0 мои файлы (в каждом из них смешанный текст на двух языках) “потолстели” на 60-70 Кбайт. Причина заключалась в том, что Word хранит информацию об ошибках правописания. Кроме того, когда таких “ошибок” слишком много, Word отключает автоматическую проверку орфографии, что естественно не радует. Следующая макрокоманда выделяет весь текст документа и устанавливает для него язык “Русский”, затем она последовательно просматривает цепочки слов и помечает слова, набранные латиницей, как “English(US)”. Вы можете модифицировать эти строки, как вам нужно, в частности для одного из текстов, где встречалось много английских названий функций, я поставил “Без проверки”. В этом варианте макрокоманда недостаточно аккуратно обрабатывает достижение конца документа, так как её всегда можно прервать по клавише Esc, но в документе остаётся три закладки, которые удаляются из меню Правка*Закладка*Удалить.
Sub MAIN
' SP – закладка в начале цепочки
' EP – закладка на текущей точке просмотра
' EP1 – закладка в конце распознанной цепочки
  StartOfDocument  ' выделить документ
  EndOfDocument 1
  Language "Русский"
  StartOfDocument 0  ' поиск цепочек на латинице
  SetEndOfBookmark "\Sel", "EP1"
  While AtEndOfDocument() <> - 1
    WordRight 1, 1 ' следующее слово
    SetStartOfBookmark "\Sel", "SP"
Loop:
    k = Len(Selection$())
    SetEndOfBookmark "\Sel", "EP"
   ExtendSelection
   EditGoTo "EP"

   Cancel
nodefis:
   a$ = Right$(RTrim$(Selection$()), 1)
   If (a$ = "–") Or Asc(a$) <= 64 Then
      SetEndOfBookmark "\Sel", "EP"
      Goto nextloop
   End If
   If Asc(a$) < 123 Then
      SetEndOfBookmark "\Sel", "EP1"
      WordRight 1, 1
      Goto Loop  ' продлить цепочку
   Else    ' смена типа цепочки
      If Not(CmpBookmarks("SP", "EP1") = 2) Then
                  EditGoTo "EP"
                  Goto nextloop
      End If
      ExtendSelection
      EditGoTo "EP1"
      Cancel
      If SelType() = 2 Then
                  Language Language$(7)
            EditGoTo "EP"
      End If
   End If
nextloop:
  Wend
End Sub
 
После обработки документов этой макрокомандой они снова “похудели”, а автоматическая проверка орфографии заработала. Расставлять же вручную признаки языка по тексту в 310 Кбайт – занятие похожее на мазохизм. Так что, пишите макросы!
Ряд новых функций связан с проверкой правописания. следует отметить, что в Word 6.0 эти функции недоступны и генерируют ошибку.
Прежде всего пишущему макрокоманду, обрабатывающую грамматические ошибки потребуется функция DocumentHasMisspellings(), которая возвращает информацию о статусе автоматической проверки правописания в окне активного документа. Она возвращает следующие значения:
 

Значение
Пояснение
-1
Или автоматическая проверка правописания выключена (если документ не пуст), или проверка осуществляется в настоящее время.
0
Или документ был полностью проверен и не содержит орфографических ошибок, или документ пуст.
1
Документ был полностью проверен и содержит, по крайней, мере одну орфографическую ошибку.

 
Оператор NextMisspelling находит следующее ошибочное слово.
SpellChecked, SpellChecked()указывают, проверено ли правописание выделенного текста или нет.
ToolsSpellingRecheckDocument производит проверку правописания по всему документу.
ToolsOptionsSpelling задаёт параметры для автоматической проверки текста.
 

PutFieldData и GetFieldData$()


 
Данные можно записать в поле с помощью оператора PutFieldData и прочитать их из него с помощью функции GetFieldData$().
 
Синтаксис:
PutFieldData FieldData$
 
Когда точка вставки находится внутри поля, сохраняет содержимое переменной FieldData$ в этом поле. Данные, хранящиеся в поле являются внутренними для текстового процессора и не видны, даже когда показываются коды полей. Функция GetFieldData$() возвращает значение поля, при этом IP обязательно должен находится внутри поля.
 



Работа с БД


 
Работа с базой данных (БД) в WinWord – это работа с таблицей. При этом, каждая строка таблицы является записью БД, а каждый столбец соответствует некоторому полю записи. Названия полей записываются в первой строке таблицы. Напомню, что работе с таблицами было посвящено отдельное занятие (см. "КомпьютерПресс" №.1996 г., с. ). Здесь мы рассмотрим только операторы, которые работают с таблицей на уровне записей и связи с СУБД.
 



Работа с Буфером обмена


 
Оператор EditCopy копирует выделенный текст в Буфер обмена.
Оператор EditCut удаляет выделенный текст из документа и помещает его в Буфер обмена. Если выделения нет, возникает ошибка.
Оператор EditPaste вставляет содержимое Буфера обмена в точку вставки. Вот интересный пример использования этих двух операторов: часто требуется в слове поменять местами две буквы.
Классический случай, когда вместо слова "мясо", набрано "мсяо". Вот макрос, который исправляет такие ошибки:
 
Sub MAIN               ' IP перед буквой "c"
CharLeft 1, 1     ' выделили ее
EditCut             ' "c" в Буфер обмена
CharRight 1,0    ' убрали выделение, IP за буквой "я"
EditPaste                     ' достали "c" из Буфера
End Sub
 
Конечно, можно задать исправление часто встречающихся ошибок такого рода в пункте Автокоррекция меню Сервис, однако у вас нет гарантии, что WinWord правильно “поймет”, когда нужно применить ту или иную замену. Кроме того, так как проверка осуществляется при вводе текста, большое количество правил в списке Автокоррекции
существенно замедляет работу программы. (кстати, я с удивлением обнаружил в списке Автокоррекции Word for Windows 95 более сотни элементов замены).
 
Очень полезные операторы
 
EditClear [число_символов]
Он убирает выделенный текст и/или заданное число символов. Если число_символов >0, то удаляются символы справа от точки вставки (IP), если <0, то слева от IP. Если имеется выделенный текст, то удаляется он плюс заданное аргументом число символов. Вернуться к первоначальному состоянию можно с помощью оператора EditUndo. Действие EditUndo, как показано ниже, отменяет оператор EditRedo.
Sub MAIN
If SelInfo(27) = - 1 Then FileNewDefault
Insert "Пример работы команд EditUndo и EditRedo"
MsgBox "Выберите OK для отмены вставки."
EditUndo
MsgBox "Выберите OK для восстановления текста."
EditRedo
End Sub
 

Оператор RepeatFind повторяет повторить поиск, заданный последней операцией EditGoTo или EditFind.
Оператор EditRepeat позволяет повторить, если это возможно, последнюю операцию редактирования.
Синтаксис:
 
EditRepeat
 
Примеры.
 
Эта макрокоманда повторит операцию вставки табуляции в начало строк существующего документа 5 раз.
 
Sub MAIN
StartOfLine
Insert Chr$(09)  'вставить табуляцию в начало строки
For LCount = 1 To 5
LineDown
EditRepeat
Next LCount
End Sub
 
Более аккуратный пример, с созданием нового файла и вставкой строки текста.
 
Sub MAIN
NewLine = Chr$(13) + Chr$(10)
If SelInfo(27) = - 1 Then FileNewDefault
Insert "Повторить ещё 8 раз!" + NewLine
For Count = 1 To 8
EditRepeat
Next Count
End Sub
 
Вот чисто учебный пример использования изученных операторов редактирования. Его следует выделить, скопировать в Буфер обмена, затем в окно редактирования макрокоманд и выполнить по шагам (с помощью кнопки пошагового выполнения макроса).
 
Sub MAIN
Insert "This is Line one" : InsertPara
Insert "This is Line two" : InsertPara
MsgBox "Click OK to select everything"
EditSelectAll
MsgBox "Click OK to copy the selected text to the clipboard"
EditCopy
MsgBox "Click OK to paste the copied text at the end."
EndOfDocument
EditPaste
MsgBox "Click OK to select everything and cut it from the document."
EditSelectAll : EditCut
MsgBox "Click OK to paste it back in"
EditPaste
MsgBox "Click OK to clear part of the first line."
StartOfDocument : EditClear 10
End Sub
 
ToggleFull – делает окно документа размером во весь экран и переключает его обратно. Следующая макрокоманда демонстрирует работу оператора ToggleFull, а заодно и использование операторов NextWindow и PrevWindow, позволяющих в данном случае перейти из окна макрокоманды в окно редактируемого документа и вернуться после ее выполнения обратно.


 
Sub MAIN
If SelInfo(27) = - 1 Then NextWindow
MsgBox "ОК, чтобы перейти к полному экрану."
ToggleFull
MsgBox "OK, чтобы вернуться обратно."
ToggleFull
PrevWindow
End Sub
 
Для возвращения с уровня просмотра заголовков и сносок на уровень просмотра текста служит оператор ToggleMainTextLayer. Обычно применяется в следующих сочетаниях:
 
ViewHeader
....                                     ' действия с колонтитулом
ToggleMainTextLayer          ' к основному тексту
 
TogglePortrait – переключает выделенную секцию между ориентацией landscape (Альбомная) и portrait (Книжная). Чтобы увидеть эффект применения этого оператора воспользуйтесь следующей заготовкой:
 
ViewPage
ViewZoom .FullPage
TogglePortrait
.... ' задержка на 5-10 секунд
TogglePortrait
 
 
ToggleFieldDisplay
ViewFieldCodes 0
 
Для операций групповой замены в тексте очень полезна группа операторов поиска:
 
EditFind [[.Find =] СтрокаПоиска$][, .Direction = 0]][, .WholeWord = 0]
[, .MatchCase = 0][, .PatternMatch = 0][, .SoundsLike = 0][, .Format = 1][, .Wrap = 0]
Оператор EditFind находит вхождение заданного текста, форматирования или того и другого. Если вы хотите осуществить поиск внутри небольшой секции документа, установите закладки и используйте оператор EditFind внутри цикла While CmpBookmarks(). В приведённой ниже макрокоманде внутри текущего абзаца ищется точка с запятой
(;).
 
Sub MAIN
 EditBookmark .Name = "startx", .Add
 EditGoTo "\para"
 EditBookmark .Name = "selectionx", .Add
 EditFind .Find = ";"
 While CmpBookmarks("\Sel", "selectionx") = 8 Or \
  CmpBookmarks("\Sel", "selectionx") = 6 And EditFindFound()
  count = count + 1
  RepeatFind
 Wend
 MsgBox Str$(count) + " semicolons were found"
 EditGoTo "startx"
 EditBookmark .Name = "selectionx", .Delete
 EditBookmark .Name = "startx", .Delete


End Sub
 
EditFindFound() – возвращает результат выполнения предыдущей операции EditFind т. е. возвращает –1, если результат последнего поиска был успешным и 0, если нет. Если СтрокаПоиска$ не задана, то используется строка поиска из последнего выполнявшегося оператора EditFind или EditReplace. В СтрокеПоиска$ можно задавать шаблон для поиска. Символы, которые используются в шаблоне, приведены в таблице.
 

СтрокаПоиска$
Что вы с её помощью найдёте
?
Любой символ. Например EditFind "T?P" позволит найти ТОР, ТУР, ТИР и множество других слов
^?
Так как знак вопроса используется в шаблоне, чтобы найти сам этот знак, нужно перед ним поставить ^
^w
Белое пространство: пробелы, табуляция, неразрывные пробелы
^p
Конец абзаца
^t
Табуляция. Chr$(9)

 
EditFindChar
 
Чтобы предыдущие команды группы Edit не повлияли на выполнение текущей команды редактирования, используется оператор EditFindClearFormatting, отменяющий все ранее сделанные установки параметров.
EditReplaceClearFormatting
 
Часто в больших документах, особенно в книгах, брошюрах и т.д., используется не один, а несколько шрифтов, например, чтобы выделить примечания, эпиграфы, фрагменты программ. Допустим, что на машине, где вы хотите распечатать свой документ, нужного шрифта нет. Следующая полезная макрокоманда позволит вам поменять все символы, отформатированные одним шрифтом на другой. Заменим Courier New Cyr на Times New Roman Cyr. Так как после работы данного макроса вернуться в исходное состояние можно только снова поменяв в нём местами названия шрифтов, если нужно, сохраните документ под другим именем. Этот базовый фрагмент можно легко модифицировать под вашу конкретную задачу.
 
Sub Main
StartOfDocument
EditFindFont .Font = " Courier New Cyr"
EditReplaceFont .Font = " Times New Roman Cyr"
EditReplace .Find = "", .Replace = "", .Format = 1, \ .ReplaceAll, .Wrap = 1
End Sub
Как почти всегда в WinWord проблема может быть решена многими путями, например простым переназначением шрифтов из меню.
 
EditReplaceFont .Italic = 1
 
EditFindStyle .Style = "Heading 6"
EditReplaceStyle .Style = "Heading 3"
 

Работа с документами



ViewMasterDocument
CreateSubdocument
 
Следующая группа операторов и функций обеспечивает изменение состояние окон.
FileExit [код] – выйти из WinWord.
Код:
0 (или опущен) – перед сохранением документов запросить пользователя;
1 – сохранить документы перед выходом;
2 – выход без сохранения документов.
DocClose [код] – закрыть активное окно. Значение параметра код, как и у оператора FileExit, только по отношению к документу в закрываемом окне.
 
Оператор DocWindowPosTop и функция DocWindowPosTop().
 
Синтаксис:
 
DocWindowPosTop позиция
DocWindowPosTop()
 
Оператор DocWindowPosTop позиционирует окно активного документа или его значок (пиктограмму) так, что она расположится на позицию точек от верхнего края рабочей области. Если окно с активным документом максимизировано, Word не сможет выполнить это действие и сгенерирует сообщение об ошибке. Функция DocWindowPosTop() возвращает вертикальную позицию в точках.
Пример: Эта макрокоманда возвращает горизонтальную и вертикальную позицию активного документа:
Sub MAIN
horizpos = DocWindowPosLeft()
vertpos = DocWindowPosTop()
MsgBox "Точек слева:" + Str$(horizpos) + Chr$(13) + \
 "Точек сверху:" + Str$(vertpos), "Позиция документа"
End Sub
 



Работа с языком документа


Две функции и два оператора позволяют задавать или изменять язык редактируемого документа. Отмечу, что важность применения программ проверки орфографии и грамматики возрастает, кроме того документы часто бывают двух- либо многоязычными.
Функция CountLanguages() возвращает число поддерживаемых в данной версии WinWord языков. Это легко увидеть вставив в макрокоманду строку:
Print CountLanguages()

Оператор Language имеет три различных формы использования. Первая форма:
Language язык$

позволяет указать конкретный язык для выделенного фрагмента текста. Этим будут пользоваться программы проверки орфографии и грамматики. Например, оператор
Language "Русский"

пометит выделенный участок документа, как текст на русском языке. Это на самом деле эквивалентно выбору в меню Сервис
пункта Язык и Русский в списке поддерживаемых языков. Просто вручную делать это более одного раза утомительно. Хотя в локализованной версии WinWord названия языков в диалоговом окне даны по-русски, в операторе их следует задавать в оригинальном написании.
Каждый язык в этом списке имеет свой порядковый номер, поэтому вторая форма этого оператора (Language индекс) использует в качестве операнда не название языка, а его номер в списке и функцию, для получения названия языка по его номеру. Так приведённому выше оператору соответствует:
Language Language$(23).
Третья форма – разновидность второй – отменяет лингвистическую проверку текста. Она эквивалентна выбору самой первой строки, (без проверки), в списке языков.
Language
"0"
И наконец, рассмотрим функцию Language$(индекс). Если индекс равен 0 или опущен, то Language$() вернёт признак языка первого символа выделенного участка или символа слева от точки вставки (если нет выделения текста). Если индекс не равен нулю (он может меняться от 1 до CountLanguages), то возвращается название языка из списка поддерживаемых национальных языков. Следующая макрокоманда выведет в активный документ этот список. Его элементы (номер и название) можно будет использовать в операторе Language.

Sub MAIN
For i = 1 To CountLanguages()
      Insert Str$(i) + Chr$(9) + Language$(i)
InsertPara
Next
End Sub
 1   0
 2   Dansk
 3   Deutsch
 4   Deutsch (Schweiz)
 5   English (AUS)
 6   English (UK)
 7   English (US)
 8   Espaсol
 9   Franзais
 10 Canadien Franзais
 11 Italiano
 12 Nederlands
 13 Nederlands (voorkeur)
 14 Norsk Bokmеl
 15 Norsk Nynorsk
 16 Portuguкs (BR)
 17 Portuguкs (POR)
 18 Suomi
 19 Svenska
 20 Catalа
 21 ЕллзнйкЬ
 22 Tьrkзe
 23 Русский
 24 Иeљtina
 25 Magyar
 26 Polski
 27 Slovenian
 28 Словацкий
 29 Euskera
 30 Bahasa Malaysia
Последний оператор из этой группы ToolsLanguage позволяет установить выбранный язык в качестве языка, используемого по умолчанию, т. е. записать его в шаблон normal.sty:
ToolsLanguage .Language = "Русский", .Default
Если необязательный операнд .Default отсутствует, то в остальном этот оператор похож на оператор Language.

CopyFormat
FontSubstitution
FormatAddrFonts
FormatChangeCase
FormatDefineStyleFont
FormatDefineStyleLang
FormatFont
FormatRetAddrFonts
PasteFormat
ResetChar, ResetChar()
ShrinkFont
 
Оператор NormalFontSpacing
 
Восстанавливает кернинг выделенных символов к Normal, если их текущий кернинг был расширен или сжат.
 
Оператор NormalFontPosition
 
Восстанавливает выбранные символы к базовой линии, если они были подняты или понижены.
 

Работа с каталогами


 
WordBasic поддерживает все стандартные операции навигации по дереву каталогов диска и работы с файлами.
Ниже перечислены основные операции.
Смена каталога по умолчанию:
ChDir path$
делает текущими диск и каталог, заданные аргументом path$.
MkDir name$
создает каталог с именем, заданным аргументом name$.
RmDir name$
удаляет заданный каталог. Удалить текущий каталог нельзя.
 
Kill имя_файла$
удаляет заданный файл. Чтобы избежать непредвиденного результата, рекомендуется задавать полное имя файла. Обычная последовательность удаления файла:
имя_документа$=FileName$(0)
DocClose 2
Kill имя_документа$
 
Name прежнее_имя$
As новое_имя$
переименовывает файл.
FileOpen [.Name=имя]
загружает документ для редактирования.
FileClose [режим]
закрывает редактируемый документ.
CountDirectories()
возвращает число подкаталогов в текущем каталоге.
GetDirectory$()
возвращает имя подкаталога по его заданному порядковому номеру.
 
Типичная задача создать массив имён подкаталогов текущего каталога.
 
DirNum = CountDirectories()
Dim sdir$(DirNum)
sdir$(0) = "[..]"
For i = 1 To DirNum
      sdir$(i) = LCase$(GetDirectory$(i))
Next
 
Но самая нужная в практической работе функция называется Files$. Она, по существу, выполняет четыре функции:
1. возвращает имя текущего каталога, если в качестве аргумента задана точка:
      curcat$=Files$(".");
 
2. определяет, существует ли указанный вами файл. Например:
if Files$("m20941.msg") <> "" then FileNotExist=-1;
 
3. позволяет задавать обобщенное имя файла (т. е. использовать в имени файла символы "?" и "*") и возвращает имя файла, которое удовлетворяет заданному шаблону поиска;
4. и наконец, позволяет организовать цикл, чтобы найти все имена файлов, удовлетворяющих данному шаблону.
 
Вот задача, где без функции Files() трудно обойтись. По электронной почте MCI к нам в виде текстовых файлов приходило много писем со статьями.
К сожалению каждому из них предшествовал заголовок длинной 1,5 Кбайт, где отмечался весь неблизкий путь этого письма из Бостона. Следующая макрокоманда уберет заголовки у всех "писем".
Для этого сначала сделает каталог с письмами текущим:
 
pth$= "C:\ED\MCI"
If Files$(".") <> pth$ Then ChDir pth$"
Следующий оператор возвращает имя первого файла в текущем каталоге, имеющего расширение .msg:
a$ = Files$("*.msg")
чтобы найти следующее имя, функция Files$() задаётся без аргумента.
если файл существует, то откроем его для последующих операций с его содержимым, если не существует, выведем сообщение и завершим работу.
If Files$(a$) <> "" Then FileOpen a$
Else
      MsgBox "Файл в текущем каталоге не найден."
End If
 
Пример.
 
Занести в массив имена всех файлов в каталоге. Для этого сначала найдем их число.
 
tmp$ = Files$("*.*")
count = - 1
While temp$ <> ""
      count = count + 1
      tmp$ = Files$()
Wend
If count > -1 Then
      Dim list$(count)
      list$(0) = Files$("*.*")
      For i = 1 To count
                  list$(i) = Files$()
      Next i
Else
      MsgBox "Текущий каталог пуст."
End If
 
Пример.
Загрузить два файла и расположить их на экране рядом друг с другом в вертикальных окнах.
 
Sub MAIN
a$ = "C:\EDWARD\MYBASE"
If Files$(".") <> a$ Then ChDir(a$)
FileOpen .Name = am_a_z.doc
FileOpen .Name = firms1.doc
If DocMaximize() Or DocMinimize() Then DocRestore
If CountWindows() = 2 Then
      DocMove 0, 0
      DocWindowWidth 240
      NextWindow
      If DocMinimize() Then DocRestore
      DocMove 240, 0
      DocWindowWidth 240
End If
End Sub
 
Несколько в стороне находится функция DefaultDir$() и оператор ChDefaultDir. Они позволяют из макрокоманды переопределить или проверить установку каталогов по умолчанию.
 
Например:


 
If DefaultDir$(6) = "" Then
ChDefaultDir "C:\TOOLS", 6
End If
 
Оператор Connect служит для установления соединения с сетевым диском. Формат:
Connect [.Drive = номер,] .Path = текст1 [, .Password = пароль
где:
.Drive – номер соответствует букве, которую вы хотите присвоить сетевому диску. При этом 0 (по умолчанию) соответствует первой доступной букве для имени дисковода, 1 – следующей и т. д.;
.Path – путь для каталога сетевого диска, например "\\AVTOR\IVANOV";
.Password пароль, если сетевой диск защищён паролём.
 
Оператор SetAttr устанавливает атрибуты файла для файла, имя которого задано аргументом. Устанавливаемые им атрибуты не удаляют атрибуты, установленные этому файлу ранее.
Синтаксис:
 
SetAttr ИмяФайла$, атрибут
Где аргумент атрибут принимает одно из следующих значений (или их произвольную сумму):
0 – снять все атрибуты
1 – только для чтения
2 – скрытый
4 – системный
32 – архивный
 
Пример.
 
Sub MAIN
 SetAttr "C:\WPRESSA.DOC", 0  'снять все атрибуты
 SetAttr "C:\WPRESSA.DOC", 33 'добавить атрибуты "только для чтения" и "архивный
(32+1)"
End Sub
 
Для того, чтобы определить какие атрибуты у файла, используется функция GetAttr(имя_файла). Например,
 
attr = GetAttr
"C:\WPRESSA.DOC"
if attr mod 2 =1 then MsgBox "Только для чтения"
 
Оператор Name позволяет переименовать файл.
Его формат: Name СтароеИмя$ As НовоеИмя$.

Работа с окнами


 
При открытии каждого документа и при редактировании макрокоманды WinWord создает новое окно, в котором и происходит работа с ними. Однако в каждый момент времени только одно из этих окон активно. В меню Окно (Windows) имеется список открытых окон, причем активное окно помечено галочкой. Группа операторов и функций языка WordBasic позволяет узнать номер активного окна, его заголовок, сделать активным другое окно и многое другое. Посмотрим, как это делается.
Число открытых окон возвращает функция CountWindows().
Функция Window() возвращает номер активного окна в списке окон меню Окно. При этом 1 – соответствует первой позиции в списке, 2 – второй и т. д. Если открытых окон нет, то Window() возвращает 0 (ноль). Обратите внимание, что WinWord выводит список заголовков окон в алфавитном порядке, при этом изменение текущего каталога может изменить порядок следования заголовков в этом списке, так как для текущего каталога выводится только имя файла, а для файлов в других каталогах в заголовке окна указывается еще и полный путь.
Получить заголовок открытого окна можно с помощью функции WindowName$(номер), где номер – номер заголовка в списке. Если номер опущен или равен 0,
возвращается заголовок активного окна.
WindowList номер – делает активным окно с заданным номером. Если номер больше числа открытых окон в списке, то диагностируется ошибка. Этот оператор кроме всего весьма полезен при отладке макрокоманд.
Два оператора NextWindow и PrevWindow позволяют циклически перемещаться по списку окон в обоих направлениях. NextWindow – активирует окно, находящееся в списке непосредственно после активного окна. Если имя активного окна стоит в списке последним, то активизируется окно, стоящее в списке первым. Если активное окно единственное в списке, ничего не происходит. Оператор PrevWindow работает точно так же, но в обратном направлении.
 
Пример.
 
Оператор PrevWindow часто используется для переключения между окном редактирования макрокоманд и окном документа.
Оба этих окна должны быть предварительно открыты.
 
Sub MAIN
If DocMaximize() = 0 Then DocMaximize
MsgBox "Нажмите OK, чтобы перейти к предыдущему окну"
PrevWindow
MsgBox "Теперь нажмите OK, чтобы вернуться."
PrevWindow
End Sub
 
Чтобы отличить окно, в котором происходит редактирование, от окон документов,
используется функция IsMacro([номер]). Она возвращает -1, если это так, и 0, если нет.
Оператор WordNewWindow – открывает новое окно, содержащее документ, находящийся в активном окне. К заголовкам обоих окон WinWord добавляет двоеточие номер (соответствует выбору пункта Новое окно в меню Окно).
Оператор WindowArrangeAll упорядочивает расположение окон на экране таким образом, чтобы они не перекрывались (соответствует выбору пункта Упорядочить все в меню Окно).
Пример: Активизация первого окна, содержащего документ TEST.DOC:
 
numwin = CountWindows()
If numwin <> 0 Then
      i = 1
      While i <= numwin And leave <> 1
                  winname$ = WindowName$(i)
                  If InStr(winname$, "TEST.DOC") Then leave = 1
                  If leave <> 1 Then i = i + 1
      Wend
End If
If InStr(winname$, "TEST.DOC") Then
      WindowList i
Else
      MsgBox "В списке нет окна, содержащего TEST.DOC."
End If
 

Работа с полями средствами WordBasic


 
CountMergeFields(). Эта функция определяет, сколько соединяемых полей определено в файле данных.
 
Оператор DoFieldClick
 
Перемещает IP в точку, местоположение которой задано выбранным полем macrobutton. См. таблицу.
 
DropDownFormField
EnableFormField
FormFieldOptions
GetMergeField$()
MergeFieldName$()
ToolsManageFields
 
TextFormField – вставляет текст из в точку вставки, соответствует кнопке Text Form Field на панели Forms.
 



Работа с полями (Занятие №7)


 
Поля для меня всегда были одним из самых загадочных объектов в WinWord. Что такое поле? Это заключённое в фигурные скобки ключевое слово, возможно с набором аргументов, которое говорит редактору какую информацию нужно вставить в документ. Например, если в тексте документа будет стоять {data}, то Word при его выводе подставит в это поле текущую дату. В табл. 1 приведены основные типы полей (не указаны поля, появившиеся в версии
7.0). Из таблицы видно, что многим своим достоинствам Word обязан полям. (Обратите внимание, что язык HTML устроен очень похожим способом. Совокупность полей WinWord также можно рассматривать как некоторый вспомогательный язык разметки документа.) Естественно нас интересует, как работать с Word полями средствами WordBasic. Поле может быть вставлено в документ из пункта Поле
меню Вставка.
 
Таблица 1. Основные поля WinWord.
 

Поле
Назначение


= выражение
Вычисляет заданное арифметическое выражение и вставляет результат в поле
ASK
Запрос ввода текста пользователем
AUTHOR
Вставляет или заменяет имя автора документа
AUTONUM
Автонумерация абзацев, элементов таблиц или уровня структуры арабскими цифрами
AUTONUMLGL
Автонумерация заголовков в юридическом формате
AUTONUMOUT
Буквенная нумерация заголовков
AUTOTEXT
Выводит в качестве значения текущее значение элемента автотекста
COMMENTS
Вставляет новое значение в поле Заметки в диалоговом окне Свойства
CREATEDATE
Выводит дату создания документа
DATABASE
Позволяет вставлять данные из внешних БД
DATE
Вставляет текущую дату и время
EDITTIME
Выводит в качестве значения суммарное время редактирования документа в минутах
EMBED
Внедряет объект в документ Word
FILENAME
Выводит имя файла документа
FILLIN
Выводит диалоговое окно для ввода произвольных данных
GOTOBUTTON
Создаёт в документе команду перехода. Двойной щелчок по этому полю вызывает переход к тому месту в документе, которое определяется параметром Назначение
IF
В зависимости от вычисления условия вставляет в документ один из двух операндов
INCLUDEPICTURE
Вставляет в документ указанный рисунок
INCLUDETEXT
Вставляет в документ рисунок или текст
INDEX
Создаёт индекс, используя поля XE
INFO
Позволяет вставлять и изменять общую информацию о документе
KEYWORDS
Включает в текст ключевые слова документа
LASTSAVEBY
Имя человека, последним выполнившего сохранение файла. Полезно при работе в сети над одним документом
LINK
Устанавливает с помощью OLE связь с другим приложением
MACROBUTTON
Помещает в документ текст или графику, при двойном щелчке на которых вызывается заданная макрокоманда
MERGEFIELD,
MERGEREC и MERGESEQ
Эти поля используются для организации печати документов после слияния их текстов
NEXT
Используется вместе с полем if
NEXTIF
Используется вместе с полями next и if
NUMCHARS
Число символов в документе
NUMPAGES
Число страниц в документе
NUMWORDS
Число слов в документе
PAGE
Вставляет номер страницы, на которой расположено это поле
PAGEREF
Вставляет для перекрёстных ссылок номер страницы, где находится указанная закладка
PRINT
это поле позволяет вставить в документ управляющие коды принтера, команды на языке PCL или PostScript
PRINTDATE
Дата последней печати документа
QUOTE
Вставляет в документ указанный текст
REF
Вставляет текст, помеченный указанной закладкой
RD
используется для создания оглавления документа
REVNUM
Число редакций документа
SAVEDATE
Дата и время последнего сохранения
SECTION
Номер текущего раздела документа
SEQ
Создаёт автоматически увеличивающуюся последовательность чисел, которую можно использовать для нумерации рисунков, таблиц и т.д.
SET
присваивает значение закладке. Замечательно тем, что через это поле макрокоманды могут передавать друг другу значения переменных
SKIPIF
используется для условных пропусков записей при печати документа
STYLEREF
Вставляет текст, ближайшего абзаца, отформатированный указанным стилем
SUBJECT
Вставляет тему документа из диалогового окна Свойства
SYMBOL
Вставляет один символ с заданным шрифтом и кодом
TC
Помечает текст для включения его в документ
TEMPLATE
Вставляет имя шаблона документа
TIME
Вставляет текущее время на момент обновления поля
TITLE
Вставляет или меняет название документа
TOC
Определяет элемент оглавления
useraddress
Вставляет почтовый адрес, взятый из диалогового окна “Информация о пользователе”
userinitials
Вставляет в документ инициалы, взятые из диалогового окна “Информация о пользователе”
username
Вставляет в документ имя, взятое из диалогового окна “Информация о пользователе”
XE
Определяет элемент индекса

 



Работа с приложениями



AppActivate
AppClose
AppCount()
AppGetNames, AppGetNames()
AppHide
AppInfo$()
AppIsRunning()
AppMaximize, AppMaximize()
AppMinimize, AppMinimize()
AppMove
AppRestore, AppRestore()
AppSendMessage
AppShow
AppSize
AppWindowHeight, AppWindowHeight()
AppWindowPosLeft, AppWindowPosLeft()
AppWindowPosTop, AppWindowPosTop()
AppWindowWidth, AppWindowWidth()
ControlRun
DDEExecute
DDEInitiate()
DDEPoke
DDERequest$()
DDETerminate
DDETerminateAll
DialogEditor
ExitWindows
FileExit
GetSystemInfo, GetSystemInfo$()
MicrosoftAccess
MicrosoftExcel
MicrosoftFoxPro
MicrosoftMail
MicrosoftPowerPoint
MicrosoftProject
MicrosoftPublisher
MicrosoftSchedule
MicrosoftSystemInfo
RunPrintManager
SendKeys
Shell
 



Работа с таблицами


 
Таблицы – один из важнейших элементов создаваемого документа. Что позволяет WordBasic делать с таблицами? Практически все, но с одной оговоркой: в нем отсутствует прямая адресация ячеек таблицы и навигация по ней занятие не для слабонервных. Отчасти это связано с тем, что строки таблицы в WinWord могут иметь разное число столбцов.
План занятия: Сначала мы познакомимся с операторами и функциями для перемещения по таблице, научимся выделять и читать содержимое ячейки и записывать в нее данные, а по пути напишем несколько полезных макрокоманд.
 



Работа с таблицами (Занятие №4)



Средства навигации по таблице
Начнем с команд навигации по таблице. Итак, напомню:
StartOfRow – перемещение IP или выделения (если используется одноименная функция) в начало строки таблицы;
EndOfRow – в конец строки таблицы;
StartOfColumn – в начало столбца;
EndOfColumn – в конец столбца.
NextCell – переход и выделение содержимого следующей ячейки таблицы (аналогично нажатию клавиши TAB). Если уже выделено более одной ячейки, NextCell переходит к первой из них. Если точка вставки находится в последней ячейке таблицы, то NextCell добавляет в таблицу новую строку.
Оператор (и функция) PrevCell – аналогичен NextCell, только выбор ячейки производится в обратном направлении.
 



Работа со структурой документа


Операторы этой группы работают только когда WinWord находится с режиме “Структура документа” и по существу повторяют все возможности, предоставляемые соответствующей панелью инструментов.
 
CreateSubdocument
DemoteToBodyText
InsertSubdocument
MergeSubdocument
OpenSubdocument
OutlineCollapse
OutlineDemote
OutlineExpand
OutlineLevel()
 



Рамки


Левая рамка
Оператор BorderLeft удаляет или устанавливает левые рамки выбранных абзацев, ячеек таблиц или графики. Функция BorderLeft() возвращает 1 или 0, в зависимости от того, как отформатированы ли выбранные абзацы, ячейки таблицы и графика с левой рамкой или нет.
Синтаксис:
BorderLeft [On]
BorderLeft()
Аналогично устроены следующие операторы и функции:

Снять рамку
BorderNone, BorderNone()
Рамка справа
BorderRight, BorderRight()
Рамка сверху
BorderTop, BorderTop()
Рамка внизу
BorderBottom, BorderBottom()
Рамка внутри
End IfBorderInside, BorderInside()
Рамка вне
BorderOutside, BorderOutside()


Пример.
В этом примере для нижней рамки используется один из двух стилей, в зависимости от того, находится ли выделение внутри таблицы. Если выделенный фрагмент вне таблицы, то применяется двойная линия, иначе тонкая линия.
If SelInfo(12) = - 1 Then
      BorderLineStyle 8
      BorderBottom 1
Else
      BorderLineStyle 4
      BorderBottom 1
 
FormatBordersAndShading
FormatDefineStyleBorders
FormatDefineStyleFrame
FormatFrame
InsertFrame
RemoveFrames
 
Оператор ShadingPattern влияет на формат затенения выделенного абзаца, ячеек таблицы или фрейма.
Синтаксис: ShadingPattern тип
тип – число от 0 до 25. Рисунки различных вариантов затенения можно найти в меню Рамки или в Справке. Функция ShadingPattern() возвращает 0, если нет выделенного блока, -1, если не во всём блоке используется одно и тоже затенения, и номер типа затенения, если оно было сделано.
 



Рисование в WordBasic (Занятие №6)



Большой раздел языка посвящен рисованию. Конечно можно вставлять в документ рисунки из других пакетов, но простые вещи удобнее делать в самом редакторе. Кроме того, многим людям гораздо проще построить рисунок с помощью программы, чем нарисовать его. Опять же, можно сделать библиотеку повторяющиеся фрагментов рисунков, диаграмм и т.д. Важное преимущество построенного программно рисунка – его параметризация. Меняя параметры, можно легко модифицировать рисунок, вместо его полной перерисовки. Нужно отметить, что рисование не самая сильная черта WordBasic, однако можно получить очень интересные фигуры, комбинируя работу макрокоманды и использование панели Рисование.
Операторы этого раздела реализуют все возможности, представленные на панели Рисование. Напомню о некоторых особенностях рисования в Word.
1. Рисунок делается на странице документа в режиме просмотра “Разметка страницы” (Outline). При переходе в режим “Обычный” (Normal) в Word 7.0, к сожалению, перестаёт быть виден, а флажок опции Drawings я к своему удивлению там(Tools * Options * View * Show) не обнаружил.
2. Нарисованные объекты можно свободно перемещать мышкой по всему документу.
3. У каждого документа есть три слоя: слой текста, слой под текстом и слой над текстом. По умолчанию при создании рисунка он помещается в слой над текстом. Существуют разные способы перемещения объектов из одного слоя в другой.
 
Общий совет. Перед тем как писать макрокоманды, рисующие что-либо, опробуйте все возможности рисования с помощью панели инструментов. Тогда вам будет намного понятнее как реализовать эти действия программно.
 



Чем лучше вы знаете Word,



Чем лучше вы знаете Word, тем легче вам будет освоить WordBasic. Большинство команд WordBasic эквивалентны командам или действиям в Word (особенно в английской версии), а большинство макрокоманд выполняют последовательность действий Word. Можно сказать, что работа с WordBasic слегка похожа на работу в Word, только без пользовательского интерфейса; вместо команд и диалоговых окон вы используете команды языка WordBasic. Операторы и функции, которые будут использоваться вами для написания макрокоманд, гораздо легче понять, если вы знакомы с теми возможностями Word, которые они представляют. Кроме того, хорошее знание Word поможет вам найти наилучший способ выполнения той или иной задачи при написании макрокоманды, чтобы не писать длинную макрокоманду там, где можно обойтись одной командой Word.
Изучайте только то, что вам нужно для решения текущей задачи. Из-за большого количества операторов WordBasic необозрим, особенно если у вас небольшой опыт программирования на чем-либо. Способ, которому интуитивно следовая я при первом знакомстве с языком, заключался в изучении и использовании только части средств языка, необходимой для программирования конкретной задачи. С накопление опыта границы рассматриваемой области можно расширить.

Специфика WordBasic (Занятие 3)


 
С точки зрения программиста, язык WordBasic можно рассматривать как средство работы с тем местом в редактируемом документе, где в момент вызова макрокоманды находился курсор. Это место называется точкой вставки (далее IP – insertion point).
Точку вставки можно перемещать множеством способов. Вот перечень операторов перемещения IP:
 
CharRight – на символ вправо
CharLeft – на символ влево
 
WordRight — на слово вправо
WordLeft – на слово влево
 
SentRight – на предложение вправо
SentLeft – на предложение влево
 
LineUp — на строку вверх
LineDown — на строку вниз
StartOfLine – на начало строки
EndOfLine — в конец строки
 
PageUp — на страницу вверх
PageDown — на страницу вниз
 
StartOfRow – в начало строки таблицы
EndOfRow – в конец строки таблицы
StartOfColumn – в начало столбца
EndOfColumn – в конец столбца
 
StartOfWindow – в начало окна
EndOfWindow – в конец окна
 
StartOfDocument – в начало документа
EndOfDocument – в конец документа
 
Каждый из перечисленных операторов (кроме четырех последних) может быть записан в виде функции с двумя операндами. Например:
 
CharRight(Счетчик, [Признак_выделения])
 
Квадратные скобки указывают на то, что заключенный в них операнд, может быть опущен. Если Признак_выделения
опущен, считается, что IP перемещается вправо на заданное счетчиком число символов. (В других функциях перемещения IP Счетчик
задает соответственно слова, параграфы, страницы и т. д.) Эти функции возвращают 0, если перемещение IP выполнено успешно, и -1, если его выполнить невозможно (например, IP находится в самом конце документа.)
Для проверки условия достижения IP границ документа используются функции AtEndOfDocument() и AtStartOfDocument(). Эти функции возвращают -1, если IP находится, соответственно, в конце или начале документа, и 0, если нет.
Напишем макрокоманду, подсчитывающую число предложений в тексте.
 
Sub MAIN
StartOfDocument
pcount = 0 ‘ счетчик числа предложений

While Not AtEndOfDocument()
SentRight 1, 1 ‘выделить одно предложение
a$ = LTrim$(Selection$()) ‘без пробелов слева
If Len(a$) < 3 Then Goto Skip
‘ не считать пустую строку предложением
If Right$(Selection$(), 1) <> Chr$(13) \
Then pcount = pcount + 1
Skip: ‘снять выделение, IP вправо.
ShrinkSelection
ShrinkSelection
SentRight
Wend
MsgBox "В тексте " + Str$(pcount) + " предложений"
End SUB
 
В Справке
по WordBasic в примере к оператору SentRight дана значительно более короткая, чем у меня макрокоманда. Но она, к сожалению, считает за отдельное предложение и инициалы перед фамилией, и символы перед элементами перечисления. Поэтому в приведенной выше макрокоманде введено ограничение: предложение не может быть короче двух символов, включая точку. Оператор ShrinkSelection описан чуть ниже, здесь же он убирает выделение с текущего предложения.
Перемещение IP к следующему или предыдущему редактируемому элементу возможно также с помощью специализированных операторов Goto соответственно: GotoNext_элемент
и GotoPrevious_элемент. Так, группа GotoNext состоит из следующих операторов:
 
GotoNextPage – переход к следующей странице
GotoNextFootnote – переход к ссылке
GotoNextEndnote – переход к следующей концевой ссылке
GotoNextSection – переход к следующему разделу
GotoNextSubdocument – переход к следующему поддокументу
GotoNextAnnotation – переход к следующей аннотации
Следующая макрокоманда позволяет перейти к различным частям активного документа. Если элемент, выбранный для перехода не существует, точка вставки не будет перемещена.
 
Sub MAIN
Begin Dialog UserDialog 225, 146, "Goto"
OKButton 36, 118, 88, 21
CancelButton 129, 119, 88, 21
OptionGroup .HelpChoice
OptionButton 12, 6, 180, 16, "Следующая аннотация", .OptionButton1
OptionButton 12, 23, 180, 16, "Следующая концевая ссылка", .OptionButton2
OptionButton 12, 40, 180, 16, "Следующая ссылка", .OptionButton3


OptionButton 12, 57, 180, 16, "Следующая страница", .OptionButton4
OptionButton 12, 74, 127, 16, "Следующая секция", .OptionButton5
OptionButton 12, 91, 172, 16, "Следующий поддокумент", .OptionButton6
End Dialog
Dim dlg As UserDialog
GetCurValues dlg
n = Dialog(dlg)
If n = 0 Then Goto bye
Select Case dlg.HelpChoice
Case 0
GoToNextAnnotation    ' Сюда можно вставить любую
Case 1                           ' из приведенных выше команд
GoToNextEndnote
Case 2
GoToNextFootnote
Case 3
GoToNextPage
Case 4
GoToNextSection
Case 5
GoToNextSubdocument
End Select
bye:
End Sub
 
Операторы группы GotoPrevious симметричны операторам GotoNext, только перемещают IP по направлению к началу текста. В приведенной выше макрокоманде все операторы вида GoToNext могут быть заменены на соответствующие операторы GoToPrevious.
Отдельное место среди операторов Goto занимает GoBack, перемещающий IP через четыре места, где происходило последнее по времени редактирование (соответствует нажатию клавиш <Shift>+<F5>).
Ряд операторов связан с перемещением, аналогичным перемещению движка на линейке прокрутки. Это операторы VScroll, HScroll, VPage, HPage, VLine, HLine и соответствующие им функции VScroll(), HScroll(), VPage(), HPage(), VLine() и HLine().
Оператор VScroll осуществляет вертикальную прокрутку активного документа на указанный в качестве аргумента процент длины документа. Одновременно перемещается указатель на линейке вертикальной прокрутки. Функция VScroll() возвращает процент от длины документа, где находится IP. Так оператор VScroll 50 переместит точку вставки в середину документа. Аналогично работают оператор HScroll и функция HScroll(), но для горизонтальной прокрутки.
Оператор HLine имеет в качестве необязательного аргумента счетчик, показывающий на сколько шагов прокрутить по горизонтали активный документ. Положительное значение аргумента означает прокрутку вправо, отрицательное – влево. Если аргумент опущен, то один шаг вправо.Шаг прокрутки соответствует щелчку мыши по стрелке на линейке прокрутки. Аналогично работает VLine.
Оператор HPage, работает как HLine, но шаг прокрутки равен щелчку мыши на линейке прокрутки.
В WordBasic существуют и чуть более сложные формы перемещения, такие как перемещение по таблице.
Примеры:
Эта макрокоманда проверяет, находится ли IP в конце окна и выделяет от конца окна в его начало, либо наоборот:
 
Sub MAIN
If EndOfWindow() Then
StartOfWindow 1
Else
MsgBox "IP уже в конце окна "
StartOfWindow
EndOfWindow 1
End If
End Sub
 

Средства навигации по таблице



Как и на первом занятии начнем с команд навигации по таблице. Итак, напомню:
StartOfRow – перемещение IP или выделения (если используется одноименная функция) в начало строки таблицы;
EndOfRow – в конец строки таблицы;
StartOfColumn – в начало столбца;
EndOfColumn – в конец столбца.
NextCell – переход и выделение содержимого следующей ячейки таблицы (аналогично нажатию клавиши TAB). Если уже выделено более одной ячейки, NextCell переходит к первой из них. Если точка вставки находится в последней ячейке таблицы, то NextCell добавляет в таблицу новую строку.
Оператор (и функция) PrevCell – аналогичен NextCell, только выбор ячейки производится в обратном направлении.



Управление элементами интерфейса WinWord


 
Управление линейкой (оставлено для совместимости с предыдущими версиями WordBasic): ViewRibbon, ViewRibbon().
 
Синтаксис:
ViewRibbon [вкл_выкл]
вкл_выкл - 0 - не показывать
1 - показывать
опущено - изменяет значение переключателя на противоположное (инвертирует его).
Функция ViewRibbon() возвращает – 1, если линейка видна, 0, если нет.
Пример: макрокоманда инвертирует переключатель определяет видна Линейка форматирования
или нет.
 
Sub MAIN
If SelInfo(27) = - 1 Then FileNewDefault
ViewRibbon
n = ViewRibbon()
If n = 0 Then
MsgBox "Линейка форматирования спрятана."
Else
MsgBox "Линейка форматирования видна."
End If
End Sub
 
Управление Линейкой: ViewRuler, ViewRuler()
 
Синтаксис:
 
ViewRuler [On]
ViewRuler()
Пример:
 
Sub MAIN
If SelInfo(27) = - 1 Then FileNewDefault
ViewRuler 1
n = ViewRuler()
If n = 0 Then
MsgBox "The Ruler is hidden."
Else
MsgBox "The Ruler is visible."
End If
End Sub
 
Оператор ViewMenus()
 
Синтаксис:
 
ViewMenus()
 
Пример:
 
Sub Main
n = ViewMenus()
If n = 1 Then
MsgBox "The full menu bar is not displayed."
Else
MsgBox "The full menu bar is displayed."
End If
End Sub
 
Управление показом линейки статуса: ViewStatusBar, ViewStatusBar()
 
Синтаксис:
 
ViewStatusBar [On]
ViewStatusBar()
 
Пример:
 
Sub MAIN
ViewStatusBar 0
n = ViewStatusBar()
If n = 0 Then
MsgBox "Строка статуса не видна."
Else
MsgBox " Строка статуса не видна."
End If
 End Sub
 
Для того чтобы вставить в текст текущую дату, проще всего воспользоваться функцией Date$(), возвращающей ее в символьном виде. В русифицированной версии дата возвращается в формате ДД.ММ.ГГ.
Вся работа с календарными датами построена на понятии последовательного номера дня. Этот номер вычисляется функцией Now(), которая возвращает последовательный номер (SN), соответствующий текущей системной дате (правая чисть) и времени (цифры после десятичной точки).
Другие функции преобразуют этот последовательный номер в нужное им возвращаемое значение.
Функция Year(SerialNumber) возвращает целочисленное значение от 1899 до 4095, соответствующее компоненте “год” в SerialNumber. Пример:
 
yr = Year(Now())
insert Right$(Str$(yr),2)
 
mns = Manth (Now())
dy = Day (Now())
 
Для преобразования календарных дат введенных пользователем (т.е. из символьного вида в число), служит функция DateValue().
 



Вспомогательные операторы


 
Оператор ViewDrawingToolbar выводит на экран Панель рисования, если она была невидима, либо прячет её, если она там уже присутствует, аналогично работает оператор ViewBorderToolbar, только с панелью рамок (Borders).
Оператор с забавным названием ToggleScribbleMode привлекает только тем, что он сделан для поддержки ПК с рукописным вводом.
 



Встроенные функции языка WordBasic


 
Abs(n) – возвращает абсолютное значение числа. В отличие от некоторых других числовых функций в WordBasic, она не требует предварительного преобразования числа с помощью функции Int(), а работает с любым числом. Если нужно знак числа можно определить с помощью функции Sgn(). Пример:
m = Abs(1.51 + 2.49) + Abs(-1.5)
Int (n) – отбрасывает дробную часть числа и возвращает его целую часть. Никаких других действий, типа округления, с числом не производится.
Пример.
tmp=int (-4, 99998)
rem после выполнения tmp=-4.
В Word 7.0 с помощью макрокоманды из следующих двух строк, я попытался найти диапазон представления целых чисел:
b = Int(9999999 * 9999999)
MsgBox Str$(b)
При данных значениях сомножителей выдаётся целочисленный результат, а при добавлении ещё одного знака – результат печатается в экспоненциальной форме (в научной нотации). Дело в том, что в более ранних версиях WinWord существуют ограничения на величину целых чисел (от -32768 до +32768), так как там используется обычная, 16-разрядная целочисленная арифметика. и может возникнуть обычное переполнение (ошибка номер 6).
Rnd() – возвращает псевдослучайное число в интервале от 0 до 1.
Sgn(n) – функция знака числа. 1, если число >0, -1, если <0 и 0, если =0.
Asc(a$) – возвращает код первого символа строковой переменной.
Пример.
НомерСимвола=Asc(строка$), НомерСимвола принимает значения от 0 до 255.
Chr$(x) – функция, обратная к Asc. Возвращает символ, код которого x.
CleanString$(Str$) – заменяет все непечатаемые символы и специальные символы WinWord в строке Str$ на пробелы. Символ 13 (конец абзаца) не заменяется.
InStr(Index, Source, Search) – возвращает позицию, начиная с которой строка Search входит в строку Source (1 – с первого символа, 2 – со второго и т.д., 0 – вхождение не найдено).
LCase$(Str$) – возвращает строку, в которой все прописные буквы строки Str$ заменены строчным буквами. В русской версии WinWord с кириллицей работает правильно.
Len(n) – возвращает число символов в строке.

Left$(Count, Str$) – возвращает Count самых левых символов строки Str$.
LTrim$(Str$) – возвращает строку Str$ с удаленными лидирующими пробелами, т.е. без пробелов в начале строки.
Пример: header$ = LTrim$("   WordBasic")
Mid$(Str$, Start, [Count]) – возвращает подстроку строки Str$, начинающуюся с позиции Start и длинной Count символов. Если аргумент Count опущен, то берется оставшаяся часть строки.
Right$(Count, Str$) – возвращает Count самых правых символов строки Str$.
RTrim$( Str$) – возвращает строку Str$ с удаленными хвостовыми пробелами
Пример: header$ = RTrim$("WordBasic   ")
Str$(n) – возвращает строковое представление числа n.
UCase$(Str$) – возвращает строку, в которой все строчные буквы строки Str$ заменены прописными буквами. С кириллицей работает правильно.
String$(Count, Str$) – возвращает первый символ строки Str$, повторенный Count раз. Вместо Str$ может задаваться ASCII-код символа.
Val(Str$) – возвращает числовое значение, содержащееся в строке Str$.
Здесь уместно рассказать также и об операторе и функции ToolsCalculate.
Оператор ToolsCalculate вычисляет выделенный текст как математическое выражение, а затем выводит результат в строку статуса и в Буфер обмена.
Функция ToolsCalculate([Выражение$]), если не задано Выражение$ действует аналогично оператору, за исключением того, что она возвращает результат, а не выводит его в строке статуса и не помещает в Буфер обмена. Выражение может включать имена закладок и простые ссылки на ячейки.
Примеры.
1. Возведение в степень:
Deg= ToolsCalculate("5 ^ 3")
2. В частности, чтобы извлечь квадратный корень, можно записать это как возведение в степень 0.5:
x = ToolsCalculate("81^0.5")
3. Вычисление со ссылками на элементы электронной таблицы:
Summa= ToolsCalculate("a5 + b3")

Встроенные закладки


 
В языке WordBasic существует очень интересная группа переменных – так называемые встроенные закладки (Predefined Bookmarks). Они обеспечивают командам перемещения гораздо большие возможности, чем мы до сих пор видели, а также возможность работать с отдельными участками документа. Встроенные закладки не отображаются в окне "Перейти" (Правка·Перейти...).
Имя закладки строка длиной 20 символов, начинающаяся с буквы и состоящая из букв, цифр и символов подчёркивания.
Вот список встроенных закладок, значения которых постоянно отслеживаются редактором. Имя закладки начинается с обратной косой черты и в командах используется как строковый литерал (т.е. заключается в кавычки).
\Sel – текущий выделенный текст или точка вставки;
\PrevSel1 – выделение текста, где происходило последнее по времени редактирование. Переход к этой закладке эквивалентен однократному выполнению команды GoBack;
\PrevSel2 – выделение текста, где происходило предпоследнее по времени редактирование. Переход к этой закладке эквивалентен двукратному выполнению команды GoBack;
\StartOfSel – начало текущего выделенного текста;
\EndOfSel – конец текущего выделенного текста;
\Line – текущая строка или первая строка текущего выделенного текста;
\Char – текущий символ, т. е. символ за IP, если нет выделенного текста, если он есть, то это первый его символ;
\Para – текущий абзац, т.е. абзац, в котором находится IP.
\Section – текущая секция, включая разрыв в конце секции. Она содержит IP или выделенный текст. Если в выделенном тексте содержится более одной секции, то выбирается первая из них.
\Doc – все содержимое активного документа за исключением метки последнего абзаца.
\Page – текущая страница, включая разрыв в конце страницы, если он есть. Если выделенный текст содержит более одной страницы, закладка "\Page" относится к первой странице выделения.
\StartOfDoc – начало документа.
\EndOfDoc – конец документа.
\Cell – текущая ячейка таблицы, т.е. ячейка, содержащая IP. Если в текущей выделенной части таблицы содержится более одной ячейки, эта закладка относится к первой из них, если только не выделена вся таблица.
\Table – текущая таблица, т.е. таблица, содержащая IP или выделенный участок. Если в выделенном участке более одной таблицы, то эта закладка относится к первой из них, даже если она выделена не полностью.
\HeadingLevel – заголовок, содержащий IP или выделенный текст, плюс любые соподчиненные заголовки и текст. Если текущий выделенный участок документа содержит только текст, эта закладка будет относиться к предшествующему заголовку и всему, что ему соподчиняется.
 



Введение (Занятие №1)


WordBasic – это встроенный язык для программирования макрокоманд в текстовом процессоре Word for Windows 6.0 (далее WinWord или просто Word). Несмотря на обилие возможностей этого текстового процессора, при выполнении конкретного вида работ у вас (у ваших знакомых, клиентов и т.п.) часто возникает необходимость в создании новых команд, сокращающих количество выполняемых при редактировании действий. WordBasic можно использовать для модификации любых имеющихся в Word команд и для создания новых. Написанную вами макрокоманду можно ввести в интерфейс Word как дополнительный пункт меню, значок (пиктограмму) панели инструментов или вызывать нажатием сочетания клавиш – таким образом она будет выглядеть как “родная” команда этого редактора.
В отличие от обычных Бейсиков, в WordBasic очень много новых операторов, связанных со спецификой текстообработки, поэтому на первый взгляд он кажется громоздким и необозримым. К тому же русская версия этого пакета поставляется без описания языка, а имеющийся Help не переведен с английского.
В популярном интегрированном пакете Microsoft Excel реализован язык Visual Basic. В СУБД Access
используется сходный с WordBasic язык Access Basic. Все эти языки – диалекты Object Basic
[1]. Однако, хотя базовые наборы операторов и функций языка во всех пакетах совпадают, в каждом из них имеется много различных дополнительных средств, связанных соответственно со спецификой обработки электронных таблиц, данных и текстов.
Цель этой книги – дать подход к быстрому освоению языка WordBasic. Предполагается, что читатель имеет опыт общения с каким-либо процедурным языком программирования. Изложение ведется на базе WordBasic русифицированной версии Word 6.0 для Windows.



Выбор и перемещение объектов



Оператор DrawSetRange
 
С помощью этого оператора устанавливаются границы для работы с группой объектов. Это нужно для других операторов и функций, о которых речь пойдет чуть ниже. Напомню, что закладки (bookmarks), в том числе предопределённые, рассматривались нами ранее.
 
Синтаксис:
DrawSetRange закладка$
 
Функция DrawSetRange
 
Ведёт себя так же как и оператор и возвращает -1, если диапазон установлен, и 0, если не установлен (например закладка не существует).
 
Синтаксис:
DrawSetRange (закладка$)
 
Убрать установленный диапазон можно с помощью оператора DrawClearRange.
 
Функция DrawCount возвращает число рисованных объектов, якоря которых находятся в диапазоне, установленном с помощью оператора DrawSetRange.
 
Пример.
 
DrawSetRange " \Section"
Print “Число объектов =”, DrawCount()
DrawClearRange
 
Более точную информацию о рисованных объектах можно получить с помощью функции DrawGetType, возвращающей число, соответствующее типу рисованного объекта, который задан аргументом номер.
 
Синтаксис:
DrawGetType(номер)
 
Аргумент находится в диапазоне от 1 до DrawCount() и означает количество объектов внутри границ, заданных оператором DrawSetRange. Если номер опущен, возвращается тип рисованного объекта:
0    аргумент не задан и рисованный объект не выбран;
1    аргумент не задан и выбрано более одного объекта;
2    линия;
3    текстовый блок;
4    прямоугольник;
5    эллипс;
6    дуга;
7    изображение произвольной формы;
8    рисованный вызываемый объект.
 
Оператор DrawSelect
 
Оператор DrawSelect выбирает заданный рисованный объект и отменяет выбор любого другого рисованного объекта. Для выбора объекта без отмены выбора других объектов, используется оператор DrawExtendSelect. Функция DrawSelect() действует также как оператор и возвращает -1, если заданный объект был выбран.
 
Синтаксис:
DrawSelect Объект
DrawSelect(Объект)

 
Аргументы:
Объект – задаёт рисованный объект, якорь которого находится в диапазоне, заданном оператором DrawSetRange, где
1 – первый объект в этом диапазоне, 2 – второй, и т. д. Если число вне диапазона, возникает ошибка.
 
Операторы DrawSelectNext и DrawSelectPrevious
 
DrawSelectNext выбирает из стека объектов следующий рисованный объект, ближайший к его вершине, а DrawSelectPrevious действует в обратном направлении.. Обратите внимание, что для использования этих операторов не требуется обязательное применение оператора DrawSetRange.
 
Оператор DrawExtendSelect
 
Выбирает рисованный объект, заданный аргументом счётчик, якорь которого находится внутри диапазона установленного оператором DrawSetRange. счётчик – позиция объекта относительно уровня текста: 1 – соответствует объекту, ближайшему к уровню текста;, 2 – для следующего объекта, и т. д. Если уже выбрано два или более рисованных объектов, то объект заданный аргументом счётчик, он добавляется к группе выбранных объектов.
 
Синтаксис:
DrawExtendSelect счётчик
 
Оператор DrawUnselect
 
Отменяет выбор выделенного объекта и перемещает точку вставки к началу абзаца, содержащего соответствующий якорь. Если выбрано более одного объекта, DrawUnselect перемещает IP к первому абзацу, содержащему якорь по крайней мере для одного из выбранных объектов.
 
Операторы DrawGroup и DrawUngroup
 
Оператор DrawGroup (см. пример в Справке) группирует выбранные рисованные объекты таким образом, что с ними можно затем манипулировать как с единым объектом, а DrawUngroup удаляет связь между объектами, установленную предшествующим DrawGroup, таким образом можно будет независимо переместить и изменить размеры каждого объекта.
 
Оператор DrawDisassemblePicture
 
Преобразует выбранную графику в группу рисованных объектов. Если выбранная графика не может быть преобразована, Word вставляет её в текстовый блок.
 
Оператор DrawAlign
 
Выравнивает выделенные рисованные объекты.Аргументы соответствуют опциям диалогового окна Align (Align Drawing Objects button, Drawing toolbar).
 
Синтаксис:
DrawAlign [.Horizontal = число1] [, .Vertical = число2] [, .RelativeTo = число3]
Аргументы:
.Horizontal – выравнивание по горизонтали: 0 – не выравнивать, сохраняется существующее положение; 1 – влево; 2 – по центру; 3 – вправо;
.Vertical – выравнивание по вертикали: 0 – не выравнивать, сохраняется существующее положение; 1 – по верху; 2 – по центру; 3 – по низу;
.RelativeTo – указывает, как должны быть выровнены объекты: 0 – относительно друг друга; 1 – относительно страницы.
 

Выделение ячеек таблицы


 
Операторов в этой группе не так много, но все они часто используются при разработке макрокоманд для действий с таблицами.
TableSelectTable – выделить всю таблицу.
TableSelectColumn – выделить текущую колонку
CharRight 1, 1 – расширить выделение на соседнюю колонку
TableSelectRow – выбрать строку таблицы, содержащую IP или все выделенные строки.
Функция SelType()
используется для проверки, пуста ли ячейка:
If SelType() = 1 Then MsgBox "Ячейка пуста!"
Очень полезно использование функции SelInfo(Тип_С), которая возвращает 36 видов информации о выделенной части документа. Напомню, что активный конец такого участка тот, который перемещается при нажатии клавиш <Shift>+клавиша со стрелкой. Вот те значения аргумента Тип_С, которые касаются непосредственно работы с таблицами:
12 – возвращает -1, если выделен участок таблицы;
13 – номер строки таблицы, где находится начало выделенного участка таблицы;
14 – номер строки таблицы, где находится конец выделенного участка таблицы;
15 – число строк в таблице;
16 – номер колонки, где находится начало выделенного участка таблицы;
17 – номер колонки, где находится конец выделенного участка таблицы;
18 – наибольший номер колонки в строках, содержащих выделенный участок таблицы.
31 – возвращает -1, если IP находится у метки конца строки.
 
Примеры:
 
1. Переход к первой ячейке таблицы
 
TableSelectTable
StartOfRow
 
2. Переместить IP к метке конца первой строки таблицы. Когда IP находится в этой позиции, с помощью оператора TableInsertColumn можно добавить столбец к концу таблицы. <проверить>
 
TableSelectTable
StartOfColumn
 
3. Переместить IP к первому символу после таблицы.
 
TableSelectTable
CharRight
 
4.
Использование функции NextCell() для определения того, что IP находится в конце таблицы.
 
If NextCell() = 0 Then TableSelectTable
 
5. Проверка того, что IP находится внутри таблицы.
 
While SelInfo(12) = -1
 '
Операторы,
выполняющие действия
 '
над ячейками таблицы
Wend
 



Выделение текста



Как известно, все действия в WinWord осуществляются над выделенным текстом, поэтому в роли точки вставки во многих операторах может рассматриваться активный конец выделенного участка (selection). Выделение текста можно выполнить непосредственно в макрокоманде:
SelectCurWord – выделить текущее слово;
SelectCurSentence – выделить текущее предложение, содержащее точку вставки или выделение. При этом выделяются и хвостовые пробелы. Если выделенный текст больше одного предложения, то генерируется ошибка.
Размер выделенного участка можно расширить или уменьшить с помощью операторов ShrinkSelection и ExtendSelection. Эти операции выполняются ими в обе стороны последовательно: IP, слово, предложение, абзац, страница, весь документ. (Поэтому, в частности, в приведенной выше макрокоманде для снятия выделения с предложения оператор ShrinkSelection применяется дважды.)
Оператор ExtendSelection включает режим выделения текста, если тот не был включен. После этого любое перемещение IP будет определять выделяемую область, пока режим выделения не будет выключен с помощью оператора Cancel. Проверить состояние режима выделения можно с помощью функции ExtendMode(), которая возвращает значение -1, если режим выделения включен. Давайте выделим документ целиком.
 
Sub MAIN
StartOfDocument ‘IP в начало документа
ExtendSelection ‘включили режим выделения
EndOfDocument  ‘IP в конец документа
Cancel                ‘закончили выделение
End SUB
 
Этот пример демонстрирует несколько необычную логику выполнения ряда действий в языке WordBasic. Похожим образом выполняются копирование и перемещение текста. Но о них чуть позже. Так как операция выделения всего документа используется достаточно часто, то для этой цели существует специальный оператор, EditSelectAll, заменяющий приведенную выше последовательность операторов.
В какую сторону (справа налево или слева направо) с помощью мыши или клавиш ни выделялся бы текст, IP всегда находится на правом конце выделенного блока.
Я не нашел способа ( кроме снятия выделения) перемещения IP к его левому краю, поэтому, чтобы последовательность просмотра текста была естественной, выделенный участок в предлагаемых примерах макрокоманд заносится в строковую переменную.
В WordBasic реализован и другой подход к выделению текста. Функция GetSelStartPos() возвращает позицию первого символа выделенного участка относительно начала документа (позиция 0). При этом считаются все символы, включая непечатаемые и скрытые. Аналогично работает и функция GetSelEndPos(), возвращающая позицию последнего символа выделенного участка.
Если GetSelStartPos()=GetSelEndPos(), то выделение текста отсутствует. Это используется в следующей полезной макрокоманде.
В статьях по компьютерной тематике нам часто приходится переходить с одного алфавита на другой. Иногда это забываешь сделать, и текст на кириллице набивается латиницей и наоборот. В некоторых отечественных редакторах (в частности, в “Микромире”, W&D) существует операция преобразования такого неверно введенного текста к нужному виду. В WinWord подобной встроенной операции нет, но она может быть реализована в виде макрокоманды, вот один из ее вариантов:
 
Sub MAIN
‘ Заменить латинский шрифт на кириллицу
Lltab$ = "f,dultt;pbqrkvyjghcnea[wxio]sm'.z"
Ultab$ = "F<DULTT:PBQRKVYJGHCNEA{WXIO}SM" + Chr$(34) + ">Z"
Lrtab$ = "абвгдеежзийклмнопрстуфхцчшщъыьэюя"
b$ = Selection$()
If GetSelStartPos() = GetSelEndPos() \
Then MsgBox "No selection" : Stop
c$ = ""
For i = 1 To Len(b$)
tmpc$ = Left$(b$, 1)
ind = InStr(1, Ultab$, tmpc$) ‘прописная?
If ind > 0 \
Then c$ = c$ + UCase$(Mid$(Lrtab$, ind, 1)) : Goto lp
ind = InStr(Lltab$, tmpc$)  ‘строчная ?
If ind > 0 Then c$ = c$ + Mid$(Lrtab$, ind, 1)
If ind = 0 Then c$ = c$ + tmpc$
lp:
If Len(b$) > 1 Then b$ = Mid$(b$, 2)
Next i
EditCut'вырезать выделенный участок
Insert c$'и вставить новый текст
End SUB
 
Читателям предлагаю написать в качестве упражнения макрокоманду, исправляющую английский текст, набранный в кириллице.Затем попробуйте объединить эти макросы в один.
 

Взаимодействие с пользователем



Рассмотрим несколько операторов, которые нам потребуются ниже в примерах макрокоманд.
Для ввода строки в переменную макрокоманды используется функция InputBox$(“Сообщение”). Текст сообщения подсказывает, какие данные нужно ввести. InputBox$ возвращает введенную строку, которая может быть длинной до 255 символов.
 
Пример:
 
word$ = InputBox$("Счетчик =")
count = Val(word$)
 
Для вывода сообщений служит оператор MsgBox "сообщение". Следующий оператор выводит значение счетчика, введенного в предыдущем примере:
MsgBox Str$(count)
Обратите внимание, что числовые значения перед выводом предварительно должны быть преобразованы в строковые.
Можно воспользоваться также оператором Print, который работает, как и в обычном Бейсике, за одним исключением: вывод осуществляется в самую нижнюю строку экрана (если вывод не в файл).
Оператор Beep [ТипСигнала] служит для вывода звукового сигнала. ТипСигнала – число от 0 до 15
Sub MAIN
for i=0 to 15
beep i
for j=0 to 100: next j
next i
End Sub
 



WordBasic: операторы редактирования (Занятие №5)



Один из моих учителей программирования говорил: “Ничего не делай руками, если для этого можно написать программу”. Работая с текстами иногда думаешь, что несколько однотипных исправлений проще сделать вручную, чем написать для этого макрокоманду, но жизнь неоднократно доказывала мне обратное. Команды редактирования WordBasic позволят вам автоматизировать самые трудоемкие операции.
Оператор EditGoTo
Этот оператор служит для перехода на редактируемый элемент текста:
EditGoTo [[.Destination = ]"аргумент"]
перемещает точку вставки в заданный элемент текста. В качестве операнда можно задать один из следующих буквенных аргументов:
 

Страница
p
Секция
s
Закладка
(пусто)
Аннотация
a
Ссылка
f
Концевая ссылка
l
Поле
d
Таблица
t
Рисунок
g
Формула
q
Объект
o

 
Число, стоящее за буквой, означает число повторений. Так p5 – переход на пятую страницу документа. Если число отделено от аргумента знаками + или -, то отсчет производится от текущей точки вставки. Например "l-" ссылается на предыдущую строку, а "l+" – на следующую.
Примеры.
EditGoTo "+"         ' переход на следующую страницу
EditGoto "p+"
EditGoTo "P+"
EditGoTo "-"   ' переход на предыдущую страницу документа
EditGoTo "p-"
EditGoto "+4"  ' переход на четыре страницы вперед
EditGoTo "-3"  ' на три страницы назад
Задание. Что делают следующие команды:
EditGoto "L4"
EditGoto "L+"
EditGoto "L+3"
EditGoto "L-"
Возможны более сложные сочетания команд. Например, EditGoto "4L7" переместит точку вставки к началу седьмой строки на четвёртой странице.
EditGoto "50%" переместит IP в середину документа, а EditGoto "%100" – в конец документа.
Оператор EditGoto можно использовать для перемещения к следующей таблице в вашем документе. Для задания перехода к таблице используется аргумент "t". Следующий оператор переместит точку вставки к первой ячейке следующей таблицы.
EditGoTo "t+"
Аналогично поступаем и при работе с рисунками, формулами и другими объектами.
 



WordBasic в Word 7.0 для Windows 95 (Занятие №8)



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



Это занятие мне хотелось бы



Это занятие мне хотелось бы начать с реального примера полезности написания макрокоманд. Как известно сейчас при всеобщем увлечении Интернетом большое количество текстовых файлов приходит в HTML-формате. К сожалению в WinWord отсутствует фильтр для чтения таких файлов. Проблема в том, что этот язык гипертекстовой разметки вставляет в текст очень много своих специальных значков, которые затем интерпретируются программами просмотра (браузерами). Следующая макрокоманда очищает загруженный в Word HTML-документ от знаков разметки, оставляя только те из них, которые несут полезную информацию. Я прогонял её на текстах пресс-релизов корпорации Intel, получая вполне читабельный текст, который можно было обрабатывать дальше.
Sub MAIN
Dim H$(35)
 H$(0) = "<HTML>"
 H$(1) = "<TITLE>"
 H$(2) = "</TITLE>"
 H$(3) = "</HEAD>"
 H$(4) = "<P>"
 H$(5) = "<UL>"
 H$(6) = "</UL>"
 H$(7) = "<H2>"
 H$(8) = "</H2>"
 H$(9) = "<B>"
 H$(10) = "</B>"
 H$(11) = "<LI>"
 H$(12) = "<U>"
 H$(13) = "</A>"
 H$(14) = "<HEAD>"
 H$(15) = "<H1>"
 H$(16) = "</H1>"
 H$(17) = "<I>"
 H$(18) = "</I>"
 H$(19) = "<BR>"
 H$(20) = "<H3>"
 H$(21) = "</H3>"
 H$(22) = "<ADDRESS>"
 H$(23) = "</ADDRESS>"
 H$(24) = "<CENTER>"
 H$(25) = "<HR>"
 H$(26) = "<BODY>"
 H$(27) = "</BODY>"
 H$(28) = "</HTML>"
 H$(29) = "<H4>"
 H$(30) = "</H4>"
 H$(31)= "</FONT>"
 H$(32)="</CENTER>"
 For i = 0 To 32
   StartOfDocument
   EditReplace .Find = H$(i), .Replace = "", .ReplaceAll
 Next i
End Sub
 
Сама по себе макрокоманда выглядит скучновато (на самом деле она вдвое длиннее). Но по существу в ней всего три оператора: В цикле осуществляется замена в документе всех элементов, занесённых в символьный массив H$, на пустую строку. Для этого после каждого прохода точка вставки возвращается в начало документа. Все предшествующие циклу присваивания лишь подготавливают данный массив. На этом примере видно, что в языке не хватает средств инициализации массивов.
В версии WinWord 8.0 язык WordBasic заменён на Visual Basic, но на мой взгляд это создает и немало проблем, так как предшествующие версии имеются уже у многих миллионов пользователей и нет явных причин массово переходить на новый язык.
Теперь двинемся дальше.