С OLE объектами в ваших формах или программах, или с компонентами ActiveX внутри элементов OLE Container можно обращаться посредством программного кода тем же самым образом, как будто бы вы программируете родные объекты Visual FoxPro.

Управление внешними свойствами объекта (несвойственными VFP)

В программном коде вы можете управлять объектом используя его свойства. Способ, при помощьи которого вы обращаетесь к свойству, зависит от статуса объекта - или он является объектом сам по себе, или является частью контейнера, такого как OLE Container control или OLE Bound control.

NoteЗамечание

ActiveX компоненты всегда являются частью OLE Container control.

Объект в контейнере имеет две части: сам объект и контейнер, в котором он размещен. Оба, и объект, и контейнер имеют свойства и, иногда, они могут иметь одинаковые имена свойств. Для гарантированного обращения к свойствам объекта, всегда добавляйте свойство контейнера Object к имени свойства. Например, приведенный ниже код обращается к свойству Left объекта:

  CopyCode imageCopy Code
frm1.olecontrol1.Object.Left = 25  && Значение Left объекта

Если же вы опустите свойство Object контейнера, то вы будете ссылаться вместо свойства Left объекта, на одноименное свойство контейнера:

  CopyCode imageCopy Code
frm1.olecontrol1.Left= 25  && Значение Left контейнера

Например, предположим, что у вас есть приложение, которое посылает электронную почту, когда пользователь щелкает на командной кнопке, отвечающей за создание документа сообщения  - "compose". Если вы добавили компонент Microsoft MAPI message в форму и обозвали его как olecontrol1, то код, ассоциированный с событием Click командной кноки должен выглядеть так, как это показано ниже:

  CopyCode imageCopy Code
THISFORM.olecontrol1.Object.Compose
THISFORM.olecontrol1.Object.Send(.T.)

Дополнительно к использованию свойства Object, для ссылки на объект, содержащейся в контейнере, вы можете использовать другие свойства этого объекта. Например, вы можете ссылкаться на свойство OLEClass (read-only)  для идентификации типа объекта в контейнере и свойство Sizable для предотвращения изменения размера объекта пользователем. Для получения более подробной информации о свойствах элемента container control смотрите OLE Container Control.

В дизайнерах форм и классов, свойства компонентов ActiveX отображаются в окне Properties Visual FoxPro, но большинство ActiveX могут иметь свой собственный интерфейс для установки общих свойств. Вы можете увидеть этот интерфейс путем выбора опции Properties специфичные для конкретного объекта из контекстного меню компонента ActiveX. Например, для того, чтобы открыть диалоговый блок Properties для элемента rich text control, выберите Microsoft RichText Control Properties из контекстного меню.

Использование внешних методов объекта

В дополнение к установке и вызову свойств объектов, вы можете управлять объектом используя поддерживаемые им методы. Например, вы можете использовать метод Add объекта коллекции Microsoft Excel для создания новой рабочей книги Microsoft Excel.

Приведенный ниже пример автоматизации использует метод Add для создания рабочей книги Excel, метод Save для ее сохранения и метод Quit для завершения работы с Excel:

Программный код Комментарии

oleApp = CREATEOBJECT("Excel.Application")

Запускает Excel.

OleApp.Visible=.T.

Отображает Excel.

OleApp.Workbooks.Add

Создает рабочую книгу.

OleApp.Cells(1,1).Value=7

Устанавливает значение для ячейки.

OleApp.ActiveWorkbook.SaveAs("C:\TEMP.XLS")

Сохраняет рабочую книгу.

OleApp.Quit

Завершает работу и выходит из Excel.

Если вы создаете объект, используя OLE Container control или OLE Bound control, вы можете использовать метод DoVerb компонента для исполнения команды на этом объекте. Например, используйте DoVerb(0) для исполнения дефолтного метода, DoVerb(– 1) для активизации объекта для визуального редактирования, и DoVerb(– 2) для открытия объекта в отдельном окне.

NoteЗамечание

Смотрите документацию приложения для определения команд, поддерживаемых автоматизацией (Automation). Например, компоненты Microsoft Excel add-in не доступны для автоматизации.

