Visual2000 · Архив статей Колесова & Павловой

Создание документа ActiveX. Часть 2

Андрей Колесов, Ольга Павлова

Загрузить программные приложения (9 Кб, ACTXDC2.zip)

© 1998, Андрей Колесов, Ольга Павлова
Авторский вариант. Статья была опубликована c незначительной литературной правкой в журнале "КомпьютерПресс" № 08/98, c. 139-142.

Мы продолжаем рассматривать вопросы, связанные с созданием документов ActiveX (начало см. "Создание документа ActiveX. Часть 1", нумерация шагов и рисунков сохранена).


Добавление свойства в объект UserDocument

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

В начало статьи

Добавление свойства в документ FirstDoc

Шаг 19. Вначале добавим в проект модуль кода. В меню Project выберите команду Add Module для открытия одноименного диалогового окна, а затем дважды щелкните значок Module, чтобы добавить новый модуль кода.

Шаг 20. Измените имя модуля на mGlobal, а в раздел Declarations введите следующий код:

' Объектная переменная документа FirstDoc
Public gFirstDoc As FirstDoc

Данная глобальная переменная содержит объектную ссылку, которая связывает документы FirstDoc и SecndDoc.

Шаг 21. Добавьте к документу FirstDoc новый элемент управления TextBox и поместите его ниже уже имеющегося в окне UserDocument элемента управления TextBox, как показано на рис. 8. Установите его свойства: Name = txtFirstDoc, Text = "".

Рис. 8

Шаг 22. Дважды щелкните окно документа FirstDoc для перехода в окно кода. В меню Tools щелкните пункт Add Procedure. В одноименном диалоговом окне введите имя strDocProp в окно Name и выберите параметр Property для создания общего свойства (рис. 9). После этого щелкните кнопку OK.

Рис. 9

Шаг 23. VB автоматически добавит в модуль процедуры Property Get и Property Let. Измените в них код следующим образом:

Public Property Get strDocProp() As String
   ' Внимание! Поменяйте тип свойства с Variant на String
    strDocProp = txtFirstDoc.Text
End Property

Public Property Let strDocProp(ByVal NewStrDocProp As String)
   ' Внимание! Поменяйте тип аргумента с Variant на String
   txtFirstDoc.Text = NewStrDocProp
End Property

В приведенном здесь коде свойство strDocProp является общим, а свойство Text элемента управления txtFirstDoc сохраняет и выводит на экран строки текста. Поскольку свойство strDocProp является общим, его значение можно передать документу SecndDoc. Чтобы это сделать, измените программу для кнопки "Перейти вперед".

Шаг 24. Добавим в событие Click кнопки cmdGoNext оператор Set с глобальной переменной gFirstDoc. Установив значение Me для этой переменной, мы создаем ссылку на документ FirstDoc. Эту ссылку можно использовать для доступа к общим свойствам и методам документа.

Private Sub cmdGoNext_Click()
   Set gFirstDoc = Me   ' < — Добавьте данную строчку
     ' Указанный здесь путь может не соответствовать пути
     ' к файлу SecndDoc.vbd на вашем компьютере
   Hyperlink.NavigateTo App.Path & "\SecndDoc.vbd"
End Sub

Шаг 25. Перейдите в окно документа SecndDoc, откройте окно кода и добавьте в событие Show объекта UserDocument следующий код:

Private Sub UserDocument_Show()
    If Not gFirstDoc Is Nothing Then
        lblCaption.Caption = gFirstDoc.strDocProp
        Set gFirstDoc = Nothing
    End If
End Sub

Здесь осуществляется проверка установки глобальной объектной переменной gFirstDoc, которая была сделана на предыдущем шаге. Если переменная указывает на объект, то доступны общие свойства документа ActiveX и заголовок метки соответствует свойству strDocProp документа FirstDoc. Сразу же после установки свойства Caption глобальная переменная уничтожается — ее значение устанавливается равным Nothing.

