Объект selection


Объекты Range и Selection

Объект Document имеет метод Range, возвращающий объект Range, и метод Select, создающий объект Selection. Метод Range – это функция, возвращающая как результат объект Range; метод Select – это процедура без параметров, которая создает объект Selection в качестве побочного эффекта. Объект Range имеет метод Select, превращающий область объекта Range в выделенную. Тем самым метод Select определяет новый объект Selection. Симметрично, объект Selection имеет свойство Range, возвращающее объект Range, соответствующий выделенной области.

Большинство ранее описанных частей документа являются и частями (свойствами) объектов Range и Selection.

Объект Range напоминает матрешку: в каждую область вложена область поменьше. Вот пример корректного (хоть и не самого эффективного) задания объекта Range:

Работа с текстом

Объекты Range и Selection позволяют выполнять основные операции над текстом: «выделить», «добавить», «заменить», «удалить». У наших объектов большой набор методов, позволяющих реализовать эти операции. Все рассматриваемые здесь методы принадлежат обоим объектам, если не сделана специальная оговорка.

Выделение

Выделить некоторую часть текста по существу означает определить объект Range или Selection. Объекты задают некоторую область в тексте документа, а их свойства Start и End позволяют установить начало и конец этой области. Меняя значения свойства, можно задать нужную область выделения.

Move является основным методом перемещения точки вставки. Остальные методы этой группы – в той или иной степени его модификации. Метод Move(Unit, Count) сжимает область в точку, стягивая ее в начало или конец, а затем перемещает точку вставки. Параметр Unit определяет единицы перемещения, a Count – количество этих единиц (по умолчанию 1). Знак переменной Count задает направление стягивания и перемещения. Положительные значения этого параметра задают стягивание к концу и перемещение вперед, отрицательные – стягивание в начало и перемещение назад. Чистое стягивание без перемещения точки вставки задается как перемещение на одну единицу. Метод возвращает количество единиц, на которое фактически произошло перемещение, или 0, если оно не осуществлено. Параметр Unit принимает значения wdCharacter (по умолчанию), wdWord, wdSentence, wdParagraph, wdSection, wdStory, wdCell, wdColumn, wdRow и wdTable.

Методы перемещения на сам текст не влияют – лишь изменяют область, заданную объектами Range и Selection. Поэтому эти методы применимы только к переменным типа Range, но не к фиксированным областям. Например, запись

не имеет эффекта, поскольку область первого абзаца – вещь неизменяемая. Метод Move стягивает область в точку, которая и перемещается, поэтому после его выполнения область исчезает, остается только точка вставки. Методы MoveStart и MoveEnd перемещают начальную или конечную точку области, обычно тем самым расширяя область.

Удаление текста

Метод Delete позволяет удалить текст. Вызванный без параметров, он удаляет вызывающий его объект Range или Selection. Если он применен в форме Delete(Unit,Count), удаляется часть текста в указанной области. Параметр Unit задает единицы, но при удалении возможны только два значения: wdWord и wdCharacter. Параметр Count задает количество удаляемых единиц. Если область стянута в точку, удаляются символы перед точкой вставки или после нее в зависимости от знака параметра Count.

Вставка текста

Группа методов Insert объектов Range и Selection позволяет осуществлять вставки в документ. Для вставки текста используются методы InsertBefore(Text) и InsertAfter(Text). Параметр text типа string задает текст, вставляемый до или после области, заданной объектами range или selection. После вставки текста область автоматически расширяется, включая в себя добавляемый текст.

Свойство Text позволяет заменять текст в выделенной области, поэтому нет нужды вызывать метод Insert(Text). Методы InsertBefore и InsertAfter безопасны, так как текст добавляется, не изменяя содержимого области. Совсем иное дело – методы вставки, которые далеко не безопасны. При вставке внутрь области, например при использовании метода InsertSymbol или InsertParagraph, заменяется содержимое области.

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

Метод Сору, не имеющий параметров, копирует объект (содержимое области) в буфер. Метод cut, действуя аналогично, должен бы заодно и удалять объект. Но сам объект не удаляется – только стягивается в точку, так что над ним возможны дальнейшие операции.

Иногда в буфер копируют не текст, а его формат. Этим занимается метод CopyFormat, копирующий формат по первому символу объекта selection. Если этот символ – метка абзаца, копируется формат абзаца. Методом CopyFormat обладает только объект selection.

Метод Paste позволяет поместить («приклеить») содержимое буфера в область, заданную объектами Range и Selection. Эта операция опасна, так как происходит замена, а не добавление текста. Поэтому обычно метод Paste применяется к объектам Range и Selection, предварительно стянутым в точку вставки. Метод PasteFormat применяет форматирование, хранящееся в буфере, к объекту Selection.

Например, создадим макрос, который вставляет список «урок, экзамен, сдал!», копирует его и помещает еще раз на лист.

Selection.TypeText Text:=»Работа с текстом:»

ListTemplate:=ListGalleries(wdBulletGallery).ListTemplates(1), ContinuePreviousList:=False, ApplyTo:= _wdListApplyToWholeList, DefaultListBehavior:=wdWord10ListBehavior

Выделение: Range, TextRange и Selection

Материал на этой странице устарел, поэтому скрыт из оглавления сайта.

Более новая информация по этой теме находится на странице https://learn.javascript.ru/selection-range.

В этой статье речь пойдёт о документированных, но нечасто используемых объектах Range , TextRange и Selection . Мы рассмотрим вольный перевод спецификаций с понятными примерами и различные кроссбраузерные реализации.

Эта статья представляет собой обновлённый вариант статьи Александра Бурцева, которой уже нет онлайн. Публикуется с его разрешения, спасибо, Александр!

Range

Range – это объект, соответствующий фрагменту документа, который может включать узлы и участки текста из этого документа. Наиболее подробно объект Range описан в спецификации DOM Range.

Чтобы понять о чем речь, обратимся к самому простому случаю Range , который будет подробно рассмотрен ниже – к выделениям. В приводимом ниже примере выделите несколько слов в предложении. Будет выводиться текстовое содержимое выделяемой области:

Но такие области можно создавать не только с помощью пользовательского выделения, но и из JavaScript-сценария, выполняя с ними определённые манипуляции. Однако, написать простой иллюстрирующий код сразу не выйдет, т.к. есть одно НО – Internet Explorer до версии 9. В Microsoft создали собственную реализацию – объект TextRange. Разберём каждую реализацию по-отдельности.

DOM-реализация Range (кроме IE8-)

Range состоит из двух граничных точек (boundary-points), соответствующих началу и концу области. Позиция любой граничной точки определяется в документе с помощью двух свойств: узел (node) и смещение (offset).

Контейнером (container) называют узел, содержащий граничную точку. Сам контейнер и все его предки называются родительскими контейнерами (ancestor containers) для граничной точки. Родительский контейнер, включающий обе граничные точки, называют корневым контейнером (root container).