Установка времен завершения

Когда вы направляете запрос объекту OLE его обрабатывает сервер автоматизации. У вас нет больших возможностей по установке контроля над серверной обработкой, но вы можете указать -  как долго вы будете ожидать окончания процесса путем установки свойств  OLERequestPendingTimeout и OLEServerBusyTimeout. Вы можете определить, что происходит, когда время ожидания заканчивается путем установки свойства OLEServerBusyRaiseError.

Доступ к коллекциям объектов

Тип объекта может представлять либо единичный объект или коллекцию связанных объектов. Например, объект Microsoft Excel Workbook представляет собой единичную рабочую книгу, тогда как объект Workbooks представляет собой все рабочие книги, загруженные в данный момент времени. Так как объект Workbooks представляет собой коллекцию объектов, он называется объектом "коллекция".

В программном коде, коллекция представляет собой неупорядоченный список, в котором позиция объекта может изменяться всякий раз при добавлении  или удалении объектов в/из коллекции. Вы можете получить доступ к объекту коллекции путем многократного прохода по коллекции, с помощью свойства коллекции Count. Свойство Count возвращает число элементов в коллекции (items). Вы можете, кроме того, использовать дефолтный метод Item для получения доступа к конкретному элементу коллекции.

Например, для отображения имен рабочих листов в рабочей книге Microsoft Excel используйте приведенный ниже программный код:

  CopyCode imageCopy Code
oleApp = CREATEOBJECT("Excel.Application")
oleApp.Workbooks.Add
FOR EACH x IN oleApp.Workbooks
 ? x.Name
ENDFOR

Вы можете получить доступ к коллекциям, содержащимся внутри коллекций. Например, вы можете получить доступ к коллекции ячеек внутри диапазона, используя программный код, приведенный ниже:

  CopyCode imageCopy Code
oleApp = CREATEOBJECT("Excel.sheet")
oleApp.Workbooks.Add
oleApp.Range(oleApp.Cells(1,1),oleApp.Cells(10,10)).Value=100
oleApp.Visible=.T.

Использование массивов объектов

Вы можете направить массов в методы и вы можете получить его обратно. Однако, вы должны послать массив по ссылке, дополнив имя массива знаком @.

Например, для посылки массива Visual FoxPro в Microsoft Excel имейте в виду приведенный ниже код. Он создает массив в Visual FoxPro, присваивает элементам массива некоторые значения, запускает Microsoft Excel, создает рабочую книгу, устанавливает значение первой ячейки рабочего листа и затем копирует это значение в другие листа в массиве:

  CopyCode imageCopy Code
DIMENSION aV(3)
aV(1) = "Sheet1"
aV(2) = "Sheet2"
aV(3) = "Sheet3"
oleApp=CREATEOBJECT("Excel.Application")
oleApp.Workbooks.Add
oleI=oleApp.Workbooks.Item(1)
oleI.Sheets.Item(1).Cells(1,1).Value = 83
oleI.Sheets(@aV).;
 FillAcrossSheets(oleI.Worksheets("Sheet1").Cells(1,1))

oleApp.Visible = .T.

Или, в качестве альтернативы, приведенный ниже пример возвращает массив в Visual FoxPro с последующим отображением содержания массива:

  CopyCode imageCopy Code
oleApp = CREATEOBJECT("Excel.Application")
aOleArray = oleApp.GetCustomListContents(3)
FOR nIndex = 1 to ALEN(aOleArray)
   ? aOleArray(nIndex)
ENDFOR
NoteЗамечания

С Visual FoxPro, вы не можете послать массив, более чем двумерный объектам OLE. Для получения более подробной информации о работе с массива в Visual FoxPro, смотрите Arrays и Object and Member Arrays.

Освобождение (удаление) внешних объектов

Сервер автоматизации автоматически освобождает объекты, если они не видимы или если не имеется переменных в текущей области видимости, содержащих ссылки на объект. Вы можете использовать команду RELEASE для удаления переменных, связанных с объектом. Если сервер автоматизации визуально наблюдает, используйте метод Quit для его удаления.

Смотрите также