Тверской государственный университет
Опубликован: 13.09.2006 | Доступ: свободный | Студентов: 3490 / 369 | Оценка: 4.65 / 4.29 | Длительность: 30:37:00
Специальности: Программист, Менеджер
Лекция 2:

Начнем с объектов Office 2000

Объекты 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:

Public Sub WorkWithSelection()
Dim myr As Range
Dim i As Byte
'Добавляем новый документ
Documents.Add
With ActiveDocument
'Добавляем 7 абзацев в текст созданного документа
    For i = 1 To 7
        .Paragraphs.Last.Range.Text = "Абзац " & i
        .Paragraphs.Add
    Next i
'Используется свойство Range
    Set myr = .Paragraphs(1).Range
'Выделен первый абзац. Создаем объект Selection
    myr.Select
'Действия с объектом Selection
'Стягивание в начало абзаца - точку вставки
    Selection.MoveLeft
'Расширение на один абзац вправо, снова выделяя первый абзац
    Selection.MoveDown Unit:=wdParagraph, Count:=1, Extend:=wdExtend
'Передвинемся к началу третьего абзаца
    Selection.Move Unit:=wdParagraph, Count:=2
'Три абзаца с третьего по пятый выделяются курсивом
    Selection.MoveDown Unit:=wdParagraph, Count:=3, Extend:=wdExtend
    Selection.Font.Italic = True
End With
End Sub
1.8.

Первоначально объект 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 в области выделения.
  • Если нужно перейти к новой области выделения, то либо область выделения перемещается (как в нашем примере), либо повторяются действия, начиная с первого пункта.

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

Sub WorkWithTwoReg()
'Переключение между двумя областями выделения документа
'Создание двух областей
Dim myRange1 As Range
Dim myRange2 As Range
Dim i As Byte
Dim Answer As Variant ' Выбор пользователя
'Добавляем новый документ
Documents.Add
With ActiveDocument
'Добавляем 7 абзацев в текст созданного документа
    For i = 1 To 7
        .Paragraphs.Last.Range.Text = "Абзац " & i
        .Paragraphs.Add
    Next i
    Set myRange1 = .Range(Start:=.Paragraphs(2).Range.Start, _
        End:=.Paragraphs(3).Range.End)
    
    Set myRange2 = .Range(Start:=.Paragraphs(6).Range.Start, _
        End:=.Paragraphs(7).Range.End)
    Answer = InputBox(prompt:=" Выберите область выделения (1/2)", _
            Default:=1)
    If Answer = 1 Then
        myRange1.Select
        'Макрос ItInSel работает с первой выделенной областью
        ItInSel
    Else
        myRange2.Select
        'Макрос ItInSel работает со второй выделенной областью
        ItInSel
    End If
End With

End Sub
1.9.

В этом макросе почти все применяемые средства хорошо знакомы. До сих пор мы не пользовались только стандартным для Visual Basic методом InputBox, который открывает диалоговое окно, позволяющее принять ввод пользователя. Заметьте, что работу в выделенной области осуществляет процедура ItInSel. Ее можно было сделать довольно сложной, но мы ограничились одним оператором:

Public Sub ItInSel()
Selection.Font.Italic = True
End Sub

Анализируя этот макрос, обратите внимание на два обстоятельства:

  • Если мы хотим постоянно работать с некоторыми областями, имеет смысл создать соответствующие им объекты. "Хранителями" областей выступают объекты класса Range В нашем примере это переменные myRange1 и myRange2. Объекты Selection появляются в последнюю минуту, когда область нужно выделить и начать с ней работать.
  • Работа с объектом Selection может быть предпочтительнее, так как явные ссылки заменяются косвенными. Это позволяет создать процедуру, не зависимую от области. Подобную ситуацию демонстрирует вызов процедуры ItInSel.

Активные объекты и метод Activate

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

Метод Activate делает активным элемент, его вызвавший. Этим методом обладают элементы верхних уровней иерархии: Application, Window, Pane, Document, WorkBook, Worksheet, Chart и др. В приложениях Word и PowerPoint эти объекты обладают также булевым свойством Active, имеющим статус "только для чтения". При активизации объекта свойство Active получает значение True, при деактивации - False. Значение свойства позволяет понять, в каком состоянии находится тот или иной объект этих приложений.

Чтобы обратиться к выделенному объекту, достаточно иметь одно глобальное свойство Selection, поскольку в каждый текущий момент существует только один выделенный элемент. Активных элементов одновременно существует несколько, по одному в каждом классе. Поэтому для обращения к активному элементу надо указывать его класс. Поэтому для каждого класса имеется свое глобальное свойство. Чтобы обратиться к активному элементу некоторого класса Z, нужно вызвать соответствующее глобальное свойство ActiveZ, например ActiveDocument или ActiveWindow. В наших примерах мы неоднократно уже использовали обращение к активному документу - ActiveDocument. Рассмотрим еще один пример, в котором пользователь в приложении Excel выбирает рабочий лист. В зависимости от его выбора активизируется указанный лист, и в двух первых ячейках появляется приветствие, текст которого также зависит от выбора пользователя:

Public Sub Actis()
Dim Answer As Integer
Answer = InputBox(Prompt:="Выберите номер страницы для Вашей работы(1/2/3)", _ Default:=1)
'Активизирует рабочий лист, выбранный пользователем
ActiveWorkbook.Sheets(Answer).Activate
'Работа с активным листом
ActiveSheet.Cells(1, 1) = "Привет,"
Select Case Answer
Case 1: ActiveSheet.Cells(1, 2) = "Михаил!"
Case 2: ActiveSheet.Cells(1, 2) = "Владимир!"
Case Else: ActiveSheet.Cells(1, 2) = "Люди!"
End Select
End Sub

На этом мы заканчиваем первое знакомство с общеупотребительными объектами Office 2000. В заключение мы хотим рассказать уже не о каких-либо конкретных объектах, а об удивительном программном средстве, позволяющем работать с ними. Речь пойдет о Macrorecorder.

полина есенкова
полина есенкова
Дмитрий Вологжин
Дмитрий Вологжин
Добрый день, прошел тесты с 1 по 9, 10 не сдал, стал читать лекцию и всё пройденные тесты с 1 по 9 сбросились, когда захотел пересдать 10 тест.