На изображении выше граничные точки выделения лежат в текстовых узлах ( #text1 и #text2 ), которые являются контейнерами. Для левой границы родительскими контейнерами являются #text1 , H1 , BODY , для правой – #text2 , P , BODY . Общий родитель для обоих граничных точек – BODY , этот элемент является корневым контейнером.

Если контейнер является текстовым узлом, то смещение определяется в символах от начала DOM-узла. Если контейнер является элементом ( Document , DocumentFragment , Element …), то смещение определяется в дочерних узлах.

Смотрим на иллюстрацию (источник):

Граничные точки объекта Range s1 лежат в текстовых узлах, поэтому смещение задаётся в символах от начала узла. Для s2 граничные точки расставлены так, что включают весь абзац

, поэтому контейнером является элемент BODY , и смещение считается в позициях дочерних узлов.

Объекты Range создаются с помощью вызова document.createRange() . Объект при этом создаётся пустой, и граничные точки нужно задать далее его методами setStart и setEnd . Смотрим пример.

Свойство commonAncestorContainer вернёт ссылку на наиболее вложенный корневой контейнер.

Свойство startContainer ( endContainer ) вернёт ссылку на контейнер верхней (нижней) граничной точки.

Свойство startOffset ( endOffset ) вернёт смещение для верхней (нижней) граничной точки.

Свойство collapsed вернёт true , если граничные точки имеют одинаковые контейнеры и смещение ( false в противном случае).

Метод setStart ( setEnd ) задаёт контейнер (ссылка на узел) и смещение (целочисленное значение) для соответствующих граничных точек. Пример выше.

Методы setStartBefore , setStartAfter , setEndBefore , setEndAfter принимают в качестве единственного аргумента ссылку на узел и устанавливают граничные точки в соот-ии с естественной границей переданного узла. Например:

Методы selectNode и selectNodeContents позволяют создать объект Range по границам узла, ссылку на который они принимают в качестве единственного аргумента. При использовании selectNode передаваемый узел также войдёт в Range , в то время как selectNodeContents создаст объект только из содержимого узла:

Метод collapse объединяет граничные точки объекта Range . В качестве единственного аргумента принимает булево значение ( true – для объединения в верхней точке, false – в нижней). По-умолчанию true .

Метод toString вернёт текстовое содержимое объекта Range .

Метод cloneContents вернёт копию содержимого объекта Range в виде фрагмента документа.

Метод cloneRange вернёт копию самого объекта Range .

Метод deleteContents удаляет всё содержимое объекта Range .

Метод detach извлекает текущий объект из DOM, так что на него больше нельзя сослаться.

Метод insertNode принимает в качестве единственного аргумента ссылку на узел (или фрагмент документа) и вставляет его в содержимое объекта Range в начальной точке.

Метод extractContents вырезает содержимое объекта Range и возвращает ссылку на полученный фрагмент документа.

Метод surroundContents помещает всё содержимое текущего объекта Range в новый родительский элемент, ссылка на который принимается в качестве единственного аргумента.

Метод compareBoundaryPoints используется для сравнения граничных точек.

Для примера решим небольшую задачку. Найдём в текстовом узле фразу и подсветим её синим фоном.

С остальными свойствами и методами поэкспериментируйте сами. Перейдём к реализации range в IE.

TextRange (для IE)

Объект TextRange в реализации MSIE – это текстовый диапазон нулевой и более длины. У данного диапазона также есть свои границы, «перемещать» которые можно на целое число текстовых единиц: character(символ), word (слово), sentence (предложение). То есть можно взять и сдвинуть границу на 2(5, 8 и т.д.) слова (символа, предложения) вправо (влево). При этом у объекта сохраняются данные о HTML-содержимом диапазона и есть методы взаимодействия с DOM.

Объект TextRange создаётся с помощью метода createTextRange , который можно вызывать в контексте элементов BODY , BUTTON , INPUT (большинство типов), TEXTAREA .

Простой пример с кнопкой:

Рассмотрим свойства и методы объекта TextRange (не все, только самые необходимые):


Свойство boundingWidth (boundingHeight) вернёт ширину (высоту), которую занимает объект TextRange в пикселях.

Свойство boundingTop ( boundingLeft ) вернёт Y(X)-координату верхнего левого угла тестовой области относительно окна документа.

Свойство htmlText вернёт HTML-содержимое объекта.

Свойство text вернёт текстовое содержимое объекта (см. пример выше).

Свойство offsetTop ( offsetLeft ) вернёт Y(X)-координату верхнего левого угла тестовой области относительно предка.

Метод collapse объединяет граничные точки диапазона. В качестве единственного аргумента принимает булево значение ( true – для объединения в верхней точке, false – в нижней). По-умолчанию true.

Метод duplicate клонирует имеющийся текстовый диапазон, возвращая новый, точно такой же.

Метод expand расширяет текущий тектовый диапазон до единицы текста, переданной в качестве единственного текстового аргумента:

  • «character’ – символ.
  • «word» – слово
  • «sentence» – предложение
  • «textedit» – сворачивает до первоначального диапазона.

Вернёт true ( false ) в случае успеха (неудачи).

Метод findText ищет в диапазоне совпадения с текстовой строкой, передаваемой в качестве первого аргумента (без учёта регистра). Если совпадение найдено, то границы диапазона сворачиваются до него. В качестве второго (необязательного) аргумента можно передать целое число, указывающее число символов от верхней точки, в которых нужно производить поиск. Далее в качестве аргументов можно перечислять INT-флаги, которые вам вряд ли понадобятся.

Метод getBookmark возвращает в случае успешного вызова строку, по которой можно будет восстановить текущее состояние текстового диапазона с помощью метода moveToBookmark .

Метод inRange принимает в качестве аргумента другой TextRange и проверяет, входит ли его текстовый диапазон в диапазон контекстного объекта. Возвращает булево значение.

Метод isEqual проверяет является ли текущий TextRange идентичным переданному в качестве аргумента. Возвращает булево значение.

Метод move(sUnit [, iCount]) сворачивает текущий диапазон до нулевой длины и передвигает на единицу текста, переданного в качестве первого аргумента (character | word | sentence | textedit). В качестве второго (необязательного) аргумента можно передать число единиц, на которое следует передвинуть диапазон.

Метод moveEnd ( moveStart ), аналогично методу move, передвигает верхнюю (нижнюю) границу диапазона на единицу текста, число которых также можно задать необязательным вторым параметром.

Метод moveToElementText принимает в качестве аргумента ссылку на DOM-элемент и выставляет границы диапазона Textобъекта Range по границам полученного элемента.

Метод moveToPoint принимает в качестве двух обязательных аргументов X и Y-координаты (в пикселях) относительно верхнего левого угла документа и переносит границы диапазона туда.

Метод parentElement вернёт ссылку на элемент, который полностью содержит диапазон объекта TextRange (или null ).

Метод pasteHTML заменяет HTML-содержимое текущего текстового диапазона на строку, переданную в качестве единственного аргумента.

Метод select формирует выделение на основе содержимого объекта TextRange , о чем мы подробнее поговорим ниже.

Метод setEndPoint принимает в качестве обязательных аргументов текстовый указатель и ссылку на другой TextRange , устанавливая в зависимости от значения указателя границы диапазона. Указатели могут быть следующими: „StartToEnd“, „StartToStart“, „EndToStart“, „EndToEnd“.

Также к TextRange применимы команды метода execCommand, который умеет делать текст жирным, курсивным, копировать его в буфер обмена (только IE) и т.п.

Для закрепления сделаем задачку по поиску текстового содержимого, аналогичную той, что была выше:

С остальными свойствами и методами поэкспериментируйте сами.

Selection

Всем знакомо выделение элементов на странице, когда, зажав левую кнопку мыши и передвигая курсор, мы выделяем нужный фрагмент. Или зажимаем Shift и жмём на стрелочки клавиатуры. Или ещё как-то, неважно. В данной части статьи мы кроссбраузерно научимся решать две задачи: получать пользовательское выделение и устанавливать собственное.

Получаем пользовательское выделение

Эту задачу мы уже решали в самом начале статьи в примере с миксом. Теперь рассмотрим код:

Все браузеры, кроме IE8- поддерживают метод window.getSelection() , который возвращает объект, схожий с рассмотренным ранее Range . У этого объекта есть точка начала выделения (anchor) и фокусная точка окончания (focus). Точки могут совпадать. Рассмотрим свойства и методы объекта Selection :

  • Свойство anchorNode вернёт контейнер, в котором начинается выделение. Замечу, что началом выделения считается та граница, от которой вы начали выделение. То есть, если вы выделяете справа налево, то началом будет именно правая граница. Это правило работает везде, кроме браузера Opera, в котором anchorNode вернёт ссылку на узел левого края выделения.
  • Свойство anchorOffset вернёт смещение для начала выделения в пределах контейнера anchorNode .
  • Свойства focusNode и focusOffset работают аналогично для фокусных точек, то есть точек окончания выделения. Opera и здесь отличилась, возвращает вместо фокусной точки узел правого края выделения.
  • Свойство rangeCount возвращает число объектов Range , которые входят в полученное выделение. Это свойство полезно при использовании метода addRange .
  • Метод getRangeAt принимает в качестве аргумента индекс объекта Range и возвращает сам объект. Если rangeCount == 1 , то работать будет только getRangeAt(0) . Таким образом, мы можем получить объект Range , полностью соответствующий текущему выделению.
  • Метод collapse сворачивает выделение в точку (каретку). Методу можно передать в качестве первого аргумента узел, в который нужно поместить каретку.
  • Метод extend принимает в качестве аргументов ссылку на контейнер и смещение ( parentNode , offset ), и перемещает фокусную точку в это положение.
  • Метод collapseToStart ( collapseToEnd ) перемещает фокусную (начальную) границу к начальной (фокусной), тем самым сворачивая выделение в каретку.
  • Метод selectAllChildren принимает в качестве единственного аргумента ссылку на узел и добавляет всех его потомков в выделение.
  • Метод addRange принимает в качестве аргумента объект Range и добавляет его в выделение. Таким образом можно увеличить количество объектов Range , число которых нам подскажет свойство rangeCount .
  • Метод removeRange ( removeAllRanges ) удаляет переданный (все) объект Range из выделения.
  • Метод toString вернёт текстовое содержимое выделения.

IE предоставляет собственный интерфейс взаимодействия с выделениями – объект selection в контексте document. Для работы с этим объектом используются следующие методы:

  • Метод clear убирает выделение вместе с содержимым.
  • Метод createRange (ВАЖНО! Не путать со стандартным методом document.createRange() для создания объектов Range !) создаёт из содержимого выделения TextRange .
  • Метод empty убирает выделение, но оставляет содержимое.

Надеюсь, теперь, после знакомства с обеими реализациями выделений, код выше стал более понятен.

Установка собственного выделения

Допустим, вам хочется, чтобы какой-то текстовый фрагмент на странице был выделен, как пользовательское выделение. Это нужно при клиентской реализации поиска по странице и некоторых других задач.

Проще всего решить эту задачу следующим образом:

  1. Создать объект Range ( TextRange для IE8-).
  2. Перевести полученный объект в выделение.

Объект selection

1.Объекты Range и Selection .Работа с текстом.

Работа с текстом осуществляется с помощью ряда объектов. Весь текст документа можно представить в виде пирамиды, основой которой являются символы, а вершиной – собственно документ. В иерархическом порядке объектов VBA документ Word можно представить как:

Символы ( Characters ) ® Слова ( Words ) ® Предложения ( Sentences ) ® ® Абзацы ( Paragraphs ) ® Разделы ( Sections ) ® Документ ( Document )

Кроме этих объектов, явно указывающих на тот или иной элемент документа, в VBA имеется два объекта, которые позволяют работать с текстом как с целым, без явного структурного разделения: объект Rahge ассоциируется с любым фрагментом документа, а объект Selection – с любым выделенным фрагментом текста. Оба эти объекта похожи по своему действию, однако они различаются по своим функциональным возможностям.

Объект Selection является одним из базовых объектов. Это глобальный объект и предварительного объявления для него не требуется . в целом этот объект любое выделение в документе, а в случае если выделение вырождено, т.е. ничего не выделено, то объект описывает текущее положение указателя.

Эта особенность часто используется для получения ссылки на объект, описывающий текущий элемент документа.

Пример: получить ссылку на объект типа Paragraphs , являющегося семейством всех выделенных или затронутых выделением абзацев.

Dim e As Paragraphs

Set e = Selection.Paragraphs

Свойством по умолчанию для объекта типа Selection является свойство Text , возвращающее выделенный текст.

Selection .[. Text ][ =Text ]

Для замены текущего выделенного текста используется метод TypeText .

Пример: вставляем в документ текст «ХХХ» и начинаем новый абзац.

. TypeText Text := «XXX»

Для управления параметрами вставки текста можно использовать свойство ReplaceSelection .

Если true – текущее выделение замещается, если False – то вставлять перед выделением.

3.Текстовый диапазон. Объект Range предназначен для выделения и обработки фрагментов текста. Этот объект является семейством многих объектов.

Например для выделения абзаца, в котором сейчас находится указатель достаточно использовать код

Область текста, связанная с объектом типа Range , характеризуется начальными и конечными символами. Для получения информации о них нужно использовать свойства Start и End .

параметр Position (типа Long ) позволяет задать индекс символа, с которого должен начаться или которым должен закончится фрагмент текста, связанного с данным объектом objRange .

Для получения ссылки на текстовый диапазон можно использовать метод Range .


ObjDocumet.Range ( Start , End )

Параметр Start указывает на индекс символа, с которого должен начаться диапазон, а параметр End – на индекс последнего символа. Индексы символов соответствуют их порядковым номерам в семействе Words , ссылку на которое возвращает свойство Words объекта Document .

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

Формально объект Range связан только с диапазоном текста. Этот диапазон может быть никак не связан с текущим положением курсора или выделением. Однако диапазон, связанный с объектом Range , можно выделить в любой момент времени с помощью метода Select .

Пример: выделить второй абзац текущего документа.

ThisDocument.Paragraphs (2). Range.Select

Для создания вырожденного диапазона можно использовать метод Collapse .

Параметр Direction позволяет задать направление, в котором будет выполнено вырождение. Если параметр имеет значение wdCollapseStart , то вырождение выполняется в направлении начала диапазона, т.е. End:=Start . Если параметр имеет значение wdCollapseEnd , то Start:=End

Пример: снятия выделения в документе, курсор помещен в конец выделеного диапазона.

Объект Range чаще используется как инструмент для форматирования выделенного текстового диапазона. Для этого, кроме свойства объекта Font объект Range имеет целый ряд свойств, позволяющих настроить параметры шрифта данного диапазона.

Свойство Bold – позволяет установить параметры жирного начертания символов.

Если свойство имеет значение True , то начертание жирное , если False – нежирное. Свойство также может возвращать значение wdUnderfined , указывающее на смешанное начертание. Для установления стиля начертания можно использовать следующие значения True , False или wdToggle , позволяющие переключить текущее написание шрифта.

objRange . Bold [= Boolean ]

Свойство позволяет сжать все символы выделенного диапазона. Если свойство имеет значение true , то выполняется сжатие.

Свойство позволяет указать ширин у( в текущих единицах измерения, в которых должен быть размещен данный диапазон). Размер шрифта и ширину межсимвольного пространства Word подбирает автоматически

В приведенном ниже примере показан код, позволяющий уместить текущее выделение на отрезке документа , ширина которого эквивалентна пяти сантиметрам.

Selection.Range.FilTextWidth = CentimetersToPoints ( 5)

Свойство возвращает ссылку на объект типа Range , который ассоциируется с текстом в пределах данного диапазона objRange , имеющего специфическое форматирование.

C войство Italic – позволяет установить параметры курсивного начертания символов.

Свойство ListFormat возвращает ссылку на объект типа Listformat , содержащего нумерованные или маркированные списки, используемые в данном диапазоне.

Свойство возвращает ссылку на объект типа ListParagraph , содержащего нумерованные абзацы, имеющиеся в данном диапазоне.

Свойство Shading – возвращает ссылку на объект типа Shading , позволяющего указать цвет и формат заливки для данного диапазона.

Свойство возвращает ссылку на объект типа Revisions , который связан с исправлениями , находящимися в данном диапазоне.

Свойство позволяет указать на отображение непечатаемых символов: табуляций, пробелов, символов абзаца, скрытого текста. True -символы отображаются.

Свойство позволяет задать стиль для данного абзаца. Параметр Stile (тип Stile ) позволяет указать один из существующих типов.

Свойство Underline [= Underline ]

Свойство позволяет указать , как должен быть подчеркнут текст в данном диапазоне. Параметр Underline ( тип Underline ) позволяет указать тип линии подчеркивания

Метод InsertAfter вставляет заданный текст в конце диапазона или выделения.

Метод InsertParagraph позволяет заменить заданный диапазон символов или выделения на новый абзац. После его использования объект Range отождествляется с новым абзацем.

Метод InsertSymbol предназначен для вставки символа в заданное место диапазона или выделения. При использовании данного метода содержимое диапазона или выделения удаляется. Если этого не требуется, то перед вызовом этого метода следует использовать метод Collapse .

ObjRange.InsertSimbol ( CharacterNumber , Font, Unicode)

Параметр CharacterNumber определяет код символа. Параметр Font определяет имя шрифта, используемого в качестве источника символов. Параметр Unicode если значение True , то вставляется юникодовый символ, заданный аргументом CharacterNumbe . В противном случае (по умолчанию False ) будет вставлен символ ANSI, заданный аргументом CharacterNumbe .

Selection.Collapse direction := wdCollapseStart

Selection.InsertSymbol characterNumber := 171, Font:=»Symbol», unicode :=False «

Метод Paste позволяет вставить содержимое буфера обмена в заданный диапазон или выделение. При его использовании содержимое диапазона или выделения заменяется содержимым буфера обмена. В случае если требуется вставить абзац из буфера обмена без замены текущего абзаца, перед вызовом этого метода следует использовать метод Collapse .

7.Поиск и замена

Поиск и замена- это стандартные инструменты любого приложения Microsoft Office .Как правило, команды вызова соответствующих диалоговых окон располагаются в меню Правка( Edit ). Инструменты поиска и замены в VBA реализуются с помощью объектов Find и Replacement .

Задачи по поиску и замене требуют своей реализации в VBA в редких случаях, например при частом поиске и замене одного и того же сочетания , вложенном поиске или при контекстном поиске.

Стандартный инструмент поиска и замены работает следующим образом : вы открываете окно диалога Поиск и замена( Find and Replace ) , вводите в соответствующие поля необходимые значения , определяете дополнительные параметры поиска и нажимаете кнопку Поиск( Find ) или Заменить( Replece Однако при частом поиске или замене одних и тех же значений для этой операции удобно назначить кнопку на панели инструментов , комбинацию клавиш или разместить ее в контекстном меню. Для реализации этой задачи нужно сначала создать соответствующий макрос.

Для упрощения (ускорения) создания соответствующего программного кода можно автоматизировать процесс написания макроса.

  1. Подготовить документ к поиску
  2. Выбрать команду Сервис +Макрос +Н ачать запись
  3. В поле Имя макроса введите имя макроса , в поле Описание добавьте описание макроса
  4. Нажмите кнопку Ok – откроется панель инструментов Остановит запись , содержащая кнопки управления записью макроса: Остановить запись и Пауза.
  5. Выберите команду Правка +Н айти

Укажите необходимые параметры поиска и нажмите кнопку Н айти

На панели инструментов О становить запись нажмите кнопку Остановить запись

Откройте окно редактирования Visual Basic for Application и перейдите к записанному макросу.

Выполните ручное редактирование макроса

В приведенном ниже примере показан код, позволяющий заменить четыре идущих подряд символов пробела одним символом табуляции

Selection.Find.Execute Replace := wdReplaceall

В ситуации , когда нужно найти фрагмент документа , а в нем еще один фрагмент – задача становится неоднозначной. В этом случае можно создать два макроса , один из которых будет вызываться и другого.

В приведенном ниже примере реализован одкратно вложенный поиск и замена , однако число вложений может быть и больше.

Переменная strText (тип string ) содержит текст, вкотром осуществляется поиск . Если заданный текст будет найден (метод Execute возвращает True ), то осуществляется вызов процедуры ReplaceSpace 4, показанной в предыдущем примере .

If .Execute Then ReplaceSpace4

Таблица представляет собой упорядоченную структуру, предназначенную для хранения организованных в виде строк и столбцов наборов данных. Элемент таблицы, находящийся на пересечении строки и столбца, называется ячейкой.

Таблица Word имеет такую же структуру, как и электронная таблица Excel – элемент таблицы, находящийся на пересечении строки и столбца, называется ячейкой и идентифицируется по имени столбца и номеру строки.

В VBA для доступа к таблицам используется объект Tables , являющийся семейством объектов Table , каждый из которых связан с конкретной таблицей. Для получения ссылки на семейство Tables можно использовать свойство Tables объекта Document .

Общее число таблиц, имеющихся в документе, содержится в свойстве Count . Для получения доступа к конкретной таблице можно использовать метод Item , который является методом по умолчанию.

Set oblTable = objDocument.Tables.Item ( Key)

Параметр Key , является уникальным идентификатором каждой таблицы, хранящейся в объекте Tables .

Для создания новой таблицы используется метод Add объекта Tables . Этот метод возвращает ссылку на созданную таблицу( Table ).

objTables.Add ( Range , NumRows , NumColums )

Параметр Range позволяет указать область документа, куда будет вставлена таблица. Если параметр не пустой, т.е. имеется выделенная область, то она будет заменена вставляемой таблицей.

Параметры NumRows , NumColums позволяют указать на число строк и столбцов таблицы.

Пример: создадим таблицу в выделенном месте или там где стоит курсор.

Объект selection


Объекты, задающие программный проект, являются общими для всех документов Office 2000, в том числе и документа Word. Этой важной теме — программной работе с такими объектами посвящена лекция 4

Текст и объекты Range и Selection

Основной частью документа Word является, конечно, текст этого документа. Уже было сказано, как структурирован текст документа, рассмотрены коллекции — Characters , Words , Sentences , Paragraphs , которые позволяют работать с символами, словами, предложениями и абзацами текста. Говорил я также и о том, что только этими коллекциями не обойтись, и необходим общий класс объектов, позволяющий задать произвольную область текста. Таковыми являются два важных класса Range и Selection . Объекты этих классов широко используются при работе с текстом. Документы, поддокументы, разделы, все вышеупомянутые коллекции от Characters до Words имеют метод или свойство Range , возвращающие в качестве результат объект Range . Каждый объект Range задает область определения некоторого объекта, включая текст и все объекты, связанные с этим текстом — комментарии, ссылки и прочее. Так, если некоторый объект вызвал метод Range , то возвращаемый объект Range будет содержать область определения объекта, вызвавшего метод.

Объект Selection представляет выделенную область. Поскольку в каждом окне может быть только одна выделенная область, то одновременно может существовать лишь несколько объектов Selection по одному на каждое существующее окно или подокно. Заметим также, что, объект Selection всегда существует в окне, даже если и не сделано явного выделения некоторой области, в последнем случае объект Selection задает точку вставки, определенную позицией курсора.

Илон Маск рекомендует:  Работа сайта

Объект Document имеет метод Range , возвращающий объект Range , и метод Select , создающий объект Selection . Метод Range — это функция, возвращающая в качестве результата объект Range ; метод Select — это процедура без параметров, которая создает объект Selection в качестве побочного эффекта. Заметьте существенную разницу между методами Range и Selection . В первом случае возвращается сам объект и поэтому можно запомнить возвращаемый объект и в программе одновременно работать с несколькими такими объектами. В случае вызова метода Selection объект не возвращается, следовательно, запомнить его нельзя, что и гарантирует уникальность объекта Selection .

Объект Range имеет метод Select , выделяющий область объекта Range , и определяющий, тем самым, новый объект Selection . Симметрично, объект Selection имеет свойство Range , возвращающее объект Range , соответствующий выделенной области.

Объекты Range и Selection столь же многообразны по своей структуре, как и объект Document . И даже большинство свойств у этих трех объектов одни и те же. Эти три объекта являются схожими. Это понятно, так как большинство частей документа: предложения, абзацы, разделы, таблицы, рисунки, комментарии, ссылки и многое другое — может составлять любую подобласть документа, в том числе и выделенную подобласть. Значит, большинство ранее описанных частей документа являются и частями (свойствами) объектов Range и Selection . Это приятно — ведь с большинством свойств этих объектов мы уже знакомы!

Объект Range напоминает матрешку: в каждую область вложена область поменьше. Вот пример корректного (хоть и не самого эффективного) задания объекта Range :

Сколько объектов Range упоминается в этом предложении? Правильный ответ: 6, но не 3. Напомним: на нижнем уровне отсутствуют классы, определяющие символ, слово или предложение — все эти объекты принадлежат классу Range .

Для объекта Selection нельзя построить такую хитрую цепочку вложений — ведь метод Select не возвращает объект Selection . Но можно построить такую же «хитрую» последовательность операторов, которая задает сужающуюся область выделения:

Работа с текстом

Объекты Range и Selection позволяют выполнять основные операции над текстом (и не только над текстом): «выделить», «добавить», «заменить», «удалить». У наших объектов большой набор методов, позволяющих реализовать эти операции. Все рассматриваемые здесь методы принадлежат обоим объектам, если не сделана специальная оговорка.

Говоря в этом параграфе о выделении, я имею в виду не применение метода Select , а выделение в более широком смысле, умение задать некоторую подобласть данной области. Выделить некоторую часть текста означает, по существу, определение объекта Range или Selection . Оба объекта задают непрерывную область, а их свойства Start и End позволяют задать начало и конец области. Меняя эти свойства, можно задать нужную область выделения. Этот основной способ выделения мы не раз демонстрировали в наших примерах:

В первом случае при задании области используются параметры Start и End , во втором — задается вся область данного объекта. Область может изменяться автоматически при добавлении или удалении из нее части текста. Изменить область можно и путем ее перемещения. Этим занимается специальная группа методов перемещения Move. Прежде чем говорить о перемещении, рассмотрим сжатие области. Нередко нужна пустая область — точка вставки, параметры Start и End которой совпадают. Поэтому простейший способ сжатия — задать совпадающие значения этих параметров:

Для сжатия области можно применять специальный метод сжатия — Collapse(Direction). Область стягивается в начальную или конечную позицию. Направление сжатия задает параметр Direction, принимающий значения wdCollapseStart или wdCollapseEnd . По умолчанию область стягивается в начальную точку (значение параметра: wdCollapseStart ). Если сжимается абзац, и он стягивается в конечную точку, точка вставки переносится за метку конца абзаца и устанавливается в начало следующего абзаца. Если такой эффект нежелателен, после сжатия применяется метод перемещения MoveEnd , передвигающий точку вставки назад на один символ:

Если есть методы сжатия области, то должны быть и методы расширения области. Основным из них является метод Expand (Unit). В зависимости от значения параметра Unit область можно расширить на слово, предложение, абзац, раздел, на строку или столбец таблицы, или на всю таблицу. Для объекта Selection область можно расширить на всю строку. Для расширения области на весь фрагмент можно использовать метод WholeStory , что впрочем эквивалентно вызову метода Expand (Unit := wdStory)

Метод Move является основным методом перемещения. Остальные методы — в той или иной степени его модификации. Метод Move ( Unit , Count ) сжимает область в точку, стягивая ее в начало или конец, и затем перемещает точку вставки. Параметр Unit определяет единицы перемещения, а Count — количество этих единиц и направление стягивания и перемещения (по умолчанию 1). Положительные значения этого параметра задают стягивание к концу и перемещение вперед, отрицательные — стягивание в начало и перемещение назад. Само стягивание означает перемещение на одну единицу. Метод возвращает количество единиц, на которое фактически произошло перемещение, или 0, если оно не осуществлено. Параметр Unit принимает значения wdCharacter (по умолчанию), wdWord, wdSentence, wdParagraph, wdSection, wdStory, wdCell, wdColumn, wdRow и wdTable.

Методы перемещения на сам текст не влияют — лишь изменяют область, заданную объектами Range и Selection . Поэтому эти методы применимы только к переменным типа Range , но не к фиксированным областям. Например, запись:

не имеет эффекта, поскольку область первого абзаца — вещь неизменяемая.

Метод Move стягивает область в точку, которая и перемещается, поэтому после его выполнения область исчезает, и остается только точка вставки. Методы MoveStart и MoveEnd перемещают начальную или конечную точку области, обычно расширяя тем самым область.

Конечно, для перемещения по тексту документу есть много различных возможностей, кроме группы методов Move . Стоит упомянуть группу методов Next, основным из которых является метод Next(Unit,Count). Основное отличие от метода Move с теми же параметрами состоит в том, что метод Next возвращает сам объект Range , в отличие от метода Move , возвращающего число символов, на которое произошло перемещение. Напомним также о тех возможностях перемещения, которыми обладают объекты Browser и Hyperlink , напомним о закладках, специально предназначенных для перехода к ним.

Метод Delete позволяет удалить текст. Вызванный без параметров, он удаляет вызывающий его объект Range или Selection . Если он применен в форме Delete(Unit,Count), удаляется часть текста в указанной области. Параметр Unit задает единицы, но при удалении возможны только два значения: wdWord и wdCharacter. Параметр Count задает количество удаляемых единиц. Если область стянута в точку, удаляются символы перед точкой вставки или после нее в зависимости от знака параметра Count . Вот несколько примеров:

Группа методов Insert объектов Range и Selection позволяет осуществлять вставки в документ. Для вставки текста используются методы InsertBefore(Text) и InsertAfter(Text). Параметр Text типа String задает текст, вставляемый до или после области, заданной объектами Range или Selection . После вставки текста область автоматически расширяется, включая в себя добавляемый текст. Вот пример вставки нового абзаца в начало документа:

Свойство Text позволяет заменять текст в выделенной области, поэтому нет нужды вызывать метод Insert(Text), — лучше использовать свойство. Методы InsertBefore и InsertAfter безопасны, так как текст добавляется, не изменяя содержимого области. При вставке внутрь области, например, при использовании метода InsertSymbol или InsertParagraph, заменяется содержимое области. Эта вроде бы безобидная программка сотрет все содержимое документа, заменив его пустым абзацем:

Говоря о методах вставки текста, нельзя не упомянуть о таком мощном методе, как InsertFile — он позволяет вставлять не только текст или таблицу Excel, но и целый документ, хранящийся в файле. Вот простой пример вызова метода, при котором в начало активного документа вставляется существующий документ:

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

Известно, как полезен буфер при работе с одним и, особенно, с несколькими документами. Объекты Range и Selection в полной мере позволяют задействовать все возможности буфера. Метод Copy, не имеющий параметров, копирует объект (содержимое области) в буфер. Метод Cut, действуя аналогично, копирует объект в буфер, заодно удаляя его. Заметьте, что в отличие от предыдущей версии, теперь метод Cut работает, как ему положено, не только копируя объект, но и удаляя его, ранее удаления не происходило, вместо этого объект, вызывавший метод стягивался в точку. Метод Paste позволяет приклеить объект, помещенный в буфер. Рассмотрим пример:

Метод Paste позволяет «вклеить» содержимое буфера в область, заданную объектами Range и Selection . Эта операция опасна, так как происходит замена, а не добавление текста. Поэтому обычно метод Paste применяется к объектам Range и Selection , стянутым в точку вставки. В выполнении этого метода есть нюансы. У объекта Range содержимое буфера включается в его область, Объект Selection остается точкой вставки, расположенной после текста, добавленного из буфера.

Заметьте, в буфер можно копировать не только текст. В нашем следующем примере в буфер копируется рисунок, являющийся элементом коллекции TableOfFiguress . Напомню, что элементы этой коллекции вставляются аналогично символам текста и являются частью абзаца. В тестовом документе DocOne, с которым я работаю, в начало текста вставлен рисунок мышки. Я буду работать с первым абзацем этого текста, содержащим этот рисунок, как с обычным текстом, выделю рисунок, помещу его в буфер, а затем приклею в другом месте текста. Вот код соответствующей процедуры:

Иногда в буфер копируют формат текста. Этим занимается метод CopyFormat , копирующий формат по первому символу объекта Selection . Если этот символ — метка абзаца, копируется формат абзаца. Методом CopyFormat обладает только объект Selection .

Метод PasteFormat применяет форматирование, хранящееся в буфере к объекту Selection .

Метод PasteSpecial позволяет явно управлять форматированием в момент вставки объекта из буфера.

Хостинг в Европе для новичков (от 25 руб/мес) и VIP-хостинг для профессионалов (от 1000 руб/мес)

Скидка 25% на все тарифы хостинга по промокоду STDCITF

Шпоры по высокоуровневым методам информатики и программирования — файл 19.5.doc

Доступные файлы (7):

18.doc 91kb. 18.01.2009 16:22 скачать
19.5.doc 69kb. 18.01.2009 14:39 скачать
21.doc 86kb. 18.01.2009 16:21 скачать
29.doc 348kb. 18.01.2009 14:36 скачать
42.doc 524kb. 18.01.2009 14:52 скачать
7.doc 80kb. 19.01.2009 00:41 скачать
82].doc 1941kb. 18.01.2009 15:19 скачать

19.5.doc

  1. Свойства и методы объектов Options, Dialogs, Selection и Range объектной модели MS Word.

Объекты Range

Роль коллекций во всех приложениях Office 2000 велика. Если одновременно могут существовать несколько объектов (экземпляров) одного и того же класса, то существует и объединяющий их класс — коллекция, в которой собраны все экземпляры. Класс коллекция позволяет работать с последовательностью элементов — экземпляров класса.

Но двух классов объектов недостаточно: мало иметь возможность работать с элементом или с последовательностью всех элементов — нужно уметь работать и с частью этих объектов, — произвольной подпоследовательностью элементов. Для этой цели и придуман класс объектов Range. При работе в Word и Excel программисту чаще всего приходится оперировать именно с этим классом объектов — словами, абзацами, символами документов Word, ячейками и их всевозможными диапазонами в Excel.
^

Что определяет объект Range?

Пусть задана коллекция элементов — последовательность индексированных элементов. Индексы (ключи) элементов задают порядок их расположения в коллекции. Индексы могут быть как числами, так и именами. Объект Range позволяет задать произвольный диапазон этой последовательности, для чего достаточно задать индексы первого и последнего элемента. Диапазон может быть стянут в точку, так что объект Range может определять единственный элемент, а в приложении Word и пустой элемент — точку вставки. Используя свойства и методы объекта Range, можно выполнять групповые операции над всеми элементами диапазона. В одном из предыдущих примеров встречаются строки, использующие объект Range в Excel:

В первой из этих строк задается диапазон из двух ячеек. Индексами являются имена этих ячеек. Одним присваиванием все ячейки указанного диапазона получают значение. В следующих строках опять-таки используется Range, но теперь работа идет с отдельным элементом. Этот пример отражает двойственную природу объекта Range.
^

Метод Range

Ранее мы говорили, что объект класса Paragraph имеет свойство Range, иначе говоря, в него вложен объект Range., задающий последовательность символов данного абзаца. Объектов, имеющих свойство Range, немало. Это понятно, ведь не только с абзацами полезно связать диапазон, соответствующий объекту. При обращении к свойству Range таких объектов в качестве результата получаем соответствующий диапазон — ссылку на объект Range.

В ряде случаев можно определить новый объект класса Range, используя метод Range. Заметьте: метод, а не свойство. Так объекты более высокой иерархии, например объект класса Document, имеют метод Range и не имеют соответствующего свойства. Синтаксис метода таков:

Function Range(Start, End) As Range

Он имеет два параметра: Start и End — и возвращает как результат объект класса Range.

Если объект Range уже построен, то значения его параметров Start и End можно переопределить, вызвав его метод SetRange, в котором можно задать новые значения этих параметров.

В следующем примере работы с документом Word демонстрируется как применение свойства Range, так и метода Range. В нем же показано и применение метода SetRange.

Public Sub WorkWithRange()

Dim myr As Range, myr1 As Range

‘Добавляем новый документ

‘Добавляем 7 абзацев в текст созданного документа

.Paragraphs.Last.Range.Text = «Абзац » & i

‘Используется свойство Range

Set myr = .Paragraphs(1).Range

‘Выделен первый абзац

‘Новый объект myr1 задает пустой объект — позицию курсора

‘В правой части вызывается метод Range


Set myr1 = ActiveDocument.Range(Start:=myr.Start, End:=myr.Start)

‘Теперь объект myr1 задает единственный символ -первый символ текста

‘Здеесь использован метод SetRange

myr1.SetRange Start:=myr1.Start, End:=myr1.End + 1

‘Три абзаца с третьего по пятый выделяются курсивом

myr1.SetRange Start:=.Paragraphs(3).Range.Start, End:=.Paragraphs(5).Range.End

Объекты Selection

Еще один общеупотребительный объект — Selection. Как и Range, этот объект присутствует в большинстве приложений Office 2000. Он задает выделенную область документа Word, рабочего листа Excel, область в окне презентации. Его особенность в том, что в каждом окне (точнее, в каждом подокне) может существовать только один объект Selection. Каждое новое выделение некоторой области в подокне отменяет или модифицирует старое. Этим он отличается от объектов Range, несколько экземпляров которых могут существовать одновременно. Selection, как и объект Range, задает непрерывную область элементов. Но есть и принципиальное отличие: объект Selection не является диапазоном, заданным своим началом и концом, — это некоторая область, например таблица или ее столбец.

Но объекты Selection и Range имеют и много общего. Прежде всего, оба предназначены для того, чтобы задавать некоторую область элементов, и позволяют выполнять действия над элементами этой области. Возможности этих объектов для работы с элементами области примерно одинаковы. Так, у приложения Word свойства и методы данных классов объектов совпадают на 90%. Вот почему почти каждую задачу, которую можно решить в терминах объекта Selection, можно решить и в терминах объекта Range. Macrorecorder (о нем еще будет подробный разговор) любит использовать объект Selection в своей работе, и очень часто программист «подправляет» программу, переписывая ее для повышения эффективности в терминах свойств и методов объекта Range.

Отметим еще одну связь (ее можно назвать двойственностью) между этой парой объектов. У объекта Range есть метод Select, который выделяет заданный диапазон, создавая объект Selection, после чего можно использовать свойства и методы этого объекта. Также и объект Selection имеет метод Range, который определяет диапазон, связанный с областью выделения, после чего можно работать с этим диапазоном, используя свойства и методы объекта Range. Перепишем наш пример, где использовался объект Range, задействовав объект Selection:

Первоначально объект Selection создается как результат вызова метода Select объекта Range. После этого можно работать с этим объектом. При изменении диапазона объекта Selection приходится работать не с параметрами Start и End, как это делается для объектов Range, а использовать специальные методы Move, часть из которых мы применили в нашем примере. Вот их краткое описание:

  • метод MoveLeft сжимает область выделения до точки и передвигает ее в начало диапазона. В примере точка вставки перемещается к началу первого абзаца;
  • метод Move сжимает область выделения до точки и передвигает ее в нужное место. В примере точка вставки перемещается на два абзаца;
  • метод MoveDown расширяет область выделения. Параметр Unit указывает единицы, в которых ведется отсчет при расширении области (у нас — в абзацах); параметр Count задает число этих единиц. Параметр Extend указывает, нужно ли расширение или перемещение области, сжатой в точку вставки.

^

Метод Select и свойство Selection

Рассматривая в приложении Word объект Range, мы видели, что он может быть получен как результат вызова метода Range объектов одних классов и свойства Range объектов других классов. Свойством Range обладают объекты более низких уровней иерархии — коллекции слов и ячеек, абзацы и строки. Считается, что в каждый такой объект вложен объект Range, задающий диапазон, связанный с объектом. При вызове свойства этот существующий объект возвращается, и с ним можно работать. У объектов верхнего уровня иерархии: Application, Windows — встроенного диапазона нет, но зато есть метод Range, позволяющий создать новый объект этого класса.

С объектом Selection ситуация аналогична. И здесь свойство Selection возвращает уже существующий объект, а метод Select позволяет создать новый объект. Но здесь ситуация двойственна — объекты, имеющие свойство Range, обладают методом Select и, наоборот, объекты верхнего уровня иерархии имеют свойство Selection. Объяснение очевидно: объект Selection существует в единственном экземпляре в каждом подокне, и поэтому объекты более низких уровней иерархии просто не могут иметь встроенное свойство Selection. Им могут обладать только объекты класса Pane (подокно), Windows и Application.

Рассмотрим синтаксис метода Select:

  • Sub Select()
  • Sub Select([Replace])

В первом случае создается новая область выделения — объект Selection, во втором — область выделения можно расширить или заменить в зависимости от значения параметра Replace. Заметьте: метод Select реализован не как функция, явно возвращающая результат, а как процедура (Sub), которая объекта Selection не возвращает. Создание этого объекта — результат побочного эффекта этой процедуры. Созданный объект связывается с объектами верхнего уровня иерархии: окном и приложением. Его можно получить, обратившись к глобальному свойству Selection. Но Вы не можете получить ссылку на этот объект, а, следовательно, не можете создать переменную этого класса, так, как это могли делать при работе с объектами класса Range (вспомните переменную MyRange из наших примеров). Это предохраняет нас от соблазна «обмануть систему» и иметь две переменные — два объекта Selection одновременно.

Типичный и правильный способ работы с объектом Selection таков:

  • Создается или выбирается объект, область которого должна быть выделена.
  • Для этого объекта вызывается метод Select, возвращающий в качестве результата объект Selection.
  • Проводится работа с объектом Selection в области выделения.
  • Если нужно перейти к новой области выделения, то либо область выделения перемещается (как в нашем примере), либо повторяются действия, начиная с первого пункта.

Рассмотрим пример, в котором пользователь переключается между двумя областями выделения

‘Переключение между двумя областями выделения документа

‘Создание двух областей

Dim myRange1 As Range

Dim myRange2 As Range

Dim Answer As Variant ‘ Выбор пользователя

‘Добавляем новый документ

‘Добавляем 7 абзацев в текст созданного документа

Объект selection

Небольшой список свойств и методов объекта выделения в некотором роде может ввести в заблуждение. Элементы, названые в этом списке,- это средства объекта selection, представленного в IE4+. В NN6 также используется объект selection, который не является частью W3C DОМ, поэтому в первых модификациях этого броузера не было предусмотрено создание подобного вида объектов. Далее рассматриваются основные способы управления объектом selection в NN6 независимо от того, когда он был впервые реализован. Но мы не будем детально рассматривать все свойства и методы этого объекта,

В броузере IЕ4+ объект selection представляет собой свойство объе кта docu ment, которое обеспечивает доступ сценария к любому тексту документа или средствам управления текстом, используемым сценарием или посетителями. Объект selection, состоящий из одного или более символов, всегда выделяется на странице; более того, только один объект selection может быть активным в текущее врсмя. Когда на странице посетителю дается указание выделить текст для выполнения определенного действия с ним, можно (и нужно) воспользоваться преимуществами, предоставляемыми объектом selection. Наиболее удобный случай применения объекта selection — с точки зрения обработки — это события onMouseUp. Это событие срабатывает после каждого отпускания кнопки мыши, при этом сценарий может анализировать объект document.selection на включение в него выделяемого текста (с помощью свойства type), С помощью метода createRange() можно преобразовать объект selection в объект TextRange. Затем для получения доступа к только что выделенному тексту области нужно воспользоваться свойством text. Такая последовательность действий может показаться достаточно сложной перед следующим шагом, однако объект selection (в броузере IE) не предоставляет возможности напрямую считывать или изменять выделенный текст. Если вы собираетесь выполнить действие с выделением, то, возможно, у вас не будет возможности сделать это сразу, щелкнув на кнопке или ссылке. В некоторых версиях броузеров и операционных систем щелчок на одном из элементов страницы автоматически приводит к отмене выделения текущего элемента или текста.

В броузере Navigator 4 с помощью метода document.getSelection() можно просматривать выделенный текст тела страницы, однако по сути, для этого броузера объекта selection не существует. Только в броузере NN6 сделана попытка исправить эту ситуацию. Метод document.getSelection() позволяет использовать броузер NN6 для косвенного получения копии выделения, подобной представляемой в IЕ (как описано выше): сначала создается область для выделения, а затем в эту область помещается необходимый текст.
Для отображения результатов текущего выделения, представленного объектом Selection, пользуйтесь методом window.getSelection() (как только он станет доступным в броузере NN6), Следует отметить, что отличие в выделениях броузеров IE и NN заключается в том, что объект selection в NN6 представляет текст только тела страницы, а не выделение внутри текстовых элементов управления. В броузере NN6 объект selection имеет представлен в дереве узла документа, при этом происходит определение начальной и конечной точек выделения. Когда посетитель медленно перемещает указатель мыши вдоль текста, узел, в котором начинается выделение, получаст статус анкерного, а узел, содержащий конечную точку выделения,- активного. Для выделения, проводимого двойным или тройным щелчком, направление между анкерным и активным узлами задается принимаемой по умолчанию системой письма (например, слева направо в русском языке). В большинстве случаев в броузере NN6 объект selection представляется так же, как и объект Range в модели W3C DOM, содержащий методы сжатия и расширения выделения. Однако в отличие от области, текст, сжимаемый с помощью объекта selection, выделяется на странице. Если ваши сценарии должны управлять узлами внутри выделения, то используйте метод getRangeAt() объекта selection, который возвращает объект Range, граничные точки которого совпадают с граничными точками выделения.

Объектно-ориентированная модель
NN 6 window.getSelection()
IE document.selection

Свойство type возвращает элемент Техt но только во время существования выделения на странице. В противном случае свойство возвращает значение none. Сценарий использует эту информацию дня определения существования выделения на странице:

if (document.selection.type == «Text») <
// процедура выделения
>

Компания Microsoft в своей документации обращает внимание на то, что это свойство иногда возвращает значение Control, однако рассмотрение этого связанного с режимом редактирования значения выходит за рамки данного справочника.

type NN n/a IE 4 DOM n/a
Только чтение
Пример:

if (document.selection.type == «Text»)

Возвращаемое значение:
1из двух постоянных значений (как строка): none | Text.
Значение по умолчанию: none

Удаляет содержание текущего выбора в документе. Для посетителя метод clear() выполняет такое же действие, как присвоение свойству TextRange.text пустой строки. Отличие между этими вышеупомянутыми способами заключается в том, что метод clear() можно использовать, не создавая текстовую область для выделения. После удаления выделения свойством selection.type возвращается значение None

Например, обработчик события в следующем тэге удаляет любой выбранный текст элемента P через две секунды после выбора:

clear( ) NN n/a IE 4 DOM n/a
Возвращаемое значение
None.
Параметры
None.

Чтобы создать текстовую область для пользовательского выделения в броузере IE, следует применять метод createRange() объекта selection, Я точно не знаю, почему метод для объекта selection называется createRange(), в то время как текстовые области для других действительных объектов создаются с помощью метода createTextRange(). Результатом работы обоих методов является окончательно обработанный объект TextRange.

После следующей инструкции:

var myRange = document.selection.createRange( )

сценарий сможет воздействовать на содержание выбранного текста.

Объекты Range и Selection

В иерархии Excel объект Range (диапазон) идет сразу после объекта worksheet. Объект Range является одним из ключевых объектов VBA. Объект Selection (выбор) возникает в VBA двояко — либо как результат работы метода Select, либо при вызове свойства selection. Тип получаемого объекта зависит от типа выделенного объекта. Чаще всего объект Selection принадлежит классу Range и при работе с ним можно использовать свойства и методы объекта Range. Интересной особенностью объектов Range и selection является то, что они не являются элементами никакого семейства объектов.

Адресация ячеек

При работе с объектом Range необходимо помнить, как в Excel ссылаются на ячейку рабочего листа. Имеются два способа ссылки на ячейки рабочего листа: относительная адресация (т. е. когда начало координат, задающее нумерацию строк и столбцов, связывается с объектом, вызвавшим Range) и абсолютная адресация.

Имя ячейки состоит из имени столбца (их 256 — А, В, . Z, АВ, . HZ, IA, . IV) и номера (1, . 16384).

Адресация задается индексом строки и индексом столбца. Например, R1C1, R2C3

Признаком абсолютной адресации является знак «$», предшествующий имени строки (абсолютной адресации на строку) или столбца (абсолютной адресации на столбец). Например, $А10, А$10 и $А$10 задают абсолютную адресацию на столбец А, строку 10 и ячейку А10 соответственно

Указывается смещение по отношению к активной ячейке. Смещение приводится в квадратных скобках, причем знак указывает на направление смещения. Например, если активной ячейкой является касз, то R[i]C[-1] дает ссылку на ячейку кзс2

Адресация ячейки рабочего листа является лишь частью полного адреса ячейки, который в общем случае включает имя рабочего листа и адрес книги. При задании полного адреса за именем листа следует знак «!», а адрес книги заключается в скобки. Например,

В первой строке данного примера дана относительная ссылка на ячейку AI активного рабочего листа, во второй — на ячейку AI рабочего листа листа активной книги, а в третьей на ячейку AI рабочего листа лист2 книги моякнига-xls текущего рабочего каталога.

Задание групп строк и столбцов с помощью объекта Range

Если в диапазоне указываются только имена столбцов или строк, то объект Range задает диапазон, состоящий из указанных столбцов или строк. Например, Range («А: с») задает диапазон, состоящий из столбцов А, в и с, а Range <"2: 2") - из второй строки. Другим способом работы со строками и столбцами являются методы ROWS (строки) и Columns (столбцы), возвращающие коллекции строк и столбцов. Например, столбцом А является columns (1), а второй строкой - ROWS (2).

