Связывание и встраивание объектов во время выполнения программы
Рассмотрим создание и встраивание объектов во время выполнения приложения на примере приложения OLERTime (папка этой главы на компакт диске). Приложение OLERTime демонстрирует следующие возможности:
• вставку объекта;
• выбор между связыванием и встраиванием;
• установку размеров окна контейнера элемента управления или размера объекта;
• отображение информации об объекте.
Возможность встраивания и связывания объектов с элементом управления OLE Container позволяет открыть диалоговое окно Insert Object (Вставка объекта) из кода программы. В предыдущих примерах это выполнялось вручную. Операции выполняются непосредственно из окна VB-приложения пользователь может выби рать объекты и самостоятельно устанавливать некоторые их свойства. Главная форма приложения показана на рис. 14.9.
Рис. 14.9. Главное окно приложения OLERTime
После щелчка на кнопке Insert Object (Вставка объекта), приложение отображает диалоговое окно Object Type (Тип объекта) (рис. 14.10), в котором можно установить режим изменения размеров (Stretch Object) и тип OLE-связи (встраивание или связывание). Если щелкнуть на кнопке ОК, то на экране появится диалоговое окно Insert Object, в котором определяется новый объект или выбирается существующий.
Рис. 14.10. Диалоговое окно Object Type приложения OLERTime
Для проверки приложения установите переключатели в диалоговом окне Object Type (Тип объекта) в положение Stretch Container Control и Embedded, после чего щелкните на кнопке ОК. В открывшемся диалоговом окне Insert выберите объект Excel Chart. В окне элемента управления появится диаграмма, содержащая произвольные данные. Из приложения OLERTime ее можно редактировать, масштабировать (так как установлен переключатель Stretch Container Control) и даже изменять, сохраняя в отдельном файле. Приложение можно остановить, запустить и загрузить в него диаграмму из отдельного файла.
VB6 в действии: приложение OLERTime
Для разработки приложения выполните следующие действия.
1. Откройте новый проект и присвойте форме имя frmOLE. Эта форма содержит элемент управления OLE Container, пять командных (Command) кнопок (см. рис. 14.9) и элемент управления Common Dialogs.
2. При помещении элемента управления OLE Container на форму появится диалоговое окно Insert Object (Вставка объекта). Щелкните на кнопке Cancel, чтобы поместить на форму пустой контейнер. Затем измените размеры окна элемента управления OLE Container и поместите на него командные кнопки (см. рис. 14.10).
3. Добавьте к проекту новую форму и поместите на нее элементы управления (см. рис. 14.10).
4.
Сохраните все формы и проект в новой папке. После этого добавьте фрагмент программы, который позволит выполнять следующие действия:
• отображать на экране второе окно (frmType) и активизировать диалоговое окно Insert Object;
• отображать информацию об объекте.
Откройте программу обработчика события Click кнопки Insert Object и введите следующие строки.
Private Sub cmdInsObj_Click()
frmType.Show
End Sub
Для отображения информации об объекте предусмотрена кнопка Object Info (вскоре мы узнаем, как объект выбирается и вставляется). После щелчка на этой кнопке выполняется следующий фрагмент программы (oleDisplay —
имя элемента управления OLE).
Программа 14.3. Обработчик события
Click для кнопки Object Info
Private Sub cmdObjInfo_Click()
Dim SourceText As String
Dim TypeText As String
Dim MsgText As String
SourceText = "The object's source file is " + oleDisplay. SourceDoc
' (Файл объекта источника:...)
TypeText = "The type of object is " + oleDisplay.Class
' (Тип объекта:...)
MsgText = SourceText + Chr(13) + TypeText
MsgBox MsgText, vblnformation, "Object Information"
' (Информация об объекте)
End Sub
Символ ввода новой строки (vbCrLF) позволяет разбить длинное сообщение на несколько коротких строк. Если встроенный (или связанный) объект - документ Word, то отобразится следующая информация.
The object's source file is C:\My Documents\FileName
The type of object is Word.Document
(FileName будет заменено именем файла, встроенным в элемент управления OLE) На рис. 14.11 показано, что отображает кнопка Object Info, если в элемент управления OLE Container встроен объект Excel Chart. Поскольку объект Excel Chart - вновь созданный, то поле SourceDoc пусто.
Рис. 14.11. Информация, выводимая приложением OLERTime, для связанного растрового изображения
Свойства SourceDoc и Class. Кнопка Object Info позволяет отобразить значения свойств SourceDoc и Class. Значение свойства SourceDoc — это имя связанного или встроенного файла. Свойство Class устанавливает или возвращает имя класса встроенного объекта, которое, по сути, является его типом. Объекты других типов — это таблицы Excel (Excel.Sheet), растровые изображения, созданные программой Paint, и объекты, которые мы создадим в этой главе чуть позже. Если создать новый объест с помощью Excel, Word или другого (поддерживающего OLE) приложения, то у него не будет свойства SourceDoc встроенный объект - это еще не документ, который хранится в файле на диске.
Свойство Sourceltem. Свойство Sourceltem указывает на часть документа, которая встроена или связана. Во многих случаях значение этого свойства не определено, поскольку связан весь объект. Впрочем, для встраивания можно выделить только часть объекта. Нельзя выбрать часть документа Word или растрового изображения, но можно выбрать часть рабочего листа Excel. Если выбрать блок ячеек, то значение свойства Sourceltem будет, например, таким "R1C1 R1C10". Хотя приложение OLERTime позволяет выбрать файл для операции встраивания, но метод перетащить-и-опустить им не поддерживается. Поэтому ячейка, содержащая значение свойства Sourceltem, будет пустой.
Если щелкнуть на кнопке Insert Object, то на экране появится окно, в котором пользователю будет предоставлена возможность выбора типов данных Можно выбрать
Linked (Связанный) или
Embedded (Внедренный). Также можно задать размер отображаемого объекта, установив свойство SizeMode в окне Properties (Свойства) элемента управления OLE Container. Возможны такие варианты:
• "растянуть" окно элемента управления
OLE Container, чтобы подогнать его к размерам объекта (2-AutoSize);
• "растянуть" объект, чтобы подогнать его к размерам контейнера (1-Stretch).
Если пользователь выполнит щелчок на кнопке ОК, то в открывшемся диалоговом окне Insert Object (Вставка объекта) можно выбрать данные для вставки.
Вставьте командные кнопки, кнопки переключателей и рамки, изображенные на рис. 14.10. Добавьте следующий фрагмент в программу для обработчика нажатия кнопки Cancel.
Программа 14.4. Обработчик события Click для кнопки Cancel формы frmType
Option Explicit
Private Sub cmdCancel_Click()
Unload frmType
End Sub
Эта процедура закрывает приложение, выгружая форму frmType.
Установка размера окна элемента управления OLE Container. Если встраивание объектов в OLE Container происходит во время выполнения приложения, то нужно учитывать, что пользователь не может изменить размер окна элемента управления с помощью мыши. Объявим переменные OLEHeight и OLEWidth так, чтобы размеры окна элемента управления приравнивались значениям, введенным во время разработки. Чтобы непосредственно не указывать в программе значения высоты и ширины, можно использовать более гибкий способ — OLEHeight
и OLEWidth. Добавим следующие операторы в раздел объявления формы frmOLE.
Public OLEHeight As Integer
Public OLEWidth As Integer
и в обработчик события Load формы:
OLEHeight = oleDisplay.Height
OLEWidth = oleDisplay.Width
Теперь можно вернуться к форме frmType и добавить фрагмент, который позволяет организовать вызов диалогового окна Insert Object после установки опций пользователем.
Программа 14.5. Вызов диалогового окна Insert Object
Private Sub cmdOK_Click()
With frmOLE oleDisplay
.Height = frmOLE.OLEHeight
.Width = frmOLE.OLEWidth
End With
If opt3tretch0b]ect Value - True Then
frmOLE oleDisplay SizeMode - 1 ' Stretch
Else
frmOLE oleDisplay SizeMode = 2 ' AutoSize
End If
Добавление следующей строки позволяет скрыть форму.
FrmType Hide
В завершение, следующие операторы открывают диалоговое окно Insert Object и выполняют вставку объекта.
frmOLE.oleDisplay.InsertObjDlg
If frmOLE.oleDisplay.Class <> "" Then
frmOLE.cmd0b]lnfo.Enabled = True
End If
Unload frmType
Если объект вставлен, то становится доступной кнопка
Object Info.
InsertObjDIg - это метод элемента OLE Container, позволяющий выводить диалоговое окно Insert Object (Вставка объекта), для того чтобы пользователь мог создавать связанный или встроенный объект, выбирая его тип и приложение для создания объекта. Установки пользователя автоматически присваиваются значениям соответствующих свойств элемента управления OLE.
Чтобы изменить размер контейнера, выполните следующие действия.
1. Запустите приложение, а затем щелкните на кнопке Insert Object, чтобы отобразить диалоговое окно Object Type.
2. Щелкните на одной из кнопок Size Mode (Установка размера), а затем - на Object Type (Тип объекта). На экране появится диалоговое окно Insert Object (рис. 14.12).
Ниже приводится исходный текст формы frmOLE. Обратите внимание на обработчик события Resize элемента управления OLE Container. Если предусмотрена возможность изменения размеров элемента управления во время выполнения, то обработчик события Resize вызывается каждый раз, когда пользователь изменяет размеры окна. Событие Resize передает с помощью параметров HeightNew и WidthNew новые размеры окна элемента управления обработчику, который использует их для изменения размеров формы.
Insert Object
Рис. 14.12. В диалоговом окне Insert Object установлен переключатель Create from File и отображается путь к файлу данных
Программа 14.6. Форма frmOLE
Option Explicit
Private Sub cmdClose Click()
Dim Quit As String
Quit = MsgBox ("Are you sure you want to quit?" vbYesNo + vbQuestion)
' (Вы уверены, что хотите закрыть приложение?...)
If Quit = vbYes Then
End
End If
End Sub
Private Sub cmdInsObj_Click()
frmType.Show
End Sub
Private Sub cmdObjInfo_Click()
Dim SourceText As String
Dim TypeText As String
Dim MsgText As String
SourceText = "The object's source file is " + oleDisplay. SourceDoc
' (Файл объекта источника:...)
TypeText = " The type of object is " + oleDisplay.Class
' (Тип объекта:...)
MsgText = SourceText + Chr(13) + TypeText
MsgBox MsgText, vblnformation, "Object Information"
'(Информация об объекте)
End Sub
Private Sub bttnLoad_Click()
Dim fnum As Integer
On Error GoTo LoadCancel
fnum = FreeFile
CommonDialogl.ShowOpen ' Показать диалог Open File
Open CommonDialogI. FileName For Binary As #1 ' Открыть файл
oleDisplay.ReadFromFile (fnum) ' Прочитать файл No.1
Close #fnum
Exit Sub
LoadCancel:
MsgBox "Could not load file"
' (Файл не был загружен)
Close #fnum
End Sub
Private Sub bttnSave_Click()
Dim fnum As Integer
On Error GoTo SaveCancel
CommonDialogI.ShowSave ' Показать диалог Save As
fnum = FreeFile
Open CommonDialogI.FileName For Binary As #1 ' Открыть файл
oleDisplay.SaveToFile (fnum) ' Запись в файл No. 1
Close ttfnum ' Закрыть файл
Exit Sub
SaveCancel:
MsgBox "Could not save file"
' (Файл не был сохранен)
Close #fnum
End Sub
Private Sub oleDisplay_Resize(HeightNew As Single, WidthNew As Single)
frmOLE.Width = oleDisplay.Left + WidthNew + 20 * _
Screen.TwipsРеrPixelX
frmOLE.Height = oleDisplay.Top + HeightNew + 80 * _
Screen.TwipsPerPixelY
End Sub
Программа 14.7. Форма frmType
Option Explicit
Private Sub cmdCancel_Click()
Unload frmType
End Sub
Private Sub cmdOK_Click()
With frmOLE.oleDisplay
.Height = frmOLE.OLEHeight
.Width = frmOLE.OLEWidth
End With
If optStretchObject.Value = True Then
.SizeMode = 1
Else
.SizeMode = 2
End If
If optTypeEmbedded.Value = True Then
frmOLE.oleDisplay.OLETypeAllowed = 1 ' Связывание
Else
frmOLE.oleDisplay.OLETypeAllowed = 0 ' Встраивание
End If
' Скрыть форму frmType
frmTipe.Hide
' Вставка объекта
frmOLE.oleDisplay.InsertOb]Dlg
If frmOLE.oleDisplay.Class <> "" Then
frmOLE.cmdOb]Info.Enabled = True
End If
Unload frmType
End Sub
Можете попробовать встраивать различные объекты в окно элемента управления OLE формы OLERTime и редактировать их, выполняя на объекте двойной щелчок.
Вы увидите, что у элемента управления OLE Container все еще несколько расплывчатые края. Для встраивания или связывания объекта требуется время, поэтому иногда при переключении в режим редактирования панель инструментов приложения-сервера может оказаться невидимой. При программировании на Visual Basic встраивание объектов в элемент управления OLE Container используется достаточно редко. Позднее мы узнаем, как использовать автоматизацию OLE, чтобы заставить приложение-сервер выполнять требуемые действия и возвращать результаты VB-приложению.