Общность и схожесть объектов Office 2000
Я не буду останавливаться на подробном описании среды Редактора, отмечу только еще раз схожесть интерфейса при создании HTML-проекта и VBA-проекта. В левом окне Project Explorer - Обозревателя Проектов показана структура HTML-проекта. В правом окне кода показан HTML-код страницы. Окно открыто на вкладке "Source". Следующая вкладка "Quick View" позволяет осуществить быстрый просмотр страницы, увидев ее так, как она будет видна в браузере Internet Explorer. На рисунке можно увидеть и часть Script-кода, добавленного мной в проект.
Какой же код я добавил в HTML-проект, чтобы заработало традиционное приветствие? Прежде всего, я добавил тег <Script> с описанием функции Hello. Этот тег был вставлен в конец заголовка проекта непосредственно перед закрывающим тегом <Head>. Вот этот текст:
<script id="Hello" language="VBScript"> <!-- Function Hello() Dim Answer Answer = InputBox("Enter Your Name, please") MsgBox ("Hi " & Answer & "!") UserName.innerText = "Hello, " & Answer &"!" End Function --> </script>Листинг 5.6.
Я задал также атрибут "onload" тега <body> и добавил тег <div>, для которого установил значение id, равное "UserName". Тег <div> (от division - раздел) задает местоположение раздела, в который программным путем я запишу имя, введенное пользователем.
Приведу полный код, начиная с открывающего и кончая закрывающим тегом <body>. Большая часть этого кода сформирована автоматически.
<body lang=EN-US style='tab-interval:36.0pt' onload="Hello()"> <div class=Section1> <h3><span lang=RU>Документ, содержащий </span><span style='mso-ansi-language: EN-US'>Script</span><span lang=RU> код.<o:p></o:p></span></h3> </div> <div id=UserName> <!-- Сюда вставляется имя, введенное пользователем --> </div> </body>Листинг 5.7.
Учитывая, что не все знакомы с языками HTML и VBScript, приведу подробные комментарии.
- Замечу, прежде всего, что я, как и многие авторы, пишущие о языке HTML, допустил некоторую терминологическую вольность. Когда я говорил, что мною добавлен тег Script, то фактически речь шла об элементе Script языка HTML. Как и большинство других элементов языка HTML, элемент Script состоит из открывающего и закрывающего тега Script и внутреннего HTML-текста. Для элемента Script внутренний HTML-текст задает Script-код, который может служить описанием функций, а может и непосредственно исполняться.
- Открывающий тег Script содержит два атрибута - id и language. Для них заданы соответственно значения "Hello" и "VBScript". Выше я отмечал, что значение атрибута id, позволяет идентифицировать объект Script в соответствующей коллекции Scripts. Значение "VBScript" атрибута language указывает браузеру, что код написан на языке VBScript, альтернативой могло бы быть значение "JavaScript".
- Script-код, содержащий описание функции Hello, закомментирован, - находится в теле тега комментария, начинающегося символами "<!--" и заканчивающегося последовательностью "-->". Браузер Internet Explorer понимает такой код и принимает его к исполнению. Другие же браузеры, не умеющие выполнять код VBScript как, например, Netscape Navigator, воспримут этот текст, как комментарий.
- Заметьте, описание функции Hello на VBScript за исключением последней строчки было бы приемлемым и для функции, написанной на VBA. Здесь вызываются известные встроенные функции InputBox и MsgBox, позволяющие организовать диалог с пользователем - запросить у него имя и затем открыть окно с приветствием пользователя, используя введенное имя. Заметьте также, что тип переменной Answer при объявлении не указан.
Несмотря на то, что ценность объявления переменной, когда не указан ее тип, безусловно, снижена, я рекомендую при программировании на VBScript всегда объявлять переменные, по возможности, задавая их тип в комментариях.
- Последняя строчка описания функции Hello специфична для VBScript, поскольку в ней используется объект Web-страницы. Каждый тег, расположенный на Web-странице, рассматривается как объект. Зная его id, с ним можно работать. Я уже ввел тег <div>, задал его id, а в функции Hello программным путем формирую его внутренний текст, зная имя, введенное пользователем.
- Задание значения "Hello" для атрибута "onload" тега <body> означает, что в момент загрузки документа будет вызываться функция "Hello", которая и организует нужный диалог с пользователем. Здесь используется типичная обработка события, обработчик события Load вызывает функцию Hello. Вот как выглядит открытие этого документа в Internet Explorer:
Я не буду приводить окно приветствия, открываемое функцией MsgBox, - оно выглядит стандартным образом, но все-таки приведу окончательный вид Web-страницы после программного добавления текста в тег <div>:
Побочным результатом моей работы в Редакторе VBScript является появление у документа объекта Script и, соответственно, непустой коллекции объектов Scripts, так что появилась возможность программной работы с этими объектами. В окне отладки я провел несколько экспериментов, анализируя некоторые свойства этих объектов. Вот эти результаты:
? ActiveDocument.Scripts.Count 1 ? ActiveDocument.Scripts(1).Id Hello ? ActiveDocument.Scripts(1).Language 2 ? ActiveDocument.Scripts(1).Location 1 ? ActiveDocument.Scripts(1).ScriptText <!-- Function Hello() Dim Answer Answer = InputBox("Enter Your Name, please") MsgBox ("Hi " & Answer & "!") UserName.innerText = "Hello, " & Answer &"!" End Function -->Листинг 5.8.
Единственный элемент коллекции Scripts - объект Script появился в момент создания в Редакторе соответствующего элемента HTML. Свойства объекта полностью отражают свойства этого элемента. Свойство Location, например, указывает, что элемент Script расположен в заголовочной части Web-страницы, - принадлежит тегу <Head>, а не <Body>. Значения некоторых свойств можно менять программно. В частности, программно можно изменить сам Script-код. Вот, функция, добавляющая еще одну строку в тело функции "Hello":
Public Sub ChangeProperties() 'Изменение свойств объекта Script Dim Txt1 As String, Txt2 As String Dim Ind As Integer Dim TxtAdd As String 'Добавляемая строка кода TxtAdd = "MsgBox (""Bye-Bye "" & Answer & ""!"")" _ & vbCrLf & vbTab With ActiveDocument.Scripts("Hello") Txt1 = .ScriptText 'Добавление строки кода в текст функции Ind = VBA.InStrRev(Txt1, "End Function") Txt2 = VBA.Left(Txt1, Ind - 1) & TxtAdd _ & VBA.Right(Txt1, VBA.Len(Txt1) - Ind + 1) .ScriptText = Txt2 ' Нельзя программно изменить значение свойства Location '.Location = 2 End With 'Обновление проекта после сделанных изменений ActiveDocument.HTMLProject.RefreshProject End SubЛистинг 5.9.
В процедуре читается Script-код объекта Script, затем этот код модифицируется программным путем и измененное значение присваивается вновь объекту, что меняет его поведение. Обратите внимание, после введения изменений вызывается метод RefreshProject объекта HTMLProject, сохраняющий в проекте сделанные изменения.
Эта процедура демонстрирует один из возможных способов "программирования на лету". Другой способ использует уже упоминавшийся метод Add, которым обладает коллекция Scripts. Я не буду углубляться в детали описания и использования объектов Script и HTMLProject, надеясь, что этих обзорных сведений достаточно, чтобы понять суть этих объектов и их возможности. В заключение скажу только, что работа с объектами Script возможна только в приложениях Word, Excel и Power Point.
Языковые предпочтения и шрифты Web-страниц
Нововведения в Office 2000 полезны разработчикам, использующим разные языки. Одно из таких замечательных качеств - возможность изменять язык интерфейса, справочной системы буквально "на лету". Раз языковые установки можно менять, то появился общий для приложений Office 2000 объект LanguageSettings, свойства которого позволяют проверить, какие именно установки приняты для интерфейса, справочной системы, инсталляционные установки, определяющие, например, вид цифр. Используя свойства этого объекта, можно также определить, какие языки (их может быть несколько) являются предпочтительными при редактировании текстов. Вот процедура, проверяющая все эти установки:
Public Sub LangSet() 'Проверка языковых установок With Application.LanguageSettings If .LanguagePreferredForEditing(msoLanguageIDRussian) _ And .LanguagePreferredForEditing(msoLanguageIDEnglishUS) Then MsgBox "Русский и Английский - оба являются предпочтительными языками редактирования" End If MsgBox "Для данного документа выбраны следующие языковые установки " & _ vbCrLf & "Язык инсталляции - " & .LanguageID(msoLanguageIDInstall) & _ vbCrLf & " Язык интерфейса - " & .LanguageID(msoLanguageIDUI) & _ vbCrLf & " Язык справки - " & .LanguageID(msoLanguageIDHelp) End With End SubЛистинг 5.10.
Появление нового объекта WebPageFont и соответствующей коллекции связано с уже многократно упоминавшейся тенденцией представления документов Office 2000 в виде Web-страниц. Объект WebPageFont позволяет установить, какой шрифт будет использоваться по умолчанию на Web-страницах в качестве пропорционального шрифта и шрифта фиксированной ширины, а также размер этих шрифтов. Вот простая процедура, изменяющая эти установки:
Public Sub ChangeFonts() 'Изменение свойств Web-шрифтов With Application.DefaultWebOptions .Fonts(msoCharacterSetCyrillic) _ .ProportionalFont = "Arial Cyr" .Fonts(msoCharacterSetCyrillic) _ .FixedWidthFont = "Times New Roman Cyr" .Fonts(msoCharacterSetCyrillic) _ .ProportionalFontSize = 12 .Fonts(msoCharacterSetCyrillic) _ .FixedWidthFontSize = 14 Debug.Print .Fonts(msoCharacterSetCyrillic).ProportionalFont Debug.Print .Fonts(msoCharacterSetCyrillic).ProportionalFontSize Debug.Print .Fonts(msoCharacterSetCyrillic).FixedWidthFont Debug.Print .Fonts(msoCharacterSetCyrillic).FixedWidthFontSize End With End SubЛистинг 5.11.
Константы mso…
Библиотека Office 9.0 содержит набор констант, начинающихся с префикса mso. Каждая константа является элементом некоторого перечисления, задающее возможное множество значений, которые допустимы при работе со свойствами и методами объектов, входящих в эту библиотеку. Две последние процедуры являются хорошим примером использования таких констант.
На этом я закончу описание общих объектов, входящих в библиотеку Office 9.0, подключаемую по умолчанию ко всем документам Office 2000.