Примечание. Нельзя допускать, чтобы глобальная переменная сохраняла ссылку на объект UserDocument документа FirstDoc, так как, пока объект существует, он продолжает использовать ресурсы компьютера.

Шаг 26. Теперь сохраним модуль кода с именем mGlobal.bas (команда Save Project в меню File). Запустим проект на выполнение в среде VB, а затем обратимся к документу FirstDoc из IE. Введите какой-либо текст в новый элемент управления TextBox, например, "Создание документа ActiveX стало очень простым". После этого щелкните кнопку "Перейти вперед", и в метке документа SecndDoc появится текст, только что введенный в элемент управления TextBox.

В начало статьи

Сохранение свойств в объекте PropertyBag

При просмотре документа ActiveX пользователь может заполнить несколько текстовых окон. Если же он затем не один раз возвращается к документу, то для удобства работы было бы неплохо сохранить эти данные в объекте PropertyBag.

Поскольку в приведенном здесь примере оператор PropertyChanged вставлен в событие Change элемента управления txtFirstDoc, IE запрашивает пользователя о сохранении изменений. В случае положительного ответа значение свойства записывается в объект PropertyBag.

Шаг 27. Перейдите в документ FirstDoc, а затем дважды щелкните элемент управления txtFirstDoc и в его событие Change добавьте оператор PropertyChanged:

Private Sub txtFirstDoc_Change()
    PropertyChanged
End Sub

Шаг 28. Добавьте следующий код в свойство WriteProperties объекта UserDocument. Здесь значение свойства Text элемента управления txtFirstDoc сохраняется в объекте PropertyBag.

Private Sub UserDocument_WriteProperties(PropBag As PropertyBag)
    PropBag.WriteProperty "StrDocProp", txtFirstDoc.Text, "Привет"
    Debug.Print "Запись свойств 1"
End Sub

Теперь, чтобы считать значение этого свойства, введите в событие ReadProperties следующий код:

Private Sub UserDocument_ReadProperties(PropBag As PropertyBag) 
     txtFirstDoc.Text = PropBag.ReadProperty("StrDocProp", "Привет")
     Debug.Print "Чтение свойств 1"
End Sub

Шаг 29. Теперь у нас появилась возможность записывать и считывать свойство из объекта PropertyBag. Запустим наш проект для проверки. Нажмите F5, а затем запустите IE. Обратитесь к документу FirstDoc.vbd и введите в пустой элемент управления TextBox какой-либо текст, к примеру свое имя. В меню File выберите команду Close. IE предложит сохранить сделанные изменения — для этого выберите Yes в предложенном диалоговом окне.

Снова запустите IE и из него обратитесь к документу FirstDoc.vbd. Введенный на предыдущем шаге текст будет находиться в элементе управления TextBox.

Как видите, использование объекта PropBag вместе с событиями WriteProperties и ReadProperties позволяет очень просто сохранять данные объекта.

В начало статьи

Добавление меню в проект ActXDoc

Для добавления меню в документ ActiveX используется программа Menu Editor. Поскольку документ ActiveX не может непосредственно содержать меню, оно будет объединено с приложением, которое используется для просмотра документа ActiveX. Поэтому при добавлении меню в документ ActiveX необходимо согласовать его с меню приложения.

Примечание. При осуществлении навигации к документу ActiveX пользователи порой ничего о нем не знают (они могут и не догадываться, что это документ ActiveX). Поэтому крайне желательно включать в разработанный документ ActiveX форму About ("О программе"). На примере этой формы покажем процедуру включения меню.

Рис. 10

Шаг 30. В меню Project выберите команду Add Form. В одноименном диалоговом окне дважды щелкните значок About Dialog (рис. 10). В появившейся форме About MyApp установите следующие свойства Caption для формы и элементов управления (рис. 11):

