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


Элементы языка


 
Те, кто знаком с языком Бейсик, могут этот раздел либо пропустить, либо посмотреть бегло на возможные отличия и детали.
Когда в WinWord вы вызвали подменю Сервис, выбрали в нем пункт Макрокоманда и ввели имя новой макрокоманды (лучше давать русское название, отражающее выполняемое макрокомандой действие), в диалоговом окне становится доступной опция Создать. Если ее активизировать, то в окне для записи текста макрокоманды появятся скобки главной процедуры:
 
Sub MINE
 
End SUB
 
Между ними вы можете вписывать операторы языка WordBasic, т. е. создавать “тело” будущей макрокоманды. Таким образом каждая из макрокоманд – последовательность операторов WordBasic, расположенных между маркерами Sub Main и End Sub:
 
Sub MAIN
 Последовательность операторов WordBasic
End Sub


 
Прежде всего макрокоманды используются для быстрого ввода часто повторяющихся последовательностей символов или выполнения повторяющихся действий. Связав с нажатием определенной комбинации клавиш выполнение некоторой макрокоманды, можно значительно сэкономить время при работе с документом. Однако так как запоминать даже небольшое число таких сочетаний весьма утомительно, WinWord предоставляет возможность связать имя макроса не только с нажатием комбинации клавиш, но и с пиктограммой на панели инструментов или кнопкой в документе.
По области действия макросы в WinWord делятся на глобальные, которые могут действовать в любом документе, и макросы шаблона, используемые только в документах, создаваемых на базе данного конкретного шаблона. Макросы могут создаваться создаются несколькими способами: программированием на языке WordBasic, с помощью специального средства записи последовательности действий (записывателя макросов), сочетанием первого и второго способов. Хранятся макросы тоже несколькими способами: как команды, как глобальные макросы или как макросы шаблона.
Я думаю, что одна из причин медлительности редактора Word в том, что его команды меню, диалоговые окна и многие другие средства в действительности – макрокоманды, хранящиеся непосредственно в программе Word.

Макрокоманды, созданные пользователем, хранятся либо в шаблоне NORMAL.DOT (глобальные макросы), либо в заданном вами шаблоне документа.
Перечислим кратко основные элементы языка WordBasic.
Метки. Используются в операторах переходов для изменения порядка выполнения инструкций макрокоманды. Метки могут быть цифровыми (числа от 1 до 32759, сохранены в языке для совместимости с предыдущими версиями), алфавитными и алфавитно-цифровыми. В последних случаях метка начинается с буквы, может иметь длину до 40 знаков. Метка должна располагаться с самого начала строки (т.е. ей не должны предшествовать пробелы или символы табуляции) и заканчиваться двоеточием. Правила для имен меток такие же, как и для имен переменных. Лучше располагать метку на отдельной строке. Как это принято в новых Бейсиках, строки программы не нумеруются.(Необходимость нумерации операторов в первых Бейсиках была связана с удобством их построчного редактирования и вставки новых операторов с помощью имевшихся тогда средств.)
Переменные.
Переменная – это место для хранения какой-либо строки знаков или числа. В ходе выполнения макрокоманды содержимое переменной можно изменить. Использование переменных обеспечивает гибкость при написании макрокоманд: меняя значение переменной можно использовать одну и ту же макрокоманду для работы с разными словами.
WordBasic поддерживает два типа данных: числовые и строковые. Соответственно, строковые переменные служат для хранения в них текста (состоящего из букв, чисел, пробелов, знаков пунктуации и любых других знаков), а числовые – чисел. Признаком строковой переменной является знак доллара в конце ее имени. Такая переменная может иметь длину до 65 280 символов (если хватает памяти), т. е. в нее можно считать текстовый файл среднего размера. Двойные кавычки служат для обозначения начала и конца строки текста. (Чтобы включить в строку двойную кавычку или непечатаемый символ используется функция Chr$). Присвоим произвольной строковой переменной какое-нибудь смешное значение:


Реплика$ = "Элементарно, Ватсон!"
Эту переменную можно в подходящем месте программы вывести на экран:
Print Реплика$
Пустая строка – это строка не содержащая ни одного символа. Такую строку можно создать одним из трёх приведённых ниже способов:
 