Связь объекта Range и свойства Cells

Так как ячейка является частным случаем диапазона, состоящим только из единственной ячейки, объект Range также позволяет работать с ней. Объект cells (ячейки) — это альтернативный способ работы с ячейкой. Например, ячейка А2 как объект описывается Range («A2») или cells (1,2). В свою очередь объект ceils, вкладываясь в Range, также позволяет записывать диапа зон в альтернативном виде, который иногда удобен для работы, а именно,

Range («А2:C3») И Range(Cells(1,2), Cells(3,3))

Определяют один и тот же диапазон.

Свойства и методы объекта Range

Объект Range позволяет сочетать гибкость VBA и мощь рабочего листа Excel. Более 400 встроенных функций рабочего листа существенно упрощают и делают более наглядным программирование на VBA.


Далее приводятся наиболее часто используемые свойства и методы объекта

Перечислим основные свойства объекта Range.

Возвращает значение из ячейки или в ячейки диапазона. В данном примере переменной х присваивается значение из ячейки C1 :

х = Range («C1») .Value В следующем примере в диапазон AI : В2 введена 1 :

Range («A1:B2») .Value = 1

Возвращает имя диапазона. В данном примере диапазону А1:В2 присваивается имя итоги:

Range ( «Al :B2») .Name = «Итоги»

