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

         

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


 
Оператор 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"
 

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