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

         

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



Как известно, все действия в 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
 
Читателям предлагаю написать в качестве упражнения макрокоманду, исправляющую английский текст, набранный в кириллице.Затем попробуйте объединить эти макросы в один.
 

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