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

       

Оператор CopyFile


CopyFile позволяет переписать указанный файл в другой каталог. Синтаксис и работа этого оператора аналогичны команде COPY в MS-DOS.
Синтаксис:

CopyFile ИмяФайла$, Каталог$
 
Если в аргументе ИмяФайла$ не указан дисковод или имя файла, то он копируется из текущего каталога. В параметре Каталог$ следует указать полный путь до данного каталога. Если в каталоге, куда копируется файл, уже существует файл с таким же именем, то появится запрос, хотите ли вы его заменить.
Следующая макрокоманда скопирует файл WINBAS3.DOC из каталога C:\EDWARD в каталог A:\SAVE:
 
Sub MAIN
CopyFile "C:\edward\winbas3.doc", "A:\save"
End Sub
 
GetAttr()


 
Программирование диалогов (Занятие №5)
 
Начнём как обычно с примера из повседневной жизни. Мне потребовалось “втащить” в Word файл из базы данных, в которой записи состояли из двух полей: текстового и числового. Так как записи между собой ничем не разделены и имеют разную длину, то разделить их могла помочь только макрокоманда. Вручную это заняло бы неделю. Вот эта макрокоманда, по примеру которой вы можете решать свои задачи подобного типа.
В ней по всему тексту ищется начало строки, начинающейся с прописной латинской буквы "A". Затем проверяется, предшествует ли найденной букве цифра и, если "да", между ними вставляется символ "возврат каретки". Затем всё повторяется для следующей буквы алфавита и т. д.
Sub MAIN
For i = 0 To 25
StartOfDocument
While Not AtEndOfDocument()
  EditFind .Find = Chr$(65 + i), .MatchCase = 1, .WholeWord = 0
  If EditFindFound() = - 1 Then
     CharLeft 2, 0 ' выделить предшествующий знак
     CharRight 1, 1
     b$ = Selection$()
     CharRight 1, 0
     If (B$ >= "0") And (B$ <= "9") Then Insert Chr$(10)
     CharRight 3, 0  ' продолжить поиск
  Else
     Goto eloop
  EndIf
 Wend
eloop:
 Print i
 Next i
End Sub
В отличие от профессионального программирования, на языке WordBasic приходится писать от случая к случаю, когда в этом возникает реальная потребность.
Поэтому детали языка, содержащего в последней версии более 600 операторов, забываются и под рукой желательно иметь какой-либо справочник, в частности, WordBasic Reference. К сожалению, этот встроенная справочная система в Word 7 для Windows 95 (как в Word 6.0) не переведена на русский язык при локализации, тем не менее, я рекомендую обязательно указывать её при инсталляции этого пакета.
Второй процесс, доставляющий немало мучений -- отладка макрокоманды. Для отладки следует загрузить в качестве тестового примера фрагмент или копию документа, к которому вы хотите применить разрабатываемый макрос. Как правило работа макрокоманды очень наглядна из-за перемещения курсора, выделения, удаления и вставок текста и других действий. Поэтому макрокоманду удобно отлаживать в пошаговом режиме предварительно выбрав в меню Окно
пункт Расположить все. Тогда в двух окнах на экране одновременно видно и исполняемую строку макрокоманды и результат её действия над текстом документа.
Следующая макрокоманда позволяет выделить полезную информацию из строки, где ей предшествует нечто, обозначенное в строке поиска как признак1, а после неё следует признак2, например так:
Всё что угодно
признак1нужные данные признак2 всё что угодно
Обратите внимание на работу операторов StartOfLine и EndOfLine с признаками выделения текста.
Sub MAIN
StartOfDocument
 While Not AtEndOfDocument()
  StartOfLine
  EditFind .Find = "признак1", .Direction = 0, \
      .WholeWord = 0, .MatchCase = 1
  If EditFindFound() Then
    EditCut
    StartOfLine 1
    EditCut
  End If
  EditFind .Find = "признак2", .Direction = 0, \
      .WholeWord = 0, .MatchCase = 1
  If EditFindFound() Then
     EditCut
     EndOfLine 1
     EditCut
  End If
  LineDown
 Wend
End Sub
На третьем занятии были кратко рассмотрены операторы Print и MsgBox, используемые для взаимодействия с пользователем из макрокоманды.
Оператор Print может применяться для вывода в файл, на принтер или, по умолчанию, в строку статуса на экране.


Синтаксис оператора Print при выводе в строку статуса:
Print ИмяПеременной1[$],ИмяПеременной2[$], ...
Например:

Sub Main
  Print "Лена"
  A$="Наташа"
  Print A$
End Sub