Возвращает число объектов в наборе. В данном примере переменной х присваивается значение, равное числу строк диапазона AI : В2 :

х = Range ( «Al :B2») .Rows . Count

Возвращает число строк текущего диапазона. Текущим является диапазон, ограниченный пустыми строками и столбцами и содержащий данный элемент. В следующем примере переменной у присваивается значение, равное числу строк в текущем диапазоне, содержащем ячейку AI :

у = Range ( «Al» ). CurrentRegion. Rows . Count

Позволяет переносить текст при вводе в диапазон. Допустимые значения True и False. В следующем примере в ячейку В2 вводится текст длинный текст и в этой ; ячейке устанавливается режим ввода текста с переносом: With Range («B2») .Value = «Длинный текст» .WrapText = True End With

Возвращает столбец и строку соответственно. В данном примере очищается содержимое строки и выделяется столбец с активной ячейкой:

ActiveCell . EntireRow. Clear ActiveCell .EntireColumn. Select

Возвращает ширину столбцов и высоту строк диапазона соответственно

Возвращает объект comment (примечание), который связан с левым верхним углом диапазона при отображении на экране. Объект comment является элементом семейства comments. Метод AddComment, примененный к диапазону, создает новое примечание. Среди методов объекта comment отметим только метод Text, который задает текст, выводимый в примечании. Синтаксис:

Text (Text, Start, Overwrite)

.Text Text:= «Чрезвычайно важно!» & Chr(10) & «Про это никак нельзя забыть ! «

.Visible = True End With

Рис. 2.1. Пример отображения примечания на рабочем листе

Возвращает объект Font (шрифт). Объект Font имеет следующие свойства:

Объект Word.Application

Лекция 10. Тема: Методы и свойства объектов Microsoft Word.

Общая структура объектов Word выглядит так, как показано на рис. 10.1.

На практике для решения большинства программных задач достаточно знать всего лишь пять объектов (с сопутствующими коллекциями):

 объект Document (с коллекцией Documents);

 объект Bookmark (с коллекцией Bookmarks).

Рис. 10.1. Главные объекты Word

Как работать с объектом Application

Объект Application — это само приложение Microsoft Word. Все остальные объекты Word «вложены» в него. Создать этот объект — значит, запустить Word на вашем компьютере. Как правило, это нам и необходимо (если мы создаем документ в формате Word из другого приложения, например из Access). Но не забудьте — если вы запускаете Word из другого приложения Office, то необходимо добавить в ваш проект ссылку на библиотеку Microsoft Word 11.0 Object Library.

Код запуска Word очень прост:

Dim oWord As New Word.Application

Однако, выполнив его из другого приложения, вы, скорее всего, даже не заметите, что у вас чтото произошло. Причины просты:

1. По умолчанию Word запускается в скрытом окне.

2. Если в нем не открыт ни один документ, он тут же закрывается (после того, как завершается создавшая его процедура).

Сделать Word видимым очень просто:

Однако может возникнуть вопрос: а нужно ли его делать видимым? Некоторые разработчики утверждают, что не нужно. Пусть Word работает в скрытом окне, создавая требуемый документ. Когда пользователю потребуется, он этот документ откроет. Если вы работаете с Word в скрытом окне, не забудьте после выполнения необходимых действий его закрыть (иначе он так и останется в оперативной памяти, видимый только через Task Manager). Для закрытия Word нужно вызвать его метод Quit().

Чтобы Word не закрывался сам собой, в нем достаточно создать новый документ. Подробно об этом будет рассказано в следующем разделе, но самый простой вариант создания нового документа Word выглядит так:

Dim oWord As New Word.Application

Если Word уже был открыт на компьютере, то можно получить на него ссылку, например, при помощи такого кода:

Set oWord = GetObject(, «Word.Application»)

Однако на практике, кроме очень специальных случаев (активизация объектов OLE), такой подход по сравнению с открытием нового экземпляра Word ничего не дает. Наоборот, появляется дополнительный риск нечаянно испортить открытый в существующем экземпляре созданный пользователем документ или закрыть его без сохранения пользовательских документов. Поэтому лучше создавать новый экземпляр Word.

Если же ваш код VBA выполняется в Word (т. е. Word уже запущен), объект Application создавать не надо. В этой ситуации он будет автоматически доступен в любой момент (чтобы в этом убедиться, достаточно впечатать в окне редактора кода Application и добавить точку). Более того, если не указано, к какому объекту относится то или иное свойство или метод, компилятор VBA в Word автоматически считает, что это свойство или метод принадлежит объекту Application. Поэтому следующие два фрагмента кода функционально одинаковые:

Application.Selection.TypeText «Мой текст»

Selection.TypeText «Мой текст»

Еще один важный момент, который связан с объектом Application в Word. Для него предусмотрено большое количество удобных в использовании событий (открытие документа, выход из Word, щелчок правой кнопкой мыши, изменение документа, печать документа, сохранение документа и т. п.) Однако по умолчанию все эти события не видны. Чтобы они появились, необходимо в разделе Declarations кода формы (а не модуля!) объявить объект Application с ключевым словом WithEvents, например так:

Public WithEvents App As Word.Application

В списке объектов у вас появится новый объект App (т. е. Application), для которого можно выбрать события и добавлять код в событийные процедуры точно так же, как мы это делали для формы и элементов управления.

10.2. Свойства, методы и события объекта Application

Далее приведены самые важные свойства, методы и события объекта Application.

 ActiveDocument — возвращает объект активного документа в данном экземпляре Word. Это свойство используется очень активно, обычно без упоминания объекта Application, например:

Свойство доступно только для чтения, поэтому чтобы сделать какойнибудь документ активным, придется вызывать для его объекта метод Activate().

 CapsLock — позволяет проверить, включен ли режим CapsLock на клавиатуре. Изменить этот режим при помощи данного свойства нельзя (только для чтения), для этого есть другие средства (связанные с использованием Windows API). Аналогично работает свойство NumLock.

 Caption — позволяет заменить текст «Microsoft Word» в заголовке окна на другой, например «Мое приложение».

 CheckLanguage — возвращает True, если Word определяет в автоматическом режиме язык, на котором производится ввод текста. Если в системе установлено несколько языков ввода, то по умолчанию автоматическая проверка установлена. При помощи этого свойства можно изменить режим работы Word.

 CustomizationContext — свойство, которое позволяет указать шаблон или документ, на который будут распространяться внесенные вами изменения в меню, панели инструментов и клавиатурные комбинации. Например, код:

говорит о том, что все изменения, которые вы будете вносить, начиная с этого момента, будут сохраняться в шаблоне Normal.dot (и, таким образом, будут применяться ко всем документам).

 Dialogs — возвращает коллекцию Dialogs, представляющую из себя все возможные диалоговые окна Word. При помощи этой «ветви» объектной модели Word вы можете открыть любое из сотен диалоговых окон Word и определить действия, которые будут предприняты при выборе пользователем тех или иных параметров в данном диалоговом окне. К сожалению, эта «ветвь» очень плохо документирована, и при использовании объектов диалоговых окон приходится заниматься самостоятельными исследованиями (при помощи макрорекордера и окна Locals), чтобы определить нужные свойства и их значения. По моему опыту, обычно бывает проще создать свою форму VBA, которая будет выполнять необходимые действия, чем заниматься такой исследовательской работой. Пример использования диалогового окна открытия файла может выглядеть так:

Dim oDlg As Dialog

Set oDlg = Application.Dialogs(wdDialogFileOpen)

If oDlg.Display = -1 Then

MsgBox «Вы выбрали файл: » & _

Appliction.Options.DefaultFilePath _ (wdCurrentFolderPath) & «\» & oDlg.Name

Для диалоговых окон, которые предназначены для работы с файлами, в объекте Application предусмотрено отдельное свойство FileDialog, возвращающее одноименный объект.


 DefaultSaveFormat — определяет формат сохранения файлов Word по умолчанию (тот, который будет предлагаться пользователь в диалоговом окне Save As). Можно настроить на сохранение в формате обычного текста TXT, текста Unicode, RTF и т. п.

 DisplayAlerts — очень важное свойство. Оно позволяет подавить вывод ошибок и диалоговых окон при работе макросов и приложений VBA. Во многих ситуациях без него не обойтись. Особенно часто прибегать к этому свойству требуется, когда в ходе работы программы необходимо что-нибудь удалить или закрыть без сохранения.

 DisplayAutoCompleteTips — включает или отключает подсказки для автозавершения текста. Чаще всего необходимо отключить.

 Documents — самое важное свойство. Возвращает коллекцию документов.

 FeatureInstall — еще одно свойство, которое позволяет не раздражать пользователя попытками Office доустановить еще не установленные компоненты. Для этого нужно установить это свойство в значение msoFeatureInstallNone.

 FileDialog — возвращает объект FileDialog, т. е. окно выбора файла, каталога, открытия файла или сохранения. Для открытия этого окна необходимо воспользоваться методом Show() этого объекта.

 FileSearch — возвращает объект FileSearch, который может использоваться для поиска файлов по определенным параметрам.

 International — еще одно очень важное свойство. Возвращает информацию о текущих региональных настройках даты, времени, валюты, отображения чисел, локализации версии Word и т. п.

 IsObjectValid — очень удобное свойство для всевозможных проверок (открыт ли документ, находится ли указатель в таблице и т. п.). Проверяет, существует ли еще объект, к которому мы хотим обратиться. Позволяет уберечь от ошибок, когда, например, документ или объект в документе был удален пользователем.

 KeyBindings — очень удобное во многих ситуациях свойство. Оно возвращает коллекцию KeyBindings — привязок клавиатурных комбинаций. Проще говоря, при помощи этого объекта и его подобъектов вы можете назначить любую команду Word или любой макрос любому сочетанию клавиш (в том числе и тем, которые уже заняты служебными командами, например + ). Общая последовательность действий при этом выглядит так:

• определяем свойство CustomizationContext объекта Application, т. е. где будут сохраняться наши изменения: в шаблоне Normal.dot, в текущем документе или в шаблоне, прикрепленном к текущему документу;

• при помощи метода Application.BuildKeyCode() определяем цифровой код для нашей клавиатурной комбинации;

• при помощи метода KeyBindings.Add() добавляем новое назначение, при этом определяем все необходимые параметры.

Application.KeyBindings.Add wdKeyCategoryMacro, _

«Normal.NewMacros.DataLoad», BuildKeyCode(wdKeyAlt, wdKeyD)

 Language — еще одно свойство, которое позволяет определить, установлена ли на компьютере пользователя локализованная версия Word (точнее, это свойство определяет язык пользовательского интерфейса). Для русского языка будет возвращаться значение 1049, для английского — 1033. Более подробную информацию (о языке помощи, языке программы установки и т. п.) можно получить при помощи свойства LanguageSettings.

 MacroContainer — очень полезное свойство для программистов. Позволяет в ходе выполнения макроса определить, откуда был запущен текущий программный код (обычно проверяются два варианта — Normal.dot или текущий документ).

 NewDocument — одна из возможностей создать новый документ Word. Возвращает объект NewDocument. Для создания нового документа используется метод Application.NewDocument.Add().

 NormalTemplate — это свойство позволяет получить ссылку на объект Template, представляющий Normal.dot, для внесения в него изменений.

 Option — возвращает объект Option с огромным количеством свойств. Через этот объект программным способом можно настроить значения на всех вкладках окна Параметры (меню Сервис | Параметры).

 Path — возвращает путь к программным файлам Word на диске.

 PrintPreview — с помощью этого свойства можно перейти в режим предварительного просмотра текущего документа или проверить, находимся ли мы в этом режиме. Очень удобно для показа документа пользователю или для реализации своей процедуры печати.

 Selection — еще одно важнейшее свойство. Возвращает объект Selection — то место, в котором находится указатель вставки.

 ShowStartupDialog — определяет, показывать или нет Task Panel (панель задач в правой части документа) при запуске Word. Чаще всего используется для отключения показа. Есть еще несколько свойств с префиксом Show. значения которых очевидны.

 SpecialMode — позволяет проверить, не находится ли Word в специальном режиме копирования и вставки (для перехода в этот режим нужно выделить текст и нажать или + , а потом переместить курсор и нажать ).

 StatusBar — еще одно очень полезное свойство. Позволяет вывести текст в Status Bar (строка состояния), т. е. в строке в нижней части окна приложения, где выводится информация о страницах, столбцах, языке, режимах работы и т. п.

 System — возвращает одноименный объект System, предназначенный для получения информации из операционной системы (региональный настройки, тип курсора мыши, разрешение экрана, тип процессора и т. п.). Позволяет также подключать сетевые диски и запускать приложение Microsoft System Information.

 Tasks — возвращает одноименную коллекцию Tasks с объектами Task, представляющими все работающие в системе процессы. При помощи этих объектов можно программным способом найти работающее в системе приложение и чтонибудь с ним сделать (сделать видимым или невидимым, активизировать, закрыть, передать в его окно сообщение Windows, как при работе с Windows API и т. п.). Опытные разработчики активно используют этот набор объектов для работы с внешними приложениями. Запускать внешние приложения лучше всего при помощи специального объекта Shell.

 UserControl — очень важное свойство (оно есть и в Excel). Это свойство позволяет определить, как именно был запущен Word — пользователем вручную или программным образом. На основе этого можно, например, сделать вывод, нужно ли его программным образом закрывать.

 Visible — позволяет спрятать окно Microsoft Word очень качественно — Word исчезает и c рабочего стола, и из панели задач.

 Windows — возвращает информацию об одноименной коллекции Windows, содержащей объекты Window. Эти объекты представляют окна документов Word.

 WindowsState — позволяет свернуть, развернуть или восстановить окно Word.

10.3. Методы объекта Application.

Самые важные методы объекта Application приведены далее.

 Activate() — просто активизирует окно Word с текущим документом. Обычно нужно активизировать определенный документ, поэтому этот метод используется для объекта Document.

 CheckGrammar() и CheckSpelling() — позволяют проверить грамматику и орфографию для передаваемых символьных значений. Чаще всего используются аналогичные методы для объектов Document и Range.

 CleanString() — очень полезный метод. Позволяет «чистить» передаваемое символьное значение (полученное, например, от объектов Selection или Range) от специальных символов Word и превращает их в обычный текст, как будто он был набран в блокноте.

 GoBack() — этот метод обеспечивает переход на последнее место редактирования в документе. Word сохраняет с документом три последние точки редактирования, так что открыть последний документ в Word и перейти на точку, где вы остановились, можно очень просто:

 GoForward() — обеспечивает переход вперед по точкам сохранения.

 KeyBoard() — очень полезный метод. Позволяет программным способом переключать раскладку клавиатуры в Word, уберегая таким образом пользователей от ошибок. Переключение на русский язык выглядит так:

а на английский:

Если этому методу ничего не передавать, он вернет текущую раскладку клавиатуры.

 KeyString() — метод, обратный BuildKeyCode(). Если BuildKeyCode() возвращает уникальный идентификатор клавиатурной комбинации, то этот метод возвращает клавиатурную комбинацию для данного уникального идентификатора.

 ListCommands() — метод, не похожий на другие. Он создает новый документ и выводит в нем в виде таблицы справочник по методам и клавиатурным комбинациям Word, как стандартным, так и назначенным вами.

 OnTime() — очень интересный метод. Он позволяет выполнить макрос Word либо в указанное вами время, либо по прошествии какого-то времени. В Word одновременно может работать только один таймер. При помощи этого метода можно выполнять ресурсоемкие операции в автоматическом режиме.

 OrganizerCopy() — еще один полезный метод. Позволяет скопировать макрос, панель инструментов, запись автотекста или стиль из одного документа в другой. Для удаления и переименования этих элементов предусмотрены методы OrganizerDelete() и OrganizerRename().

 PrintOut() — метод, который принимает огромное количество параметров (все необязательные) и позволяет вывести на печать весь документ или его часть. Может использоваться для объектов Application, Document и Window.

 Quit() — метод, который используется, видимо, чаще всех. Позволяет закрыть Word с сохранением или без сохранения документов.

 Repeat() — просто повторяет последнюю выполненную команду указанное вами количество раз.

 ResetIgnoreAll() — снять метку со всех фрагментов текста, помеченных как «без проверки» в ходе проверки орфографии.

 Run() — еще один очень важный метод. Позволяет запустить процедуру/макрос из открытого шаблона или документа с передачей параметров.

 ScreenRefresh() — обновляет окно приложения. Обычно используется после того, как автоматическое обновление было отключено при помощи свойства ScreenUpdating.

 ShowClipboard() — отображает панель буфера обмена Word (если вы работаете с несколькими буферами).

Остальные методы относятся к работе протокола DDE, преобразованию различных единиц измерений и т. п.

У объекта Application есть множество событий: открытие, закрытие, сохранение и печать документа, щелчки мышью, активизация, выход из приложения и т. п. Единственное, что следует еще раз отметить — события объекта Application по умолчанию не отображаются в редакторе Visual Basic. Чтобы они появились, в раздел Declarations нужно поместить следующую строку кода:

Public WithEvents App As Word.Application

В этом случае в списке объектов в окне редактора кода для форм появится объект App со всеми необходимыми событиями.

10.4. Коллекция Documents и объекты Document

Как работать с коллекцией Documents

На одну ступень ниже объекта Application в объектной модели Word (и по логике использования в приложениях) находятся коллекция Documents и объекты Document, из которых она состоит. При программировании в Word без них обычно не обойтись.

Чаще всего в программах нам нужно:

1. Запустить Word.

2. Создать или открыть документ.

3. Что-то с этим документом сделать (например, впечатать в нужные места этого документа значения, полученные из базы данных или от пользователя).


Запуск Word производится при помощи объекта Application, с которым вы уже знакомы. Для выполнения различных действий с документом используются объекты Selection, Range и Bookmark. А вот второй пункт — создание или открытие документа, проверка, открыт уже документ или нет, сохранение документа и т. п. — реализуется при помощи коллекции Documents и объекта Document.

Самый простой вариант создания документа выглядит так:

Dim oDoc As Word.Document

Set oDoc = Application.Documents.Add()

При этом мы создали обычный пустой документ (на основе шаблона Normal.dot) и получили ссылку на него в объектную переменную oDoc. Далее в документ можно программно вводить нужную нам информацию.

Однако создавать пустой документ и формировать все его содержимое удобно лишь тогда, когда документ очень простой. Попробуйте программно создать какойнибудь документ посложнее, например, объявление на взнос наличными или большой договор. Возможно, у вас это получится, но работы придется выполнить очень много. Намного проще набрать и оформить сложный документ обычным способом, как простой документ Word, и оставить в нем пустые места для заполнения из программы. Проще всего это сделать при помощи шаблона Word.

Например, в нашей ситуации нам вначале нужно набрать текст договора, оставив пустые места для изменяемых данных, и сохранить его с расширением dot (предположим, что он сохранен на диске C: с именем dog_blank.dot). Тогда создать документ на основе этого шаблона можно так:

Dim oDoc As Word.Document

Set oDoc = Application.Documents.Add_ («C:\dog_blank.dot»)

А далее при помощи объектов Bookmark и Range вводим текст в оставленные пустые места.

Часто возникает потребность программным способом не создавать новый документ, а открыть уже имеющийся и что-то сделать с ним. Открыть документ проще всего при помощи метода Open() коллекции Documents. Самый простой вариант применения этого метода выглядит так:

Dim oDoc1 As Word.Document

Set oDoc1 = Documents.Open(«c:\doc1.doc»)

Если документ уже открыт, то по умолчанию просто создается ссылка на этот открытый документ, вместо открытия его заново.

Важная (и неочевидная) особенность метода Open() заключается в том, что при его использовании во время открытия файла не открывается диалоговое окно Предупреждение системы безопасности, в котором пользователь может отключить макросы. За счет этого разработчик может гарантировать работоспособность своего приложения или реализовать систему защиты — от печати, доступа к разным функциям и т. п.

Сохранять документы лучше при помощи методов Save() и SaveAs() объекта Document. В коллекции Documents есть также свой метод Save(), который позволяет сохранить сразу все открытые документы Word, но обычно это менее удобно.

Заметим, что из Word можно открывать не только документы Word разных версий, но и документы десятков других различных форматов, про которые знает Word — TXT, HTML, XML и т. п. Сохранять файлы также можно в одном из десятков встроенных форматов или использовать свой собственный пользовательский формат (при помощи объекта FileConvertor). За счет этого программным образом при помощи макросов можно очень удобно преобразовывать большое количество документов, которые могут находиться, например, в разных каталогах на файловых серверах, или в общих папках Exchange Server, или в базе данных SharePoint Portal Server. Для прохода по дереву каталогов удобнее всего использовать объект FileSystemObject из библиотеки Microsoft Scripting Runtime, которая есть на любом компьютере Windows.

Свойства и методы коллекции Documents

Коллекция Documents, как уже говорилось ранее, представляет все документы Word, открытые в настоящий момент. Нумерация документов в коллекции начинается с 1. Из свойств этой коллекции интерес может представлять только свойство Count — количество открытых документов. Гораздо важнее методы коллекции Documents. Про некоторые из них мы уже говорили в предыдущем разделе, но здесь для справки приведем информацию о них еще раз.

 Add() — этот метод позволяет создать и сразу же открыть новый документ (и вернуть ссылку на его объект). Это наиболее распространенный способ создания новых документов в Word. Полный синтаксис этого метода выглядит как:

Add(Template, NewTemplate, DocumentType, Visible)

Здесь Template — это шаблон для создания нового документа, NewTemplate (True/False) — делать ли новый документ шаблоном, DocumentType — тип документа, может принимать значения: wdNewBlankDocument, wdNewEmail-Message, wdNewFrameset или wdNewWebPage (по умолчанию новый чистый документ), Visible — будет ли новый документ видимым (по умолчанию) или невидимым. Все эти параметры являются необязательными. Если не указать ни один из них, будет просто создан новый документ на основе шаблона Normal.dot (как будто вы создали новый документ при помощи меню Файл | Создать).

 Open() — еще один важнейший метод коллекции Documents. Позволяет открыть документ с диска и добавить его в коллекцию. Этот метод принимает множество параметров, из которых обязательным является только один — имя документа (вместе с путем к нему). Самый простой вариант применения этого метода выглядит так:

Dim oDoc1 As Document

Set oDoc1 = Documents.Open(«c:\doc1.doc»)

 Item() — позволяет найти нужный документ в коллекции по его индексу. Обычно для получения ссылки на нужный документ используется конструкция For. Next с проверкой значения какоголибо свойства документа через If. Then. Чаще всего это свойство — Name:

Dim oDoc1 As Word.Document

For i = 1 To Documents.Count

Set oDoc1 = Documents.Item(i)

If oDoc1.Name = «doc1.doc» Then

Set oDoc1 = Nothing

Этот код возвращает ссылку в виде переменной oDoc1 на документ doc1.doc, если он есть в коллекции. Если его нет, то во избежание ошибок нужно реализовывать дополнительные проверки. На практике можно было бы перед сравнением привести имя документа в нижний регистр, если учитывать регистр букв при поиске вам не нужно.

Через метод Item() можно получить доступ к объекту документа напрямую. Например, в этом примере мы получаем имя первого документа в коллекции Documents:

 Save() и Close() — позволяют соответственно сохранить или закрыть все документы в коллекции.

 CanCheckOut() (можно ли «забрать» документ в монопольный доступ) и CheckOut() (забрать документ в монопольный доступ) — эти методы можно применять, если документ находится в документной библиотеке в базе данных SharePoint Portal Server.

10.5. Свойства и методы объекта Document

После того, как мы при помощи объекта Application запустили Word, при помощи коллекции Documents создали (или открыли, или нашли среди уже открытых) нужный нам документ, можно выполнять с этим документом различные действия, реализованные при помощи свойств, методов и событий объекта Document. У этого объекта десятки свойств и методов, и здесь мы рассмотрим только наиболее важные и часто используемые.

Обратите внимание, что к объекту Document можно обращаться и не создавая специальную объектную переменную. Существует еще, по крайней мере, три способа получения доступа к объекту Document:

 работать с документом как с элементом коллекции Documents. Формат обращения может выглядеть, например, как Documents.Item(1);

 использовать специальное ключевое слово ThisDocument. При помощи него можно получить ссылку на объект документа, которому принадлежит исполняемый программный модуль, например:

 использовать свойство ActiveDocument объекта Application. Это свойство возвращает нам объект активного документа:

Самые важные свойства объекта Document представлены далее.

 ActiveWritingStyle — текущий активный стиль (заголовок определенного уровня, обычный текст, гиперссылка и т. п.). Рекомендуется проверять это свойство перед вводом текста.

 Background — возвращает объект Shape, представляющий фоновый рисунок (фоновые рисунки видны только в режиме Web-документ).

 BuiltInDocumentProperties — позволяет получить ссылку на коллекцию DocumentProperties с одноименными объектами, представляющими встроенные свойства документа (название, автор, категория, комментарии и т. п.);

 Characters — возвращает коллекцию объектов Range, каждый из которых представляет один символ. Это свойство есть не только у объекта Document, но и у объектов Selection и Range. Может использоваться, например, для выполнения операция поиска и замены или статистических подсчетов (например, если переводчику платят за количество символов);

 Content — свойство, возвращающее объект Range, представляющий собой главную цепочку документа (main document story). Если говорить проще, то это просто текст документа, без колонтитулов, сносок, комментариев и т. п.

 CustomDocumentsProperty — свойство, возвращающее коллекцию объектов DocumentProperties, представляющих пользовательские свойства документа. Можно использовать для сохранения вместе с документом любых значений переменных. Очень удобно, например, для подсчета количества открытий документа, флажков печатался/не печатался, сколько раз вызывалась та или иная функция, на каких компьютерах и каким пользователем открывался и т. п.

 Fields — позволяет получить ссылку на коллекцию Fields одноименных объектов. Это свойство очень полезно при работе с полями. Поле в Word — это место в документе, отведенное для подстановки изменяемых данных: формул, даты, информации об авторе, размере документа и т. п. При работе с документом Word средствами обычного графического интерфейса добавить новое поле можно при помощи меню Вставка | Поле.

 Footnotes — возвращает коллекцию сносок.

 Свойства с префиксом Formatting. — определяют, что показывать в списке стилей панели инструментов Форматирование.

 FormFields — аналогично Fields, но в этом случае возвращается ссылка на поля в формах.

 FullName — возвращает полное имя объекта (вместе с путем к нему в файловой системе или Web). Доступно только для чтения.

 GrammarChecked — помечает весь документ, как проверенный с точки зрения грамматики (фактически отключает проверку грамматики для данного документа). Такое же свойство существует и у объекта Range. Коллекцию ошибок, выловленных при проверке грамматики, можно получить при помощи свойства GrammaticalErrors, а выделить ошибки зеленым волнистым подчеркиванием (если этого не сделано) — при помощи свойства ShowGrammaticalErrors. Для орфографических ошибок существуют аналогичные свойства SpellingChecked, SpellingErrors и ShowSpellingErrors.

 HasPassword — проверяет, назначен ли пароль для указанного документа. Другое свойство Password назначает пароль. По причине крайней слабости защиты пароли в Word, Excel и Access использовать не рекомендуется.

 Indexes — возвращает коллекцию индексов (т. е. предметных указателей) для документа.

 Name — имя документа (без пути к нему).

 OpenEncoding — возвращает кодовую страницу, которая использовалась для открытия документа. Для русского языка по умолчанию это 1251.

 PageSetup — позволяет получить ссылку на одноименный объект. Используется в основном при реализации печати.

 Paragraphs — возвращает ссылку на коллекцию абзацев в данном документе.

 Path — возвращает путь к документу в файловой системе (без имени). Это свойство может пригодиться, чтобы создать еще один файл в том же каталоге.

 Saved — очень важное свойство. Позволяет определить, изменялся ли документ со времени последнего сохранения.

 SaveEncoding — позволяет явно указать (или получить) кодировку, которая будет использоваться при сохранении документа.

 SaveFormat — позволяет получить информацию о формате документа (DOC, RTF, TXT, HTML и т. п.). Доступно только для чтения.


 Sections — возвращает коллекцию разделов документа. Sentences — то же самое для предложений. Аналогично работают свойства Shapes, Styles, Subdocuments, Tables, Windows и Words.

 Type — возвращает тип документа (обычный, шаблон или Web-страница с фреймами).

 Variables — еще одно очень удобное свойство. Можно использовать для сохранения своих служебных данных вместе с документом, как и пользовательские атрибуты (custom attributes), но, в отличие от пользовательских атрибутов документа, пользователям эти свойства не будут видны.