Объект Значение Caption
FrmAbout О документе FirstDoc
LblTitle Документ ActiveX FirstDoc
LblVersion Версия 1.0
lblDescription Документ ActiveX — это форма, отображаемая в окне Internet Explorer

Рис. 11

Удалите элементы управления lblDisclaimer и cmdSysInfo, а также удалите или пометьте комментарием все строки кода в процедуре Form_Load.

Шаг 32. Перейдите в документ FirstDoc. Выведите диалоговое окно Menu Editor, выбрав одноименную команду в меню Tools (рис. 12). В поле Caption введите &Help, а в поле Name — mnuHelp. В поле NegotiatePosition выберите Right. Щелкните кнопку Next для создания нового элемента меню. В поле Caption введите "О документе FirstDoc", а в поле Name — mnuAbout. Щелкните кнопку со стрелкой вправо для смещения элемента меню вправо, а затем щелкните OK.

Шаг 33. Дважды щелкните окно документа FirstDoc, чтобы вывести окно Code. Введите следующий код в событие mnuAbout_Click:

Private Sub mnuAbout_Click() 
    frmAbout.Show vbModal
End Sub

Шаг 34. Запустите проект на выполнение (F5) и из IE обратитесь к документу FirstDoc. На панели команд IE выберите меню Help. Среди элементов меню найдите команду FirstDoc Help. Чтобы увидеть новое окно About ("О программе"), щелкните поле "О документе FirstDoc" (рис. 13).

Рис. 12

Рис. 13

Закройте IE и проект ActXDoc. Поздравляем всех, кто дошел вместе с нами до этого места, — мы рассмотрели довольно много приемов работы с документами ActiveX и на этом заканчиваем пример с проектом ActXDoc.

В начало статьи

Преобразование существующих приложений в документы ActiveX

Иногда может понадобиться преобразовать уже существующие приложения в документы ActiveX. Для облегчения этой работы вы можете воспользоваться Мастером перемещения документа ActiveX (ActiveX Document Migration Wizard).

  1. Откройте проект, который вы хотите конвертировать.
  2. В меню Add-Ins выберите команду Add-In Manager. В отрывшемся одноименном окне пометьте элемент VB ActiveX Document Migration Wizard, а затем щелкните кнопку OK (рис. 14).

    Рис. 14

  3. После этого вы увидите, что в меню Add-Ins появилась команда ActiveX Document Migration Wizard. Щелкните этот элемент меню, и на экране появится Мастер, который предложит выбрать те формы проекта, которые вы хотите преобразовать в документы ActiveX (рис. 15).

    Рис. 15

  4. Следуйте указаниям Мастера, пока он не завершит свою работу.
  5. Протестируйте полученный проект (как это делалось в приведенных выше примерах).

В начало статьи

Что делает Мастер

В процессе своей работы Мастер выполняет следующие действия:

В начало статьи

Заключительные замечания

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

  1. Документы ActiveX не являются автономными приложениями, они могут существовать только в контейнере. А так как свойства контейнеров изменяются, то предсказать возможности и ограничения среды существования документа ActiveX практически невозможно. В лучшем случае вы можете оценить свойства одного или нескольких контейнеров, а остальные рассматривать как менее значимые.
  2. Передвижение от одного документа ActiveX к другому может измениться при смене контейнера. Например, для просмотра документа ActiveX в среде VB необходимо использовать функцию CreateToolWindow, не требующую VBD-файла. А для просмотра документа ActiveX в IE надо использовать метод Navigate To объекта Hyperlink совместно с VBD-файлом.
  3. В проектах, осуществляющих обмен данными между документами ActiveX, следует использовать глобальные объектные переменные и объектные ссылки.
  4. Чтобы один документ ActiveX мог передавать данные другому, нужно использовать общие свойства и методы.
  5. В объект UserDocument нельзя помещать элементы управления OLE Container или внедренные объекты (например, документы Word или таблицы Excel).