Результат работы первого оператора Print можно увидеть только при пошаговом выполнении этой макрокоманды, потому что он остаётся в ней до выполнения следующего оператора Print. Чтобы избежать этого, между ними следует вставить операторы задержки времени, например ничего не делающий цикл.
 
Sub MAIN
  Print "Лена"
  For i = 0 To 4096 : Next
  A$ = "Наташа"
  Print A$
End Sub
 
Операнды оператора
Print могут разделяться точкой с запятой, запятой или соединяться с помощью операции конкатенации (сцепления). Если операнды отделены друг от друга запятыми, то при печати между ними вставляется символ табуляции. Следующая макрокоманда показывает как используется конкатенация:
Sub Main
  ИмяДевочки$ = "Оля"
  ИмяМальчика$ = "Саша"
  Print ИмяДевочки$ + " и " + ИмяМальчика$ + " пошли на танцы."
End Sub
 

 
В реальной жизни конкатенация используется для печати более прозаических сообщений. Вот пример макрокоманды, выводящей строку на LPT1.
 
Sub MAIN
  x = SelInfo(27)
  If x = - 1 Then MsgBox "Текущее окно – окно макросов!"
  Open "lpt1.dos" For Output As #1
  Print #1, "Вывод строки на печать"
End Sub
Первые две строчки позволяют избежать получения сообщения об ошибке “Command is unavailable” при выполнении макрокоманды, если активное окно – это окно редактирования макрокоманд. Эта проблема возникает из-за того, что некоторые макрокоманды не могут выполняться, если активным окном является окно макрокоманд.
Наиболее удобно то, что в операторе Print можно перемешивать в списке операндов строковые переменные с числовыми и числами. Часто для отладки выводятся сообщения типа:
Print "Преременная Name = "; Name; "Index =
"; Index


При этом строка статуса примет следующий вид:
 

 
Наконец, как и в обычном Бейсике операндами Print могут быть арифметические выражения, функции, выражения с функциями и т. п.
Теперь рассмотрим более интересный оператор MsgBox, позволяющий получать фиксированные ответы пользователя. Оператор и функция MsgBox, выводит только символьные строки. Синтаксис оператора MsgBox:
MsgBox сообщение$ [,заголовок$] [,тип]
 
где, сообщение$ -- это выводимый текст, необязательный заголовок$, , -- заголовок окна, в котором выводится сообщение. Если она опущена, то заголовок окна - "Microsoft Word". Например:
  MsgBox "Удалить абзац?", ,3
 

 
<рис.>
Третий операнд делает оператор MsgBox более гибким и полезным.
Этот операнд формируется как сумма двух слагаемых: кода числа кнопок и кода выводимой в окне пиктограммы.
Код числа и значений выводимых в окне клавиш
0 - OK (по умолчанию)
1 - ОК, Отмена,
2 - Прервать, Повторить, Пропустить
3 - Да, Нет, Отмена
4 - Да, Нет
5 - Повторить, Отмена
Код выводимой в окне пиктограммы
0  - не выводится ничего (по умолчанию)
16 - знак "Stop"
32 - знак вопроса (?)
48 - восклицательный знак (!)
64 - пиктограмма "Информация" (i)
 

 
Код кнопки, принятой по умолчанию
0   - первая кнопка (по умолчанию)
256 - вторая кнопка
512 - третья кнопка
Если в качестве третьего операнда задать числа -1, -2 или -8, то вывод информации, как и в операторе Print будет осуществляться в строку статуса, но выведенный текст не исчезнет сразу, а сохранится до выполнения некоторого условия:
-1 - сообщение сохраняется до вывода следующего сообщения (и необязательно в строку статуса);
-2 - до нажатия клавиши на клавиатуре или кнопки мыши;
-8 - как и -2, но на полную строку статуса.
Функция MsgBox() отличается от оператора MsgBox тем, что возвращает значение нажатой кнопки:
-1 - нажата левая кнопка (первая);
 0 - средняя (вторая);
 1 - третья.
Ввод ответов в макрокоманду, когда нажатия кнопок в MsgBox недостаточно, можно осуществить и с помощью оператора InputBox$, который имеет следующий синтаксис:
Inputbox$ (подсказка$, [заголовок$],[по_умолчанию$])
где
подсказка$ - текст, выводимый в окне запроса;
заголовок$ - заголовок окна запроса;
по_умолчанию$ - значение по умолчанию, которое макрокоманда предлагает пользователю.
WordBasic позволяет создавать очень сложные диалоговые окна. Делается это либо “вручную” – с помощью соответствующих операторов, имеющих, как правило, множество параметров, либо с помощью редактора диалогов.
последнее предпочтительнее и нагляднее.
 

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