Специфика 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