Теперь рассмотрим самые важные методы объекта Document.

 Activate() — этот метод позволяет сделать указанный вами документ активным (например, для ввода текста).

 AddToFavorities() — позволяет добавить ссылку на документ в каталог Избранное. Может быть полезным, если пользователь будет работать с этим документом постоянно.

 CheckSpelling() и CheckGrammar() — запускают проверку орфографии и грамматики соответственно.

 Close() — закрывает документ. Можно закрыть с сохранением (по умолчанию), а можно без (если указать соответствующий параметр).

 Compare() — сравнивает документ с другим и генерирует редакторские пометки в местах, где обнаружены различия.

 DetectLanguage() — определяет язык текста. Проверка производится по предложениям, на основе сверки слов со встроенными словарями. Такая проверка производится автоматически во время ввода текста или при открытии нового документа. Чтобы заново провести проверку языков, свойство LanguageDetected нужно перевести в False.

 FitToPages() — очень интересный метод. Размер шрифта автоматически меняется таким образом, чтобы текст стал занимать на одну страницу меньше. Можно использовать для устранения «висячих страниц» и других проблем верстки.

 FollowHyperlink() — открывает указанный вами документ в соответствующем приложении (если HTML, то в Internet Explorer).

 GoTo() — очень мощный метод. Для объектов Document и Range он возвращает объект Range, для объекта Selection — просто перемещает указатель ввода текста на нужное место. Возвращаемые объекты в зависимости от параметров, которые были переданы этому методу, могут указывать на начало страницы, на определенные строки, закладки, комментарии, таблицы, секции, поля, ссылки, формулы и т. п. Может переходить на определенный номер такого элемента в документе, первый, последний, следующий и т. п. Очень удобно использовать для установки указателя в нужное место для автоматического ввода текста.

 Merge() — позволяет произвести слияние двух документов. Метод очень сложный и мощный, основывается на применении редакторских пометок.

 PresentIt() — открывает данный документ в PowerPoint.

 PrintOut() — очень сложный метод, который позволяет вывести на печать весь документ или его часть.

 PrintPreview() — переводит документ в режим предварительного просмотра.

 Protect() — ограничивает внесения изменений в документ при помощи пароля или нового средства управления правами на доступ к данным, которое называется IRM. Те же возможности на графическом экране доступны через меню Файл | Разрешения.

 Range() — очень важный метод. Возвращает объект Range, принимает в качестве параметров номер начального символа диапазона и номер конечного символа.

 Redo() — повторяет последнее действие. В качестве параметра принимает количество последних действий, возвращает True, если повтор был произведен успешно.

 Repaginate() — выполняет переразбивку документа на страницы. Обычно используется, если автоматическая разбивка была ранее отключена (например, на вкладке Общие диалогового окна Параметры (меню Сервис | Параметры) или программно при помощи объекта Options).

 Save() — смысл этого метода очевиден. Если документ ранее не сохранялся, открывается диалоговое окно Сохранить как.

 SaveAs() — очень мощный и сложный метод. Можно определить путь для сохраняемого документа, его формат, кодировку, пароли на открытие и изменение документа, вставку шрифтов и многое другое. Очень удобно использовать, например, для автоматической конвертации документов.

 Select() — позволяет просто выделить весь документ. Этот метод существует для очень большого количества объектов, в том числе для Selection и Range.

 TransformDocument() — исключительно мощный метод, но только для программистов, которые хорошо разбираются в XML и XSLT. Позволяет применить к документу таблицу преобразований стилей (Extensible Stylesheet Language Transformation, XSLT), при помощи которой можно поменять все, что угодно.

 Undo() — отменяет определенное количество последних действий. По синтаксису и принципам работы — полный аналог метода Redo().

 UndoClear() — очищает буфер отмены изменений, чтобы пользователь не смог откатить произведенные действия.

 UnProtect() — снимает защиту с документа (определенную методом Protect() или в графическом интерфейсе). Может быть очень полезным перед программным внесением изменений в защищенный документ.

Часто используемых событий у объекта Document всего три: New (можно определить только для шаблона, срабатывает, когда на основе этого шаблона создается новый документ), Open и Close. Все эти события очевидны и изначально доступны в окне редактора кода Visual Basic.

10.6. Материал для самостоятельного изучения.

Свойства объекта Word.Application.

 ActivePrinter — позволяет получить или настроить активный принтер в ходе работы программы. Также используется очень активно, например, если результаты работы вашего приложения необходимо печатать на определенном сетевом принтере. Свойство доступно как для чтения, так и для записи.

 AutomationSecurity — определяет уровень безопасности при программном открытии файлов. По умолчанию установлено значение msoAutomationSecurityLow — открывать с включенными макросами. Можно также использовать значения msoAutomationSecurityForceDisable (отключить макросы) и msoAutomationSecurityByUI (то, что настроено на графическом интерфейсе).

 BackgroundPrintingStatus — определяет, сколько заданий Word стоит в очереди на печать.

 Browser — свойство, которое возвращает объект Browser (малозаметный набор из трех кнопок, который прячется под вертикальной полосой прокрутки). С программной точки зрения интересно его свойство Target, которое может принимать одно из 12 значений (комментарий, сноска, таблица, рисунок, заголовок, страница и т. п.). Затем при помощи методов Next() и Previous() для этого объекта мы можем перемещаться между этими элементами.

 Build — возвращает версию и номер сборки Word. Очень полезно для проверки на совместимость, если ваше приложение работает только под определенными версиями Word.

 COMAdIns — позволяет получить ссылку на коллекцию загруженных COM Addins — встраиваемых в Word приложений, построенных по технологии COM. Очень удобно использовать перед обращением к данному встраиваемому приложению.

 EmailOptions — возвращает очень сложный и насыщенный свойствами объект EmailOptions, который используется для настройки Word как редактора почтовых сообщений Outlook.

 EnableCancelKey — это свойство определяет, сможет ли пользователь прервать выполнение любого макроса при нажатии клавиш +
. Если установить для этого свойства значение wdCancelDisabled, то это приведет к тому, что макрос, вошедший в бесконечный цикл, можно будет закрыть только вместе с Word — через Task Manager.

 StartUpPath — предоставляет возможность просмотреть/определить путь к каталогу автозапуска. Те шаблоны и встраиваемые приложения, которые находятся в этом каталоге, Word при запуске открывает автоматически. По умолчанию каталог автозапуска находится в профиле пользователя. Путь к нему выглядит как \application data\Microsoft\Word\startup.

 UserInitials и UserName — позволяет получить или определить информацию об инициалах или имени пользователя. Инициалы используются в исправлениях, а имя пользователя — в свойствах документа.

 VBE — это свойство возвращает недокументированный, но очень интересный объект VBE, представляющий редактор Visual Basic. Обычно используется для программного внесения изменений в проекты VBA, например, добавление ссылок.

 Version — свойство возвращает версию Word (менее подробную, чем свойство Build). Для Word 2003 значение этого свойства равно 11.0.

Методы объекта Application.

 BuildKeyCode() — позволяет узнать уникальный номер для клавиатурной комбинации в Word. Пример использования этого метода был приведен ранее при рассмотрении свойства Application.KeyBindings.

 ChangeFileOpenDirectory() — этот метод позволяет изменить каталог, который по умолчанию открывает Word при работе с документами (по умолчанию задан, конечно, каталог Мои документы);

 DefaultWebOptions() — возвращает одноименный объект, при помощи которого можно определить множество свойств, используемых при сохранении документа Word в формате HTML (кодировка, работа с изображениями, CSS, с какими браузерами обеспечивать совместимость и т. п.).

Объект Document, основные свойства и методы.

 AttachedTemplate — предоставляет возможность подключить шаблон (со всеми макросами, стилями, записями автотекста и т. п.) или проверить, какой шаблон подключен (вручную это можно сделать через меню Сервис | Шаблоны и надстройки).

 DefaultTabStop — определяет отступ по умолчанию при использовании символа табуляции. По умолчанию задано 35 пунктов, что равно примерно 1,25 см.

 DisableFeatures — отключает возможности, которые понимают только последние версии Word (для совместимости с пользователями, у которых на компьютерах стоят старые версии). Обычно само свойство DisableFeatures просто включает такой режим, а конкретный уровень совместимости задается при помощи свойства DisableFeaturesIntroducedAfter.

 DoNotEmbedSystemFonts — позволяет не вставлять в документ системные шрифты (по умолчанию вставляются для русского, японского и других языков с набором символов, отличным от латиницы). Позволяет сократить размер документа, но тогда пользователи в системе, где не установлен русский язык, не смогут прочесть этот документ.

 EmbedTrueTypeFonts — очень полезное свойство, если вы работаете с документом в месте, где используются экзотические шрифты (например, в издательстве). Вставка шрифтов truetype гарантирует, что получатели документа будут видеть его точно таким же, как и создатель.

 Envelope — позволяет получить ссылку на специальный объект Envelope, который используется для создания почтовых конвертов.

 Permission — позволяет получить доступ к объекту Permission, который управляет системой внутренних разрешений документа Word (но не разрешений файловой системы).

 PrintRevisions — определяет печатать или нет пометки редактора (исправления) вместе с документом. По умолчанию — печатать.

 ProtectionType — проверяет защиту данного документа (разрешено все, или только комментарии, чтение, изменения в полях форм и т. п.). Сама защита устанавливается при помощи метода Protect().

 ReadOnly — определяет, можно ли вносить изменения в документ или он доступен только для чтения. Это свойство само доступно только для чтения, поскольку соответствующий атрибут устанавливается в файловой системе.

 RemoveDateAndTime и RemovePersonalInformation — удаляют информацию о дате и времени произведенных изменений и всю информацию о пользователе из документа (включая свойства документа). Могут быть полезными при создании файлаобразца.

Не нашли то, что искали? Воспользуйтесь поиском:

Лучшие изречения: Да какие ж вы математики, если запаролиться нормально не можете. 8427 — | 7331 — или читать все.

Объект selection

Internet Explorer 4.0x использует объект document.selection который включает в себя свойства и некоторые методы для управления выделениями. Объект selection предоставляет информацию о тексте и элементах, которые пользователь выделил с помощью мыши. Это может быть очень полезно, если вы хотите произвести некоторые действия, основанные на том, что выделил пользователь.

Свойство type объекта selection определяет тип выделения. Это строка, доступная только для чтения, которая может принимать одно из следующих значений:


createRange( ) NN n/a IE 4 DOM n/a
Значение Описание
None Нет выделения или точки вставки.
Text Выделен только текст.
Control Выделены структуры управления.

Значение по умолчанию, естественно, «None» — когда нет выделения. Поэтому, сравнение значения document.selection.type с «None» в Internet Explorer 4.0x, равносильно сравнению значения возвращенного методом document.getSelection() с «» в Navigator 4.0x

Объект selection имеет следующие методы:

Метод Описание
clear() Очищает содержимое текущего выделения.
empty() Снимает текущее выделение.
createRange() Создает объект TextRange для текущего выделения.

Рассмотрим следующее выражение:

Если вы вставить это выражение в скрипт, то браузер будет удалять все выделения. Другими словами, когда пользователь выделяет часть документа, браузер немедленно удаляет его. Если выделение содержит не текстовые элементы, то они будут удалены тоже. Соответственно, страница с новым содержимым будет перерисована. Обратите внимание, что метод clear() описан как clear (не clear()), потому что обработчику события должна быть присвоена ссылка на функцию (а не вызов функции). Имейте ввиду, что этот скрипт не работает в Navigator 4.0x, так как пользуется преимуществом объекта selection.

Метод empty() просто снимает текущее выделение. Замечательно, но бесполезно использовать этот метод, для создания страницы, с невозможностью выделения.

Это выражение указывает браузеру снимать любое выделение, существующее на странице. Другими словами, оно снимает подсветку с выделения. Имейте ввиду, что метод empty() помимо всего прокручивает рабочее окно в самый верх страницы. Поэтому, приведенное выражение скроллирует рабочее окно к верху страницы, всегда, когда вы отпускаете кнопку мыши.

Метод createRange() очень просто. Он возвращает объект TextRange для текущего выделения. Вот пример:

Range, TextRange и Selection

Многим JavaScript-разработчикам приходилось сталкиваться с объектами, перечисленными в заголовке, например, при решении следующих задач:
— создание визуальных редакторов (wysiwyg),
— поиск в окне браузера,
— выставление BB-кода,
и т.д.

В этой статье автором предпринята попытка собрать перевод документации об этих объектах в одном месте + написать небольшие сопроводительные примеры. Перевод вольный, не дословный, так что если встретите неточность или корявую формулировку — пишите в комментариях.

В целом пост носит справочный характер, и, надеюсь, кому-то упростит разработку.

1. Range

Range — это объект, соответствующий фрагменту документа, который может включать узлы и участки текста из этого документа. Наиболее подробно о Range-объектах изложено в DOM Range.

Чтобы понять о чем речь, обратимся к самому простому случаю Range-объектов, который будет подробно рассмотрен ниже, — к выделениям. В приводимом ниже примере выделите несколько слов в предложении. Тем самым вы будете создавать объекты, похожие на Range. В нашем примере мы получим текстовое содержимое выделяемой вами области.

Но такие области можно создавать не только с помощью пользовательского выделения, но и из JavaScript-сценария, выполняя с ними определенные манипуляции. Однако, написать простой иллюстрирующий код сразу не выйдет, т.к. есть одно НО — Internet Explorer. В Micsosoft создали собственную реализацию — объект TextRange. Разберем каждую реализацию по-отдельности.

1.1 DOM-реализация Range

Range состоит из двух граничных точек (boundary-points), соответствующих началу и концу области. Позиция любой граничной точки определяется в документе с помощью двух свойств: узел (node) и смещение (offset). Контейнером (container) называют узел, содержащий граничную точку. Сам контейнер и все его предки называются родительскими контейнерами (ancestor containers) для граничной точки. Родительский контейнер, включающий обе граничные точки, называют рут-контейнером (root container).

На изображении выше граничные точки выделения лежат в текстовых узлах (#text1 и #text2), которые являются контейнерами. Для левой границы родительскими контейнерами являются #text1, H1, BODY, для правой — #text2, P, BODY. Общий родитель для обоих граничных точек — BODY, этот элемент является рут-контейнером.

Если контейнер является текстовым узлом, то смещение определяется в символах от начала ноды. Если контейнер является элементом (Document, DocumentFragment, Element. ), то смещение определяется в дочерних узлах.

Смотрим на иллюстрацию (источник):

Граничные точки Range-объекта s1 лежат в текстовых узлах, поэтому смещение задается в символах от начала узла. Для s2 граничные точки расставлены так, что включают весь абзац

, поэтому контейнером является элемент BODY, и смещение считается в позициях дочерних узлов.

Range-объекты создаются с помощью метода creareRange, который вызывается в контексте рут-контейнера или документа. Объект при этом создается пустой, и граничные точки задаются методами setStart и setEnd объекта. Смотрим пример:

div id =»ex2″ >
h2 > Соз|даем Range-объекта h2 >
p > От третье|го символа заголовка до десятого символа это абзаца. p >
div >

$domRange = <
create : function () <
// Найдем root-контейнер
var root = document .getElementBy >’ex2′ );
// Найдем контейнеры граничных точек (в данном случае тестовые)
var start = root.getElementsByTagName( ‘h2’ )[0].firstChild;
var end = root.getElementsByTagName( ‘p’ )[0].firstChild;
if ( root.createRange ) <
// Создаем Range
var rng = root.createRange();
// Задаем верхнюю граничную точку, передав контейнер и смещение
rng.setStart( start, 3 );
// Аналогично для нижней границы
rng.setEnd( end, 10 );
// Теперь мы можем вернуть текст, который содержится в полученной области
return rng.toString();
> else
return ‘Вероятно, у вас Internet Explorer, смотрите реализацию TextRange ниже’ ;
>
>