EmptyString$ = ""
EmptyString$ = Chr$(0)
EmptyString$ = String$(1,0)
 
При создании имени переменной следует придерживаться следующих правил:
1. Имя должно начинаться с буквы. В именах переменных можно использовать кириллицу, кроме буквы ‘ч’.
2. Состоять только из букв, чисел, знака подчёркивания ( _ ); знаки пунктуации и пробелы не допускаются.
3. Имя не может быть длиннее 40 знаков.
4. Имя не может быть зарезервированным словом. (Зарезервированное слово – это слово, которое имеет определённый смысл в WordBasic. В их число входят имена операторов, функций и операторы типа AND, OR, MOD и др.)
Обратите внимание, что идентификаторы в WordBasic не зависят от того, в каком регистре они набраны.
Числовые переменные могут содержать до 14 цифр и соответствуют по типу 8-байтовому числу с плавающей точкой двойной точности. Большие числа могут быть записаны и в так называемой научной нотации. Наибольшее положительное число в WordBasic чуть больше 1.79769E+308.
Массивы. Поддерживаются числовые и строковые одно- и двумерные массивы. Нумерация элементов массива начинается с нуля. Объявление массива с помощью оператора Dim:
 
Dim Имя_переменной(Номер_последнего_элемента)
 
Примеры.
 
Dim Месяц(11)    'массив из 12 элементов
 
Dim Год(12,31)    'массив из 12 строк и 31 колонки
 
В следующем предложении объявляется массив из трех элементов:
Sub MAIN
 Dim ТриСестры$(2)
 ТриСестры$(0) = "Вера "
 ТриСестры$(1) = " Надежда "
 ТриСестры$(2) = " Любовь"
 MsgBox ТриСестры$(0) + ТриСестры$(1) + ТриСестры$(2)
End Sub
 
Максимальный размер одномерного численного массива 8143 элемента, строкового – 16287. Можно одновременно иметь несколько строковых и численных массивов максимальной размерности.


Размер любого объявленного ранее массива можно изменить с помощью оператора Redim (т.е. переобъявить массив). Синтаксис как и у оператора Dim:
 
Redim Имя_переменной(Номер_последнего_элемента)
 
В предыдущем примере можно увеличить размер массива ТриСестры$:
Redim ТриСестры$(6)
если сестер в семье стало семеро. Отметим, что предыдущее содержимое массива в результате этой операции будет потеряно и присваивать значения элементам массива придётся заново. Иногда Redim полезно делать чтобы освободить для других целей память, занимаемую символьным массивом.
Комментарии. Как и в обычном Бейсике, начинаются с ключевого слова REM. Однако, так как оно громоздко для этой цели, их можно начинать и с кавычки (‘).
Операции.
Арифметические:
-      – Отрицательное значение
*     – Умножение
 /     – Деление
 Mod – остаток от деления одного целого числа на другое
 +    – Сложение
 -     – Вычитание
Как всегда круглые скобки () изменяют старшинство операций: сначала выполняются операции внутри скобок.
 
Сравнения: =, <, >, >=, <=, <>
Логические: And, Or, Not
Конкатенация: +
Операторы. Обычно каждый оператор макрокоманды записывается на отдельной строке. Это облегчает отладку и улучшает читабельность ее текста. Если в одной строке записывается несколько операторов WordBasic, они отделяются друг от друга двоеточием. Оператор, не уместившийся на одной строке, можно перенести на следующую, поставив в конце строки обратную косую черту (\). Оператор можно набирать в любом сочетании строчных и прописных букв, т.е. в нижнем или верхнем регистре. При сохранении макрокоманды WordBasic запишет свои ключевые слова правильным образом (из окна ввода макрокоманды выбрать в меню Файл, пункт Сохранить шаблон). WordBasic, как и программа Справки,
распознает их, очевидно, приводя к единому виду.
Действуют стандартные операторы Бейсика.
Оператор перехода:
 Goto метка
