Visual Basic 6. Руководство разработчика


Связывание и встраивание объектов во время выполнения программы


Рассмотрим создание и встраивание объектов во время выполнения приложения на примере приложения 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-приложению.


Содержание раздела