Встраивание и связывание объектов во время разработки
В этом параграфе рассмотрено создание простого элемента управления OLE Container для демонстрации встраивания объектов во время проектирования. Встраивание во время разработки следует использовать тогда, если заранее известно, какие объекты понадобятся, или требуется ограничить пользователей приложения использованием только определенных объектов (например, документов Word). Этот метод позволяет выполнять и связывание объектов, но во время проектирования предпочтительнее организовывать встраивание. Встраивание объекта можно выполнить двумя способами:
• путем вставки существующего объекта методом "перетащить-и-опустить";
• путем вставки объекта с помощью диалогового окна
Insert Object (Вставка объекта).
Встраивание методом "перетащить-и-опустить"
Чтобы внедрить объект с помощью этого способа, необходимо выполнить следующие действия.
1. Открыть в Visual Basic новый проект и выполнить двойной щелчок на значке элемента OLE Container в панели элементов управления, чтобы поместить его экземпляр на форму. Visual Basic отобразит диалоговое окно Insert Object (Вставка объекта), в котором можно указать объект, внедряемый в элемент OLE Container.
2. В диалоговом окне Insert Object (Вставка объекта) (см. рис. 14.2) щелкните на кнопке Cancel. (Это означает, что в форму будет помещен пустой элемент управления OLE Container, и позднее можно будет перетащить туда OLE-объект).
3. В окне Properties (Свойства) элемента OLE Container необходимо задать значение свойства SizeMode равным 1 — Stretch (если объект — рисунок, размеры которого можно изменять) или 2 — AutoSize (если объект — текст или рисунок, размеры которого изменять не следует).
Возможные значения свойства SizeMode приведены в табл. 14.1.
Таблица 14.1. Значения свойства SizeMode
Значение
| Описание | ||
Clip
Stretch AutoSize Zoom | Размеры отображаемого объекта равны исходным. Если его размеры превышают размеры окна элемента управления OLE Container, то часть изображения отсекается
Размеры изображения объекта подгоняются под размер окна элемента управления OLE Container. При этом изображение может исказиться Размеры окна элемента управления изменяются автоматически, чтобы объект целиком поместился в окно Размеры объекта изменяются так, чтобы он занял максимально возможную часть окна элемента управления OLE Container, сохранив при этом свои первоначальные пропорции |
4. Запустите приложение, которое поддерживает OLE, и откроите файл. В нашем примере документ Word встраивается в элемент управления OLE Container с помощью перетаскивания документа из приложения-источника (Word) на пустой элемент OLE Container.
5. Когда на экране появятся окна запущенных Visual Basic и Word, перетащите документ (или его часть) в пустой элемент управления OLE Container.
Совет
Чтобы в окно элемента управления OLE Container поместить часть документа Word, нужно выделить часть документа, а затем перетащить ее, нажав левую кнопку мыши в любом месте выделенной части. Если окно Visual Basic в данный момент невидимо, то для перехода в него нажмите клавиши Alt+Tab, не отпуская кнопку мыши. При появлении на рабочем столе формы Visual Basic перетащите выделенную часть документа в окно элемента управления OLE Container. Выделенный текст будет удален из исходного объекта (документа Word). Чтобы встроить копию выделенного текста (текст в исходном документе сохраняется), во время переноса фрагмента удерживайте нажатой клавишу Ctrl. При выполнении обычной операции перетащить-и-опустить объект из источника удаляется.
6. Во время перемещения объекта под указателем-стрелкой появляется небольшой прямоугольник. Опустите перетаскиваемый объект на пустой элемент OLE Container. Через некоторое время документ Word появится в окне элемента управления OLE Container (рис. 14.5).
Теперь форма содержит документ Word. При запуске приложения документ Word будет отображаться в окне элемента управления OLE Container. Для его редактирования можно использовать меню и инструментальные панели Word.
Рис. 14.5. Объект, перемещаемый из документа Word, появляется в окне элемента управления OLE Container
Свойства Class, SourceDoc и Sourceltem. Рассмотрим несколько свойств элемента управления OLE Container. При создании объекта в форме окно Properties (Свойства) будет содержать следующую информацию:
• имя прикладной программы, с помощью которой создан объект (свойство
Class);
• данные или ссылка на данные (свойство SourceDoc);
• образ данных (свойство Sourceltem),
данное значение устанавливается только при связывании объектов и определяет данные (в пределах исходного файла), связанные с управлением OLE.
Свойство OLETypeAllowed. Будет исходный документ внедрен или связан с элементом управления OLE Container, зависит от установки значения свойства OLETypeAllowed. Выберите элемент управления OLE Container в форме и найдите в окне Properties свойство OLETypeAllowed. В табл. 14.2 перечислены допустимые значения этого свойства. По умолчанию установлено значение 2 — Either.
Таблица 14.2. Значения свойства OLETypeAllowed
Константа |
Значение |
Описание |
vbOLELmked vbOLEEmbedded vbOLEEither |
0 1 2 |
Элемент управления OLE Container может содержать только связанный объект Элемент управления OLE Container может содержать только встроенный объект Элемент управления OLE Container может содержать либо встроенный, либо связанный объект (установлена по умолчанию) |
OLETypeAllowed в О (Связанный). Значение этого свойства по умолчанию не задает тип создаваемого OLE-объекта, а лишь позволяет определить тип объекта, который может быть создан. Реально используемый тип OLE-объекта указан в диалоговом окне Insert Object (Вставка объекта). Например, если значение свойства OLETypeAllowed равно 2 то в диалоговом окне Insert Object (Вставка объекта) переключатели Create New и Create from File, а также флажок Link становятся доступными. Если же значение свойства OLETypeAllowed равно 0 (Связанный), то переключатель Create New блокируется (нельзя связаться с несуществующим объектом). Если устанавливается значение 1 (Встроенный), то блокируется флажок Link (Связь).
Связывание с помощью диалогового окна Insert Object
Метод перетащить-и-опустить – не единственный способ внедрения или связывания объектов в OLE Container. Опишем, как это выполняется с помощью диалогового окна Insert Object (Вставка объекта).
1. Удалите элемент управления OLE Container из формы Form1 и создайте новый элемент управления OLE Container, воспользовавшись рассмотренными выше рекомендациями.
2. В диалоговом окне Insert Object установите переключатель Create from File (Создать из файла) и флажок Link (Связь) (рис. 14.6). Как уже упоминалось, флажок Link (Связь) иногда блокируется Это происходит, когда значение свойства OLETypeAllowed равно 1 (Встроенный). Чтобы разблокировать флажок Link (Связь), установите значение свойства OLETypeAllowed в 2 (Связанный).
3. Щелкните на кнопке Browse (Обзор), чтобы отыскать требуемый файл.
4. Выбранный файл появится в окне элемента управления OLE Container. При этом может быть видна только его часть. Чтобы увидеть весь объект, измените размеры окна элемента управления.
Рис 14.6 Чтобы связать объект, установите флажок Link (Связать) в диалоговом окне Insert Object
В зависимости от установленного свойства SizeMode изображение в связанном файле может быть искажено. Теперь в элементе управления содержится ссылка на объект, а не его копия. Всякий раз, когда приложение-сервер изменяет связанный объект, объект в контейнере также изменяется.
Примечание
Когда вставляемый объект связывается с оригиналом, приложение-контейнер не содержит никаких данных. После того, как объект вставлен, в приложении-контейнере вы уведете не его копию, как это происходит при внедрении, а изображение объекта, который был вставлен.
Если связанный объект является документом Word, то он появится в окне элемента управления OLE Container (см. рис. 14.5). В ячейке, содержащей значение свойства SourceDoc, содержится путь и имя файла связанного объекта.
5. Оставьте окно Visual Basic открытым, когда открыт документ Word. Внесите изменения в исходный документ и убедитесь, что связанный объект в окне Visual Basic изменяется в реальном масштабе времени. Чтобы это увидеть, запускать приложение не требуется. В режиме проектирования связанный документ модифицируется в реальном масштабе времени, как только редактируется оригинал.
Сохранение встроенных объектов и доступ к ним
Встроенные объекты создаются приложением-сервером, а сохраняются в приложении-контейнере. При встраивании объекта связь между содержимым элемента управления OLE Container и первоначальным объектом не устанавливается. Для редактирования встроенного объекта нужно обратиться к ресурсам программы, с помощью которой объект создан, но данные для нее предоставляет приложение-контейнер. Кроме того, данные во встроенном объекте не сохраняются автоматически. Для сохранения встроенного объекта и изменений, сделанных приложением-сервером, используется метод SaveToFile. Синтаксис этого метода:
OLEl.SaveToFile filenumber
Переменная
filenumber - это числовое значение, определяющее номер открытого файла. Номер передается в двоичном коде.
Ниже приведен фрагмент программы для ввода имени файла и сохранения встроенного документа с помощью метода SaveToFile.
Программа 14.1. Сохранение OLE-данных
Private Sub mnuFileSaveas Click()
Dim fnum As Integer
On Error GoTo Cancel
fnum = FreeFile
CommonDialogI.ShowSave
' Вывод на экран диалогового окна Save As
Open CommonDialogI.FileName For Binary As ftfnum
OLE1.SaveToFile (fnum)
Close ttfnum
Exit Sub
Cancel:
MsgBox "Could not save file" ' (Файл сохранен не был)
Close #fnum
End Sub
Для загрузки объекта, сохраненного как файл данных, предназначен метод ReadFromfile. Его синтаксис подобен синтаксису метода SaveToFile. Следующий
фрагмент программы реализует возможность чтения содержимого элемента управления OLE Container из файла (в котором содержимое было сохранено методом SaveToFile).
Программа 14.2. Чтение OLE-данных
Private Sub mnuFileOpen_Click()
Dim fnum As Integer
On Error GoTo Cancel
CommonDialogI.ShowOpen ' вывод на экран диалогового окна Open
Fnum = FreeFile
Open CommonDialogI.FileName For Binary As #fnum
OLE1.ReadFromFile (fnum)
Close #fnum
Exit Sub
Cancel:
MsgBox "Could not load file" ' (Файл загружен не был)
Close #fnum
End Sub
Примечание
Если значение свойства OLEType — 0 (vbOLELinked), то в указанном файле сохраняется только информация о
связи и о данных изображения. Если значение свойства OLEType — 1 (vbOLEEm), то данные из объекта сохраняются с помощью метода SaveToFile.
Если вы сохраняете файл с внедренным объектом, то с ним сохраняется следующая информация:
• имя прикладной программы, создавшей объект;
• данные объекта,
• метафайл изображения объекта;
Если вы сохраняете файл со связанным объектом, то с ним сохраняется следующая информация:
• имя прикладной программы, создавшей объект;
• имя файла-объекта;
• метафайл изображения объекта.
Данные, сохраненные методом SaveToFile, доступны только приложению-контейнеру и только с помощью метода ReadFromFile.
Названные методы являются методами Visual Basic. Они вызываются непосредственно из прикладных программ, при этом информация о формате представления исходных данных не требуется.
Использование оперативного редактирования
При запуске приложения связанный или встроенный объект отображается прямо в форме Visual Basic. Выполнив двойной щелчок на объекте, пользователь может начать его редактирование. Открыть встроенный объект для редактирования можно несколькими способами (см. параграфы " Общие свойства элемента управления OLE Container" и " Общие методы элемента управления OLE Container” далее в главе). Самый простой способ открыть приложение, предоставляющее объект для встраивания и средства редактирования (меню и панели инструментов) - выполнить двойной щелчок на объекте.
Оперативное редактирование (или оперативная активация) применяется для встроенных объектов. Пользуясь этой возможностью, можно редактировать встроенный объект внутри OLE контейнера. Функциональные возможности приложения-сервера инкорпорируются в контейнер. Оперативное редактирование доступно, если приложение-сервер поддерживает автоматизацию OLE. Если выбрать встроенный объект, то меню и панели инструментов заменят меню и панели инструментов VB-приложения (рис. 14.7). Оперативное редактирование позволяет приложению-контейнеру заимствовать функциональные возможности приложения-сервера встроенного объекта.
Рис. 14.7. Оперативное редактирование документа Word в окне элемента управления в приложении Visual Basic
Предупреждение
Некоторые приложения, использующие OLE, не могут отобразить собственные панели инструментов для оперативного редактирования объекта. Эта проблема связана с самой программой, и средствами VB-приложения не решается.