передает управление оператору, следующему за указанной в goto меткой. Хотя существует идущее от известной статьи Дейкстры предубеждение против этого оператора, в ряде случаев он полезен.


 
Условный оператор имеет несколько форм записи:
а)
If выражение
Then оператор
If выражение
Then оператор : оператор [...]
Пример.
1. Если отмеченный текст выделен полужирным шрифтом, то отменить полужирный и выделить курсивом:
If Bold() = 1 Then Bold 0 : Italic 1
 
б)
If выражение
Then
операторы
EndIf
 
Пример.
If Italic() = 1 Then                ' Если отмеченный текст выделен курсивом,
Italic 0                                        ' удалить выделение
Bold 1                                        ' выделить полужирным
Underline                                    ' и подчеркнуть его.
End If
 
в)
If выражение Then
  операторы (если True)
Else
  операторы (если False)
EndIf
 
Пример.
If Italic() = 1 Then
Italic 0
Else
Italic 1
End If
 
г)
If выражение_1 Then
  операторы (если True)
ElseIf выражение_2 Then
  операторы (если True второе условие)
Else
  операторы (если False)
EndIf
Так как слова Else, ElseIf, EndIf являются “скобками” в операторе If, то они могут располагаться при записи этого оператора произвольно.
Так как WinWord по умолчанию присваивает всем численным переменным значение 0, то использование переменных с неприсвоенными им в программе значениями не диагностируется. Так, оператор
If false Then A=1 Else B=2
выполнится правильно, а
If true Then A=1 Else B=2
отработает как предыдущий. Из-за того, что встроенных констант false и true в языке WordBasic нет, они рассматриваются как переменные.
 
Select Case
<добавить описание>
 
Циклы.
Обычный цикл. Выполняет последовательность операторов до тех пор пока значение счетчика
не станет больше значения выражения_2. После каждого цикла счетчик
увеличивается на 1.
 
For счетчик = выражение_1
To выражение_2
      операторы
Next
 
Если значение счетчика больше значения выражение_1, то цикл не выполняется ни разу.
 
While выражение
      операторы ‘выполняются, пока выражение true
Wend


 
Циклы могут быть вложенными, как и в любом процедурном языке.
 
Оператор Stop.
прекращает выполнение макрокоманды. Если вывод сообщений не подавлен, то на экране появится окно с предупреждением, что выполнение данного макроса прекращено. Этот оператор полезен также при отладке макрокоманд.
Как видно из этого перечисления, управляющие структуры в языке слабо развиты, так как он не предназначался для разработки программ большого объема.
Программные блоки.
Макрокоманда (программа на WordBasic) может состоять из одного или нескольких программных блоков, один из которых является главным и называется MAIN. Ему WinWord передает управление при запуске программы на исполнение (саму макрокоманду WinWord рассматривает как подпрограмму).
 Разбиение программы на блоки не только облегчает отладку и чтение ее текста (который называется исходным текстом), но также позволяет быстрее разрабатывать другие макрокоманды. При этом ранее написанные процедуры (в виде библиотек подпрограмм и функций?) используются в качестве строительных блоков.
Общая структура программы на WordBasic выглядит так:
Sub MAIN
      Последовательность операторов WordBasic и/или
      имена_подпрограмм
End Sub
Sub имя_подпрограммы_1
      Последовательность операторов WordBasic
End Sub
.......
Sub имя_подпрограммы_N
      Последовательность операторов WordBasic
End Sub
 
В языке определены два вида подпрограмм: подпрограммы и функции. Структурно они оформляются так:
Sub имя (аргументы)
      Последовательность операторов WordBasic
End Sub
 
Function имя_функции (аргументы)
      Последовательность операторов WordBasic
      имя_функции
= возвращаемое_значение
End Function
 
Подпрограмма вызывается указанием ее имени и макроса, в котором данная подпрограмма определена. Использование ключевого слова Call при этом необязательно, хотя и допускается, чтобы отличить процедуры в макрокомандах от операторов WordBasic. Так, если процедура Beep(Count) определена в макросе LibMacros, то ее вызов с аргументом 8 выглядит так:
LibMacros.Beep(8)
 

Содержание раздела