Рассмотрим вкратце свойства и методы Range:

  • Свойство commonAncestorContainer вернет ссылку на наиболее вложенный рут-контейнер.
  • Свойство startContainer (endContainer) вернет ссылку на контейнер верхней (нижней) граничной точки.
  • Свойство startOffset (endOffset) вернет смещение для верхней (нижней) граничной точки.
  • Свойство collapsed вернет true, если граничные точки имеют одинаковые контейнеры и смещение (false в противном случае).

  • Метод setStart (setEnd) задает контейнер (ссылка на узел) и смещение (целочисленное значение) для соот-их граничных точек. Пример выше.
  • Методы setStartBefore, setStartAfter, setEndBefore, setEndAfter принимают в качестве единственного аргумента ссылку на узел и устанавливают граничные точки в соот-ии с естественной границей переданного узла. Например:
    span id =»s1″ > First span >
    span id =»s2″ > Second span >
    var rng = document .createRange();
    // Установит верхнюю граничную точку по левой границе спана #s1
    rng.setStartBefore( document .getElementBy >’s1′ ) );
    // Установит нижнюю граничную точку по правой границе спана #s2
    rng.setEndAfter( document .getElementBy >’s2′ ) );
  • Методы selectNode и selectNodeContents позволяют создать Range-объект по границам узла, ссылку на который они принимают в качестве единственного аргумента. При использовании selectNode передаваемый узел также войдет в Range, в то время как selectNodeContents создаст объект только из содержимого узла:
  • Метод collapse объединяет граничные точки Range-объекта. В качестве единственного аргумента принимает булево значение (true &mdash для объединения в верхней точке, false &mdash в нижней). По-умолчанию true.
  • Метод toString вернет текстовое содержимое Range-объекта.
  • Метод cloneContents вернет копию содержимого Range-объекта в виде фрагмента документа.
  • Метод cloneRange вернет копию самого Range-объекта.
  • Метод deleteContents удаляет всё содержимое Range-объекта.
  • Метод detach извлекает текущий объект из DOM, так что на него больше нельзя сослаться.
  • Метод insertNode принимает в качестве единственного аргумента ссылку на узел (или фрагмент документа) и всталяет его в содержимое Range-объекта в начальной точке.
  • Метод extractContents вырезает содержимое Range-объекта и возвращает ссылку на полученный фрагмент документа.
  • Метод surroundContents помещает всё содержимое текущего Range-объекта в новый родительский элемент, ссылка на который принимается в качестве единственного аргумента.
  • Метод compareBoundaryPoints используется для сравнения граничных точек.

Чтобы отвлечься и закрепить знания, решим небольшую задачку. Найдем в текстовом узле фразу и подсветим её синим фоном.

div id =»ex3″ >
Найдем в этом тексте слово «бабуля» и подсветим его синим фоном
div >

$domRange.highlight = function ( text ) <
// Получим текстовый узел
var root = document .getElementBy >’ex3′ ).firstChild;
// и его содержимое
var content = root.nodeValue;
// Проверим есть ли совпадения с переданным текстом
if ( content.indexOf( text ) != -1 ) <
if ( document .createRange ) <
// Если есть совпадение, и браузер поддерживает Range, создаем объект
var rng = document .createRange();
// Ставим верхнюю границу по индексу совпадения,
rng.setStart( root, content.indexOf( text ) );
// а нижнюю по индексу + длина текста
rng.setEnd( root, content.indexOf( text ) + text.length );
// Создаем спан с синим фоном
var highlightDiv = document .createElement( ‘span’ );
highlightDiv.style.backgroundColor = ‘blue’ ;
// Обернем наш Range в спан
rng.surroundContents( highlightDiv );
> else
alert( ‘Вероятно, у вас Internet Explorer, смотрите реализацию TextRange ниже’ );
> else
alert( ‘Совпадений не найдено’ );
>

С остальными свойствами и методами поэкспериментируйте сами.
Перейдем к реализации range в MSIE.

1.2. TextRange

Объект TextRange в реализации MSIE — это текстовый диапазон нулевой и более длины. У данного диапазона также есть свои границы, «перемещать» которые можно на целое число текстовых едениц: character(символ), word (слово), sentence (предложение). То есть можно взять и сдвинуть границу на 2(5, 8 и т.д.) слова (символа, предложения) вправо (влево). При этом у объекта сохраняются данные о HTML-содержимом диапазона и есть методы взаимодействия с DOM.

Объект TextRange создается с помощью метода createTextRange, который можно вызывать в контексте следующих DOM-элементов:

BODY, BUTTON, INPUT type=button, INPUT type=h >

Простой пример с кнопкой:

input id =»buttonId» type =»button» value =»Test button» />

$ieTextRange = <
create : function () <
// Найдем кнопку
var button = document .getElementBy >’buttonId’ );
// Если мы в ИЕ
if ( button.createTextRange && button.createTextRange() != undefined ) <
// Создаем TextRange
var rng = button.createTextRange();
// И вернем текстовое содержимое полученного объекта
return rng.text;
> else
return ‘Вероятно, у вас не IE (поздравляем!), смотрите реализацию Range выше’ ;
>
>

Рассмотрим свойства и методы объекта TextRange (не все, только самые необходимые):

  • Свойство boundingWidth (boundingHeight) вернет ширину (высоту), которую занимает объект TextRange в пикселях.
  • Свойство boundingTop (boundingLeft) вернет Y(X)-координату верхнего левого угла тестовой области относительно окна документа.
  • Свойство htmlText вернет HTML-содержимое объекта.
  • Свойство text вернет текстовое содержимое объекта (см. пример выше).
  • Свойство offsetTop (offsetLeft) вернет Y(X)-координату верхнего левого угла тестовой области относительно предка.

  • Метод collapse объединяет граничные точки диапазона. В качестве единственного аргумента принимает булево значение (true &mdash для объединения в верхней точке, false &mdash в нижней). По-умолчанию true.
  • Метод duplicate клонирует имеющийся текстовый диапазон, возвращая новый, точно такой же.
  • Метод expand расширяет текущий тектовый диапазон до еденицы текста, переданной в качестве единственного текстового аргумента:
    ‘character’ — символ
    ‘word’ — слово
    ‘sentence’ — предложение
    ‘textedit’ — сворачивает до первоначального диапазона.
    Вернет true (false) в случае успеха (неудачи).
  • Метод findText ищет в диапазоне совпадения с текстовой строкой, передаваемой в качестве первого аргумента (без учета регистра). Если совпадение найдено, то границы диапазона сворачиваются до него. В качестве второго (необязательного) аргумента можно передать целое число, указывающее число символов от верхней точки, в которых нужно производить поиск. Далее в качестве аргументов можно перечислять INT-флаги, которые вам вряд ли понадобятся.
  • Метод getBookmark возвращает в случае успешного вызова строку, по которой можно будет восстановить текущее состояние текстового диапазона с помощью метода moveToBookmark.
  • Метод inRange принимает в качестве аргумента другой TextRange-объект и проверяет, входит ли его текстовый диапазон в диапазон контекстного объекта. Возвращает булево значение.
  • Метод isEqual проверяет является ли текущий TextRange-объект идентичным переданному в качестве аргумента. Возвращает булево значение.
  • Метод move(sUnit [, iCount]) сворачивает текущий диапазон до нулевой длины и передвигает на еденицу текста, переданного в качестве первого аргумента (character | word | sentence | textedit). В качестве второго (необязательного) аргумента можно передать число едениц, на которое следует передвинуть диапазон.
  • Метод moveEnd (moveStart), аналогично методу move, передвигает верхнюю (нижнюю) границу диапазона на еденицу текста, число которых также можно задать необязательным вторым параметром.
  • Метод moveToElementText принимает в качестве аргумента ссылку на DOM-элемент и выставляет границы диапазона TextRange-объекта по границам полученного элемента.
  • Метод moveToPoint принимает в качестве двух обязательных аргументов X и Y-координаты (в пикселях) относительно верхнего левого угла документа и переносит границы диапазона туда.
  • Метод parentElement вернет ссылку на элемент, который полностью содержит диапазон TextRange-объекта (или null).
  • Метод pasteHTML заменяет HTML-содержимое текущего текстового диапазона на строку, переданную в качестве единственного аргумента.
  • Метод select формирует выделение на основе содержимого TextRange-объекта, о чем мы подробнее поговорим ниже.
  • Метод setEndPoint принимает в качестве обязательных аргументов текстовый указатель и ссылку на другой TextRange-объект, устанавливая в зависимости от значения указателя границы диапазона. Указатели могут быть следующими: ‘StartToEnd’, ‘StartToStart’, ‘EndToStart’, ‘EndToEnd’.

Также к TextRange-объектам применимы команды метода execCommand.

Для закрепления решим задачку по поиску текстового содержимого, аналогичную той, что была выше:

div id =»ex4″ >
Найдем в этом тексте слово «бабуля» и подсветим его синим фоном
div >

$ieTextRange.highlight = function ( text ) <
// Получим ссылку на элемент, в котором будет происходить поиск
var root = document .getElementBy >’ex4′ );
// Получим значение его текстового потомка
var content = root.firstChild.nodeValue;
// Если есть совпадение
if ( content.indexOf( text ) != -1 ) <
// и мы в MSIE
if ( document .body.createTextRange ) <
// Создадим объект TextRange
var rng = document .body.createTextRange();
// Свернем его до root
rng.moveToElementText( root );
// Найдем текст и свернем диапазон до него
if ( rng.findText( text ) )
// Заменим текстовый фрагмент на span с синим фоном
rng.pasteHTML( ‘ ‘ + text + ‘ ‘ );
> else
alert( ‘Вероятно, у вас не IE (поздравляем!), смотрите реализацию Range выше’ );
> else
alert( ‘Совпадений не найдено’ );
>

С остальными свойствами и методами поэкспериментируйте сами.

2. Selection

Всем знакомо выделение элементов на странице, когда, зажав левую кнопку мыши и передвигая курсор, мы выделяем нужный фрагмент. Или зажимаем Shift и жмем на стрелочки клавиатуры. Или еще как-то, неважно. В данной части статьи мы кроссбраузерно научимся решать две задачи: получать пользовательское выделение и устанавливать собственное.

2.1. Получаем пользовательское выделение

Эту задачу мы уже решали в самом начале статьи в примере с миксом. Теперь рассмотрим код:

$selection = <
getText : function () <
var txt = » ;
if (txt = window.getSelection) // Not IE, используем метод getSelection
txt = window.getSelection().toString();
else // IE, используем объект selection
txt = document .selection.createRange().text;
return txt;
>
>

Все браузеры, кроме Internet Explorer поддерживают метод getSelection в контексте window, который возвращает объект, схожий с рассмотренным ранее Range. У этого объекта есть точка начала выделения (anchor) и фокусная точка окончания (focus). Точки могут совпадать. Рассмотрим свойства и методы Selection-объекта:

  • Свойство anchorNode вернет контейнер, в котором начинается выделение. Замечу, что началом выделения считается та граница, от которой вы начали выделение. То есть, если вы выделяете справа налево, то началом будет именно правая граница. Это правило работает везде, кроме браузера Opera, в котором anchorNode вернет ссылку на узел левого края выделения.
  • Свойство anchorOffset вернет смещение для начала выделения в пределах контейнера anchorNode.
  • Свойства focusNode и focusOffset работают аналогично для фокусных точек, то есть точек окончания выделения. Opera и здесь отличилась, возвращает вместо фокусной точки узел правого края выделения.
  • Свойство rangeCount возвращает число Range-объектов, которые входят в полученное выделение. Это свойство полезно при использовании метода addRange.

  • Метод getRangeAt принимает в качестве аргумента индекс Range-объекта и возвращает сам объект. Если rangeCount == 1, то работать будет только getRangeAt(0). Таким образом, мы можем получить Range-объект, полностью соответствующий текущему выделению.
  • Метод collapse сворачивает выделение в точку (каретку). Методу можно передать в качестве первого аргумента узел, в который нужно поместить каретку.
  • Метод extend принимает в качестве аргументов ссылку на контейнер и смещение (parentNode, offset), и перемещает фокусную точку в это положение.
  • Метод collapseToStart (collapseToEnd) перемещает фокусную (начальную) границу к начальной (фокусной), тем самым сворачивая выделение в каретку.
  • Метод selectAllChildren принимает в качестве единственного аргумента ссылку на узел и добавляет всех его потомков в выделение.
  • Метод addRange принимает в качестве аргумента Range-объект и добавляет его в выделение. Таким образом можно увеличить количество Range-объектов, число которых нам подскажет свойство rangeCount.
  • Метод removeRange (removeAllRanges) удаляет переданный (все) Range-объект из выделения.
  • Метод toString вернет текстовое содержимое выделения.

Internet Explorer предоставляет собственный интерфейс взаимодействия с выделениями — объект selection в контексте document. Для работы с этим объектом используются следующие методы

  • Метод clear убирает выделение вместе с содержимым.
  • Метод createRange (ВАЖНО! Не путать с DOM-методом createRange для создания Range-объектов!) создает из содержимого выделения TextRange-объект.
  • Метод empty убирает выделение, но оставляет содержимое.

Надеюсь, теперь, после знакомства с обеими реализациями выделений, код выше стал более понятен.

2.1. Установка собственного выделения

Допустим, вам хочется, чтобы какой-то текстовый фрагмент на странице был выделен, как пользовательское выделение. Это нужно при клиентской реализации поиска по странице и некоторых других задач. Проще всего решить эту задачу следующим образом:

  1. Создать Range-объект (TextRange для IE).
  2. Перевести полученный объект в выделение.

Смотрим реализацию:

div id =»ex5″ >
Снова будем выделять span > бабулю span > , на этот раз без поиска.
div >

$selection.set = function () <
var target = document .getElementBy >’ex5′ ).getElementsByTagName( ‘span’ )[0];
var rng, sel;
if ( document .createRange ) <
rng = document .createRange();
rng.selectNode( target )
sel = window.getSelection();
sel.removeAllRanges();
sel.addRange( rng );
> else <
var rng = document .body.createTextRange();
rng.moveToElementText( target );
rng.select();
>
>

3. Послесловие

Осмысливая в процессе написания статьи предоставляемое API, возникла идея создать небольшую библиотеку, которая научит IE DOM-реализации Range и Selection. Возможно, она даже существует, тогда автор вам будет благодарен за ссылку и экономию собственного времени.

Описание API не претендует на полноту и точность перевода, но автору этого вполне достаточно для комфортной JavaScript-разработки. С оригиналами на английском вы можете ознакомиться по ссылкам ниже.

Илон Маск рекомендует:  Atof, atoi, atol преобразовать в плавающее
Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL