    244	Документы ActiveX 

    Глава 10. Создание и использование документов ActiveX 

    Компонентная Объектная Модель обеспечивает поддержку документов ActiveX 
(прежде известных как объекты-документы OLE). Документ ActiveX — специальный 
тип объекта ActiveX, который может быть помещен и активирован внутри 
контейнеров документов ActiveX, таких, например, как Microsoft Internet Explorer. 
    Документы ActiveX — расширение технологии составного документа (связывание 
и внедрение объектов). Однако документы ActiveX включают новые возможности, 
которые позволяют повысить функциональность приложения за счет использования 
преимуществ Internet и расширения возможностей пользовательского интерфейса. 

    10.1. Документы ActiveX 

    Документы ActiveX составляют основной элемент набора технологий, совокупно 
именуемых ActiveX. Хотя документы ActiveX и внедренные объекты могут 
показаться очень похожим/ важно понять их некоторые ключевые различия. 
    Первоначально документы ActiveX представляли оригинальную технологию 
Microsc1':. используемую в приложении Binder (Подшивка), поставляемом с 
Microsoft Office для Windows 95. Это приложение позволяло пользователям 
группировать набор связанных документов Office вместе в одном приложении, 
независимо от приложения Office или типа документа. 
    В рамках технологии СОМ объекты ActiveX и контейнеры документов ActiveX 
поддерживаю-дополнительные интерфейсы, которые позволяют создавать 
объекты-документы (или формы, 

    10.1.1. Контейнеры документов ActiveX 

    Технология документов OLE, на которой базируются документы ActiveX, 
позволяет размещать объекты внутри приложения-контейнера. Приложение-контейнер 
также называется контейнером документа ActiveX. 
    Основной аспект функциональности документа ActiveX — его воздействие на 
пользовательский интерфейс. Документ ActiveX заполняет область отображения 
контейнера и придзе-контейнеру способность трансформировать себя, в результате 
чего он выглядит и действует как приложение-сервер. 
    Например, объект Рабочий лист Microsoft Excel может вызываться изнутри 
Internet Explorer или другого приложения-контейнера. 

    Примечание: Работать с документами ActiveX можно в контейнере документа 
ActiveX. Докуме!-" ActiveX— компонент, который существует только внутри клиента. 

    Контейнер документа ActiveX — обычно автономное приложение. Например, при 
запуске Microsoft Word это приложение формирует контейнер для 
объекта-документа. При запуске документа Word из Internet Explorer Word 
работает как сервер, который предоставляет документ другому контейнеру. При 
запуске документа .bmp из Word в качестве сервера выступает Paint. 
    Информацию относительно типов доступных контейнеров документов см. ниже, в 
разделе "Internet Explorer и Office Binder". 


    Глава 10. Создание и использование документов ActiveX 245 


    Рис. 10.1. Документ .doc, открытый в Internet Explorer. Элементы 
интерфейса сервере (Microsoft Word) добавляются к интерфейсу контейнера. 


    10.1.2. Документы ActiveX и внедренные объекты 

    Документы ActiveX значительно расширили возможности визуального 
редактирования своих предшественников — объектов-документов OLE. Визуальное 
редактирование — процесс редактирования внедренного объекта внутри окна 
контейнера с использованием инструментальных средств сервера. Вместо 
активирования только одного внедренного объекта документ ActiveX может 
представлять весь документ в среде приложения-сервера. 
    Пример этих расширенных возможностей — сравнение между объектом Word, 
внедренным в другом приложении, таком как Microsoft Excel, и документом 
ActiveX, созданным в Word, который открывается в Internet Explorer. В случае с 
документом ActiveX пользователь имеет возможность просматривать и печатать, 
например, заголовки и колонтитулы документа. Для внедренного объекта Word 
такая возможность недоступна. Это объясняется тем, что документы ActiveX 
реализуют дополнительные интерфейсы, которые расширяют функциональные 
возможности внедренных объектов и позволяют делегировать инструменты сервера 
приложению-клиенту. В последнем случае Word действует как приложение-сервер, 
предоставляя документ ActiveX приложению-клиенту (Internet Explorer) (рис. 10.2). 

    10.1.3. Преимущества документов ActiveX 

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


    246 Документы ActiveX 


    Контейнер - Microsoft Word 
    Microsoft Excel -	Microsoft Word -приложение-сервер    приложение-клиент 
    Внедренный объект Microsoft Excel 
    Для активированного объекта открывается окно, в котором возможно редактирование 
    Контейнер - Internet Explorer 
    Документ ActiveX - рабочая книга Excel 
    Внедренный объект Microsoft Word 
    Документы-объекты также могут содержать внедренные объекты 
    Документ занимает все пространство окна приложения-клиента 

    Рис. 10.2. Различия между внедренным объектом и документом ActiveX. 

    Документы ActiveX позволяют загружать в приложение-контейнер документы 
разных типов При этом внешние проявления связи между документом и приложением 
сводятся к минимуму. Это означает, что пользователям не требуется знать, какое 
приложение оперирует с какими типами данных. Так как этот аспект прозрачен для 
пользователей, они могут сосредоточиваться на решении своих задач, уделяя 
меньше внимания аспектам работы непосредственно приложения. 
    Широко доступными приложениями-контейнерами для документов ActiveX 
являются средства просмотра работы с Web, такие, как Internet Explorer и 
NetScape Navigator. 
    Документы ActiveX могут выполняться на локальных компьютерах. Это 
позволяет обработку, связанную с интенсивными вычислениями, производить 
локально, что уменьшает информационную загрузку сетей. 
    Web играет важную роль в расширении использования документов ActiveX. 
Используя документы ActiveX на Web, пользователи работают с информацией любого 
формата через общие инструменты средств просмотра. 
    Наиболее важное преимущество использования документов ActiveX для 
разработчиков — возможность применить имеющиеся навыки программирования. 
Разработчики могут создавать документы ActiveX, используя привычные язык и 
среду программирования, такие, как Microsoft Visual Basic 5.0, Microsoft 
Visual Java++ и Microsoft Visual C++. Например, в Visual Basic можно создать 
документ ActiveX, не прибегая к написанию программного кода для документа HTML. 

    10.1.4. Internet Explorer и Office Binder 

    Ниже кратко рассматриваются приложения Internet Explorer версий 3.0 и 4.0 
и Microsoft Office Binder, которые могут использоваться как контейнеры для 
документов ActiveX. Internet Explorer 3.0 
    В Microsoft Internet Explorer версии 3.0 можно загружать документ ActiveX 
таким образом, что среда работы пользователя будет подобна приложению-серверу, 
но с добавлением функциональных возможностей Internet. 
    Например, пользователи могут просматривать и модифицировать форму 
регистрации заказов, загруженную Internet Explorer, точно так же, как если бы 
это была форма в автономном приложении Visual Basic. Они могут также перейти к 
другой форме или странице, введя другое значение URL (Uniform Resource Locator 
— адрес ресурса) в окне Address или щелкнув кнопку или гиперссылку. 


    Глава 10. Создание и использование документов ActiveX 247 

    На следующей иллюстрации показан документ ActiveX, в данном случае форма 
Visual Basic, которая была активирована в Internet Explorer 3.0. 

    Рис. 10.3. Документ ActiveX, загруженный в Internet Explorer. 

    Microsoft Office Binder 

    Microsoft Office Binder — контейнер широкого применения. Это приложение 
напоминает электронную скрепку — оно позволяет пользователям группировать и 
редактировать связанные документы. 
    Пользователи могут работать с документами ActiveX, собирая активное 
содержание Office Binder. Например, Binder может содержать набор документов 
проекта, который включает документы Word, финансовые рабочие листы анализа 
Excel, различные диаграммы и схемные решения. Все документы хранятся в 
единственном файле, где пользователи могут открывать каждый тип документа 
индивидуально, причем запускать соответствующие приложения нет необходимости. 
Отдельные документы проекта Binder могут быть распечатаны в одном задании 
печати со сквозной нумерацией страниц. 

    Microsoft Internet Explorer 4.0 

    Версия 4.0 приложения Internet Explorer объединит элементы Windows 95 
Explorer (Проводника) с функциями Internet Explorer 3.0 в единую оболочку, 
которая напоминает Windows Explorer. Эта оболочка, включающая новые 
инструментальные средства Internet, будет обеспечивать интеграцию данных 
локального компьютера и данных из Internet. Пользователям больше не нужно 
будет использовать один интерфейс для Windows Explorer и другой — для Internet. 


    248 Документы ActiveX 


    Windows Explorer, объединенный с Internet Explorer, также будет 
контейнером документов ActiveX. Пользователи смогут открыть любое приложение, 
которое поддерживает интерфейсы документа ActiveX, непосредственно из Windows Explorer. 
    Например, пользователи смогут открывать средства просмотра HTML (такие, 
как Internet Explorer) из Windows Explorer. Web-страница, написанная в HTML, 
будет рассматриваться как тип документа — такой же, как документ Word или 
рабочая книга Microsoft Excel. 

    10.1.5. Документы ActiveX в Visual Basic 

    В Visual Basic документ ActiveX создается добавлением объекта UserDocument 
в окне дизайнера, обеспечиваемого Visual Basic для документов ActiveX. Объект 
UserDocument— основа для всех документов ActiveX. 

    Объект UserDocument 

    Объект UserDocument по функциональным возможностям подобен объекту 
UserControl, включая поддержку свойств и методов. Как и объект UserControl, 
объект UserDocumeni может генерировать события, поддерживает обратные вызовы и 
обеспечивает асинхронные уведомления от сервера. Объект UserDocument также 
реализует интерфейсы, которы; позволяют применять его внутри контейнера документа. 
    Информацию относительно объекта UserControl см. в разделе "Введение в 
элементы управления" главы 9 "Создание элементов управления ActiveX". 
Относительно сообщений с~ серверов см. в разделе "Получение сообщений от 
серверов" главы 7 "Создание клиентов ActiveX". 

    ji!.*:^:. 
    Project- Project"! 
    Ш @ ;iQ 
    ^ Ptojettl (Books.vbp) 
    El- C3 Forms 
    ;     '•••-& rrrnBooks (frmBooks.frm) Я S3 User Documents 
    , f ,;>        

    Рис. 10.4. Проект пользовательского документа ActiveX в 
окне Project Explorer. 

    Проект на рис. 10.4 состоит из пользовательского документа, который 
добавлен к проекту документа ActiveX и представляет объект UserDocument. К 
проекту можно добавлять дополнительные пользовательские документы, а также 
формы и модули. 

    Дизайнер документа ActiveX 

    При открытии пользовательского документа в режиме разработки он появляется 
в окне дизайнера. 
    Работа в окне дизайнера документа ActiveX подобна работе с формой. 
Дизайнер можно использовать для формирования визуальных аспектов документа 
ActiveX, например, размещением элементов управления на полотне объекта UserDocument. 


    —     Глава 10. Создание и использование документов ActiveX 249 


    Рис. 10.5. Пользовательский документ в окне дизайнера. 

    10.2. Работа с проектами документов ActiveX 

    Для создания документа ActiveX открывается проект ActiveX. Для создания 
новых проектов ActiveX Visual Basic предоставляет соответствующие шаблоны; в 
проект ActiveX можно преобразовать также существующий проект Standard EXE. 
    Пользователи могут получать доступ к документу ActiveX из разных точек 
входа и из ряда приложений-контейнеров. Следовательно, в приложении документа 
ActiveX должен быть программный код обработки ошибок. Написание кода для 
обработки ошибок и действий пользователя требуют понимания того, как в течение 
существования документа ActiveX работают события. 

    10.2.1. Элементы проекта документа ActiveX 

    Документ ActiveX может быть создан как .ехе или .dll файл. В любом случае 
проект ActiveX для документа ActiveX по умолчанию должен содержать по крайней 
мере один объект UserDocument. При создании файлов одного из этих типов к 
объекту UserDocument добавляются элементы управления, дополнительные формы и 
программные модули, а затем для элементов управления добавляется программный код. 
    При компиляции проекта ActiveX будет создан файл .ехе или .dll, а также 
файл документа Visual Basic (.vbd). Чтобы открыть документ ActiveX в средстве 
просмотра, таком как Internet Explorer, пользователь должен иметь возможность 
обратиться к файлу .vbd. 
    Следующие два типа файлов также входят в состав пользовательского документа: 
    Файлы .dob Visual Basic хранит пользовательские документы в текстовых 
файлах с расширением .dob. Эти файлы содержат исходный текст и значения 
свойств объекта UserDocument и элементов управления. 
    Файлы .dox Все графические элементы Visual Basic хранит в файлах с 
расширением .dox. Эти ресурсы, например растровые рисунки, используются для 
оформления элементов управления объекта UserDocument. 


    250 Работа с проектами документов ActiveX 


    Файлы .dob и .dox определяют вид и интерфейс документа ActiveX, включая 
свойства, события и методы. Эти два файла аналогичны файлам .frm и .frx 
проекта Standard EXE соответственно. 

    10.2.2. Создание проекта документа ActiveX 

    Для создания документа ActiveX в Visual Basic можно либо открыть новый 
проект ActiveX либо преобразовать существующий проект Standard EXE. 

    Создание нового проекта документа ActiveX 

    Для создания нового проекта ActiveX Visual Basic обеспечивает шаблоны 
ActiveX Document DLL и ActiveX Document EXE. 

    New Project 

    Документы ActiveX 


    Рис. 10.6. Шаблоны проектов для документов ActiveX. 

    Преобразование существующего проекта Standard EXE 
    Для преобразования существующего проекта Standard EXE в проект документа 
ActiveX можно использовать мастер ActiveX Document Migration Wizard. При 
запуске мастера он преобразует выбранные формы проекта в документы ActiveX и 
изменяет тип проекта на ActiveX EXE или ActiveX DLL. 
    Мастер ActiveX Document Migration Wizard можно также использовать для 
преобразования форм проекта, отличного от Standard EXE, в проект документа 
ActiveX, но опция преобразования типа проекта будет недоступна. 
    Чтобы преобразовать существующий проект в проект ActiveX: 
    1. В меню Add-lns подключить мастер ActiveX Document Migration Wizard 
(команда Add-In Manager) и затем запустить его. 
    2. В экране Form Selection мастера выбрать форму, которую требуется 
преобразовать, и щелкнуть Next. 


    Глава 10. Создание и использование документов ActiveX	251 

    3. В экране Options выбрать следующие опции: a)  Comment out invalid code. 
6) Remove original forms after conversion. 
    в) Convert to an ActiveX EXE (если исходный проект не Standard EXE, этой 
опции не будет). 
    4. В экране Finished щелкнуть переключатель No запроса, требуется ли 
выводить отчет работы мастера, затем установить флажок Save current settings 
as default (Сохранить текущие установки как умолчательные) и нажать Finish. 

    10.2.3. Компиляция проекта документа ActiveX 

    При создании документа ActiveX как компонента in-process (.dll) или 
out-of-process (.exe) компонент функционирует как сервер Автоматики. Сервер 
Автоматики позволяет другому приложению — контейнеру ActiveX загружать, 
программировать и активировать документ. 
    При компиляции или запуске проекта Visual Basic создает файл документа 
(.vbd). Файл .vbd — структурированная область хранения OLE. Это означает, что 
данные в файле могут быть доступны и управляемы через стандартные интерфейсы 
OLE. Информацию по интерфейсам см. в разделе "Использование интерфейсов" главы 
7 "Создание клиентов ActiveX". Чтобы открыть документ ActiveX, например, в 
окне Internet Explorer, пользователи должны обратиться к файлу .vbd. 
    Таким образом, при компиляции проекта документа ActiveX создаются два 
исполняемых файла: .ехе (или .dll) и .vbd. 

    10.2.4. Размещение документа ActiveX в контейнере 

    Прежде чем можно будет использовать документ ActiveX, его необходимо 
поместить в контейнер. Соединение документа ActiveX с контейнером (загрузка) 
играет ключевую роль в определении событийного поведения документа ActiveX. 
Загрузка позволяет документу ActiveX реализовать свои функциональные возможности. 
    Контейнер документа содержит семейство гнезд, которые он использует для 
назначения документам ActiveX в период выполнения. Гнездо содержит адрес окна 
в контейнере, в которое помещен документ. 
    Когда документ загружен, контейнер становится для документа клиентом и 
устанавливает соединение между контейнером, гнездом и документом согласно 
внутренней реализации. После этого становится доступным свойство Parent 
документа ActiveX, которое возвращает ссылку на контейнер. 
    После того как происходит загрузка, для документа ActiveX становятся 
доступными свойства контейнера и объекта Visual Basic Hyperlink. Свойства и 
методы объекта Hyperlink документа ActiveX используются для передачи в 
контейнер запроса на переход к другому URL. 

    10.2.5. События пользовательского документа 

    В период существования объекта UserDocument события, которые происходят, и 
порядок, в котором они происходят, зависят от ряда факторов, включая: какой 
контейнер используется, был ли документ загружен и какие действия пользователь 
выполняет внутри контейнера. В этом разделе описываются события, которые 
происходят при использовании в качестве контейнера средства просмотра Internet Explorer. 
    Ниже описываются события, которые могут происходить в течение 
существования документа ActiveX: 


    252 Работа с проектами документов ActiveX 


    Событие	Описание 

    Initialize	Событие Initialize происходит при каждом создании или 
обновлении экземпляра документа ActiveX. Это — всегда первое событие, которое 
имеет место в период существования документа ActiveX. 
    InitProperties	Событие InitProperties происходит, когда документ ActiveX 
уже загружен в контейнер документа, но значения свойств документа еще не были 
сохранены. При сохранении значений свойств событие InitProperties заменяется 
событием ReadProperties. 
    ReadProperties	Событие ReadProperties происходит при сохранении свойства с 
использованием объекта PropertyBag. 
    Terminate	Событие Terminate происходит непосредственно перед разрушением 
документа ActiveX. В Internet Explorer 3.0 в кэше хранится четыре документа: 
ActiveX. Когда пользователь загружает или осуществляет навигацию к пятому 
документу, один из документов ActiveX удаляется из кэша. Используя событие 
Terminate, можно удалить все глобальные объектные ссылки, установив их в Nothing. 
    Show	Событие Show происходит в одной из следующих ситуаций: — Когда 
пользователь открывает документ ActiveX, который был расположен в контейнере. 
— Когда пользователь нажимает в Internet Explorer кнопку Back или Forward, 
чтобы вернуться к документу ActiveX в списке History. 
    Hide	Событие Hide происходит в одной из следующих ситуаций: — Когда 
пользователь выходит из документа, непосредственно перед событием Terminate. — 
Когда Internet Explorer завершен, в то время как документ еще просматривается 
или все еще находится внутри кэша активных документов. 
    Функциональные возможности событий Show и Hide зависят от конкретного 
контейнера. Информацию относительно различий в их поведении см. в следующем разделе. 

    10.2.6. Различия между контейнерами документов 

    Разработчик заранее не может знать, в какой контейнер пользователь 
поместит документ ActiveX, поэтому он должен спланировать различные ситуации 
использования документа. Например, возможно, придется сообщить пользователям, 
что выбранный контейнер не обеспечивает некоторых функций, требуемых для 
нормальной работы с документом ActiveX, и предложить альтернативный контейнер. 
    Ниже приводятся некоторые важные различия между контейнерами: 
    •   Internet Explorer кэширует документы в памяти, в то время как 
Microsoft Office Binder — нет; 
    •   в Office Binder при добавлении нового раздела к подшивке из класса 
документа ActiveX создается новый объект. При этом всегда будет происходить 
событие InitProperties вместо события ReadProperties; 
    •   в Internet Explorer события Show и Hide происходят, как описано в 
предыдущем разделе. 

    10.2.7. Определение типа контейнера документа 

    Для определения контейнера документа ActiveX вводится оператор TypeName со 
свойством Parent объекта UserDocument, как показано в следующем примере: 

    Dim  strContainer  As   String strContainer  =  TypeName(UserDocument.Parent) 


    Глава 10. Создание и использование документов ActiveX	253 


    Для Internet Explorer строковое значение, возвращенное свойством Parent, — IWebBrowserApp. 
    Событие Show происходит, когда документ ActiveX уже размещен в контейнере, 
так что это событие можно использовать для определения используемого 
контейнера. Когда документ загружен, свойства контейнера становятся 
доступными.В следующем фрагменте кода проверяется, возвращено ли свойством 
Parent объекта UserDocument строковое значение IWebBrowserApp, и выводится 
сообщение пользователю: 

    Private   Sub  UserDocument_Show() Dim  strContainer  As   String 
    strContainer  =  TypeName(UserDocument.Parent) If   strContainer  =   
"IWebBrowserApp"   Then 
    MsgBox   "Подтверждение:   Этот  документ"   &  _ 
    "   работает   с   Internet  Explorer   "   &  _ 
    "3.0  или  выше" Else 
    MsgBox   "К  сожалению,   этот  документ  может  работать   "   &  _ 
    "с   Internet  Explorer   3.0  или  выше" End  If End  Sub 


    Примечание: Как и другие компоненты, созданные с помощью Visual Basic 5.0, 
документы ActiveX могут передавать события и обратные вызовы клиенту, 
обеспечивая асинхронные вызовы клиента. Информацию относительно сообщений 
сервера см. в разделе "Получения сообщений от Серверов" главы 7 "СОМ и 
создание клиентов ActiveX". Относительно реализации событий в серверах см. в 
разделе "Использование событий" главы 8 "Создание программных компонентов ActiveX". 


    10.3. Тестирование и отладка документов ActiveX 

    Тестирование и отладка документов ActiveX по сравнению с созданием 
стандартных проектов включает некоторые дополнительные вопросы. Основной 
момент заключается в том, что пользователь имеет ряд альтернативных способов 
просмотра и работы с документом ActiveX. В то же время он может столкнуться с 
некоторыми ограничениями, касающимися выбора контейнера документа. В этом 
разделе обсуждается, как разработчик может подготовиться к различным 
ситуациям, которые могут возникнуть при взаимодействии пользователя с 
документом ActiveX. Здесь также показано, как перевести в режим останова 
стандартный проект, когда контейнер — Internet Explorer, и как при этом 
использовать средства отладки Visual Basic. 

    10.3.1. Запуск проекта в Visual Basic 

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

    10.3.2. Тестирование документа ActiveX в контейнере 

    Для тестирования документа ActiveX в приложении-контейнере запускать его 
следует с использованием файла .vbd. Открывать документ ActiveX 
непосредственно из Visual Basic нельзя. 


    254	Многодокументные проекты 

    Для запуска документа ActiveX в контейнере: 
    1. Создать ассоциацию файла для файла .vbd и приложения-контейнера. 
    2. Переключиться в Visual Basic и запустить приложение. 
    Пользовательские документы и формы не будут видимы, так как вывод из 
проекта сосредоточен в файле .vbd. 
    3. Переключиться в My Computer или Windows Explorer и запустить файл .vbd. 
Это обусловливает загрузку файла .vbd в приложение-контейнер. 
    4. Удостоверившись, что файл .vbd загружен в приложение-контейнер 
правильно, закрыть контейнер, переключиться в Visual Basic и явно завершить приложение. 

    10.3.3. Определение среды периода выполнения 

    Чтобы протестировать, запускается ли приложение в автономном режиме, к 
стандартному модулю проекта можно добавить процедуру Sub Main и в ней 
выполнить соответствующее действие. 
    В следующем фрагменте свойство StartMode объекта Арр используется для 
проверки, запустилось ли приложение в автономном режиме. Если это так, 
приложение выводит на экран форму: 

    If  Арр.StartMode  =  vbModeStandalone   Then 
    frmContainer.Show End   If 

    Этот программный код открывает приложение в автономном режиме. Основываясь 
на результате тестирования режима запуска приложения, для приложения можно 
обеспечить также способность действовать как контейнер документа. Придать 
приложению черты средства просмотра позволяет, например, элемент управления WebBrowser. 
    Для тестирования проекта в автономном режиме: 
    1. Добавить к проекту стандартный модуль с процедурой Sub MainQ. 
    2. В меню Project выбрать Project Properties. 
    3. На вкладке General установить для Startup Object значение Sub Main. 
    4. На вкладке Component установить для опции Start Mode значение 
Standalone и щелкнуть ОК. 
    5. Запустить и протестировать приложение. 

    10.4. Многодокументные проекты 

    Большинство проектов документов ActiveX состоит из двух или больше 
связанных документов. Если для проекта документа ActiveX в качестве контейнера 
используется средство просмотра, необходимо обеспечить возможности для 
навигации между несколькими документами. Следует также установить систему 
сообщений, с помощью которой можно идентифицировать открытый документ. Зная, 
какой документ открыт, приложение документа ActiveX сможет выполнить 
соответствующее действие. 

    10.4.1. Определение навигационных требований к документу 

    При проектировании документа ActiveX необходимо установить, как документ 
будет использовать возможности приложения, предполагаемого в качестве 
контейнера. Например, в документе, разработанном для эксплуатации в Internet 
Explorer, вероятно, должны использоваться его возможности навигации между 
страницами HTML. 


    Глава 10. Создание и использование документов ActiveX	255 


    Документ ActiveX, сохраненный в Microsoft Office Binder, не будет работать 
таким же образом, как документ, который выполняется в Internet Explorer. 
Вместо навигации между документами или страницами в Binder осуществляется 
навигация между разделами. 

    Примечание: Добавить новый объект UserDocument к проекту можно выбором 
команды Add User-Document в меню Project. Затем в окне диалога UserDocument 
нужно выбрать пиктограмму User Document. 


    Простой сценарий с несколькими документами 

    Если пользователи проекта документа ActiveX будут работать с двумя 
документами, пользователь должен иметь возможность открыть второй документ, 
щелкнув кнопку на первом документе. 
    Если приложение-контейнер — Internet Explorer, для перемещения от одного 
документа к другому следует использовать метод NavigateTo объекта Hyperlink, 
как показано в следующем примере кода: 

    Private   Sub   cmdMoveTo_Click() 
    '   Принимая,   что  документ   называется  UserDoc2 
    UserDocument.Hyperlink.NavigateTo  _ 
    "с:\projects\UserDoc2.vbd" End  Sub 


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


    10.4.2. Использование глобальных ссылок 

    Важное различие между формами и документами ActiveX заключается в том, что 
заранее неизвестно, как пользователь будет вызывать документ ActiveX. В 
Internet Explorer, например, пользователь может открывать документ ActiveX из 
различных точек входа, скажем из списка Favorites (Избранное) или через кнопку 
быстрого доступа на рабочем столе. 
    Для управления способом поддержания связи друг с другом документов ActiveX 
можно использовать глобальные переменные. Глобальные переменные также 
позволяют делать свойства одного документа доступными другому документу. 
    Один из способов идентифицировать документ ActiveX для другого документа 
ActiveX — использовать глобальную переменную. Переменная устанавливается как 
объектная ссылка на документ ActiveX так, чтобы значение ее выступало как 
некий сигнал между документами. 
    На следующей иллюстрации глобальная переменная действует как почтовый ящик 
между двумя документами. 


    256 Многодокументные проекты 

    Установка глобальной переменной предполагает объявление ее в модуле кода. 
В следую-!, щем фрагменте показано объявление глобальной переменной gDocI — 
объектной ссылки на документ Doc1: 

    Public   gDocl   As   String 

    Для проверки и уничтожения глобальных ссылок, установленных другими 
документами ActiveX, можно использовать события Show и Hide. Разрушение 
глобальных ссылок освобождает память и системные ресурсы, используемые для 
хранения ссылки. 

    Обнаружение объектной ссылки 

    Свойства public одного документа ActiveX могут быть доступны другим 
документам ActiveX. Чтобы сделать свойства глобально доступными, необходимо 
проверить, установлена ли глобальная переменная на объект, который содержит 
свойство public, представляющее документ ActiveX. 
    В следующем фрагменте кода для проверки факта установки глобальной ссылки 
gDocl на объект используется оператор Is Nothing. 
    Если ссылка установлена, свойства public документа ActiveX доступны и в 
надписи в форме выводится свойство strPropI из документа Doc1. 
    Если ссылки на объект нет, объектная ссылка разрушается и выводится 
соответствующее сообщение. 

    Private   Sub  UserDocument_Show() If  Not   gDocl   Is   Nothing  Then 
    IblCaption.Caption   =  gDocl.strPropl 
    Set  gDocl   =  Nothing   '   Это   важно!   Необходимо  установить '   
переменную  в  Nothing,   чтобы  уничтожить   ссылку  на '   глобальную  
переменную Else 
    MsgBox   "Вначале   необходимо   открыть   UserDocument   Docl" End  if 
End  Sub 

    Использование события Hide для уничтожения ссылок 

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

    Private   Sub  UserDocument__Hide () 
    If  Not   gDocl   Is   Nothing  Then Set   gDocl   =  Nothing 
    End  if End  Sub 


    10.4.3. Создание свойств 

    Как и в случае с объектом UserControl, для создания свойств public для 
объектов UserDocument можно использовать процедуры Property. Ниже приводится 
пример создания свойства public и обращения к свойству из другого документа ActiveX. 


    Глава 10. Создание и использование документов ActiveX	257 


    Создание свойств Public 

    При создании свойства public это свойство предоставляется, так что другие 
приложения могут устанавливать или получать значения. 
    В следующем фрагменте кода показано предоставление свойства strPropI как 
свойства public документа ActiveX Doc1. Это позволяет через свойство Text 
элемента управления TextBox управлять сохранением и выводом строки: 

    Public   Property  Get   strProplO   As   String 
    strPropI   =  txtDocl.Text End  Property 
    Public   Property  Let   StrPropI(ByVal  _ NewstrPropl  As   String) 
    txtDocl.Text   =  NewstrPropl End  Property 


    Обращение к свойству Public 

    Преимущество создания глобальной объектной переменной для обращения к 
конкретному документу ActiveX в том, что эту ссылку можно использовать для 
получения доступа к public свойствам и методам документа. 
    В следующем примере документ ActiveX Doc1 содержит кнопку Передать 
(Transfer). В событии Click для кнопки Transfer объектная переменная gDod 
устанавливается в Me, создавая ссылку на Doc1. 
    Документ Doc1 имеет свойство только для чтения User, которое содержит имя 
текущего пользователя. ActiveX документ Satellite может использовать ссылку 
gDod для получения доступа к свойству User документа ActiveX Doc1. 

    Private   Sub   cmdTransfer_Click() 
    Set   gDod   =  Me 
    Hyperlink.NavigateTo _ 
    App.Path & "\Satellite.vbd" End Sub 
    Private Sub UserDocument_Show() Dim strUser As String 
    strUser = gDocl.User 
    ' Вывести имя пользователя 
    End Sub 


    Устойчивость свойств 

    Устойчивость данных — способность компонента хранить и отбирать данные. 
Создание механизма сохранения свойств документа ActiveX избавляет 
пользователей от необходимости неоднократно вводить в приложение одни и те же данные. 
    Некоторые контейнеры, такие как Internet Explorer и Microsoft Office 
Binder, позволяют сохранять данные, производя запись в интерфейс приложения. 
Для сохранения данных в файле (файл .vbd или другой вид файла, в зависимости 
от приложения) используется объект PropertyBag. 
    Объект PropertyBag объявляется как часть описания событий WriteProperties 
и ReadProper-ties и имеет два метода: 
    9 Зак.   136 


    258 Многодокументные проекты 
    
    
    Метод	Действие 

    WriteProperty	Записывает сохраняемое значение в объект PropertyBag. 
    ReadProperty	Возвращает сохраненное значение из объекта PropertyBag. 
    Уведомление контейнера об изменении 

    Первый шаг в сохранении свойства — известить контейнер об изменении 
значения свойства. Это можно выполнить, используя метод PropertyChanged 
объекта UserDocument. 
    В следующем фрагменте кода показан метод PropertyChanged в событии Change 
элемента управления TextBox. Он сообщает контейнеру, что значение свойства 
изменилось и, в случае Internet Explorer, запрашивает пользователя сохранить 
изменения до завершения метода. 

    Private   Sub   txtDocl_Change() 
    PropertyChanged End  Sub 

    Обычно всякий раз при изменениях значения свойства и сохранении их в 
PropertyBag, чтобы гарантировать, что новое значение будет успешно сохранено, 
необходимо вызвать метод PropertyChanged. 

    Запись свойства в файл .vbd 

    В ответ на метод PropertyChanged устанавливается флаг, который 
обеспечивает сообщение контейнеру. После этого происходит результирующее 
событие WriteProperties. 
    Метод WriteProperty можно использовать для сохранения свойства в файле 
.vbd или в любом расположении, которое обеспечивает контейнер. Этот процесс 
показан в следующем фрагменте кода: 

    Private   Sub  UserDocument_WriteProperties(PropBag  As  VB.PropertyBag) 
    '   Запись   свойства   в   PropertyBag 
    PropBag.WriteProperty   "txtDocl",   _ 
    txtDocl.Text,    "Запись   завершена" End  Sub 
    I 


    Чтение свойств 

    Событие InitProperties происходит только в том случае, если не имеется 
свойств документа ActiveX, сохраненных с использованием PropertyBag. В 
предыдущем примере при следующем открытии документа ActiveX произошло бы 
событие Read Properties и, через объект PropertyBag, были бы сохранены данные 
с использованием метода ReadProperty. 
    В этой процедуре выполняется получение данных, сохраненных в предыдущем примере: 

    Private   Sub  UserDocument_ReadProperties  _ (PropBag  As  
VB.PropertyBag) '   Чтение   свойства  в   элемент  управления txtDocl.Text  = 
 ReadProperty("txtDocl", -.  "   Данные   получены   ") 

    End  Sub 
    TextBox 


    Глава 10. Создание и использование документов ActiveX	259 


    10.5. Пользовательский интерфейс и пользовательский документ 

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

    10.5.1. Установка свойств пользовательского документа 

    Объект UserDocument — специальный тип формы. Он включает все свойства, 
доступные для формы, плюс ряд специальных свойств. Дополнительные свойства 
определяют поведение, специфичное при работе внутри контейнера документа. 

    Установка свойств MinHeight и MinWidth 

    При работе с документом ActiveX доступны все свойства масштабирования, 
которые применяются для формы. 
    Пользователи могут изменять размер окна приложения-контейнера, поэтому 
разработчик не имеет контроля над объемом экранного пространства, которое 
контейнер предоставляет документу ActiveX. Однако для документа ActiveX можно 
определять минимальные требования пространства и вводить внутри контейнера 
полосы прокрутки, когда документ превышает эти требования. 
    Чтобы специфицировать, когда требуется добавить полосы прокрутки, нужно 
установить свойства MinHeight и MinWidth объекта UserDocument, как показано в 
следующем примере: 

    Private   Sub  UserDocument_Resize() .  UserDocumentl.MinHeight   =   4000 
    UserDocumentl.MinWidth  =   9000 End  Sub 

    Обычно свойства MinHeight и MinWidth нужно специфицировать. Если эти 
свойства явно не установлены, а используются умолчательные установки высоты и 
ширины объекта UserDocument, полосы прокрутки будут выводиться на экран и 
после изменения размера документа пользователем, когда вся информация 
помещается на полотне документа. Так как это обычно нежелательно, свойства 
MinHeight и MinWidth следует специфицировать. 

    10.5.2. Добавление меню к пользовательскому документу 

    С помощью утилиты Menu Editor для документа ActiveX в Visual Basic можно 
создавать пользовательские меню. Ниже на примере реализации пользовательского 
окна About меню Help показано, как к документу можно добавить меню. 
    Для всех документов ActiveX желательно обеспечить окно About. Информация в 
этом окне обычно дает пользователям информацию относительно разработчика и 
версии документа, данных авторского права и вопросов лицензирования. 
    В Visual Basic окно About добавляется через окно диалога Add Form (рис. 10.8). 
    В умолчательной форме About для документа следует установить 
соответствующие значения свойства Caption для формы и элементов управления 
Label (рис. 10.9). 


    260 Пользовательский интерфейс и пользовательский документ 


    Рис. 10.8. Открытие новой формы About в окне диалога Add Form. 

    Рис. 10.9. Умолчательная форма About, добавляемая к проекту через окно 
диалога Add Form. 


    Глава 10. Создание и использование документов ActiveX 261 


    Создание меню Help 

    При создании для документа ActiveX пользовательского меню Help оно 
автоматически объединяется с контейнером. Устанавливая значение свойства 
NegotiatePosition, можно указать, где меню Help документа ActiveX будет 
показано внутри меню Help контейнера. 
    Для создания меню и подменю Help и для команды About можно использовать 
окно Menu Editor Visual Basic. 
    После этого к событию Click меню About можно добавить следующий 
программный код: 

    Private   Sub  mnuAbout_Click() 
    frmAbout.Show  vbModal   '   Открыть   форму About   как модальное   окно 
End  Sub 


    Рис. 10.10. Вывод формы About документа выбором пункта меню документа в 
строке меню приложения-контейнера. 

