Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
VisualFoxPro.doc
Скачиваний:
15
Добавлен:
01.07.2025
Размер:
11 Мб
Скачать
☆

Значения параметра nInfoType

nInfoType

Что возвращается

1

Программный интерфейс объекта (ProgID) (по умолчанию)

2

Независимый от версии программный интерфейс объекта

3

Дружественное имя объекта

4

Идентификатор класса COM-объекта

5

Вид объекта. Функция вернет одно из следующих значений:  1 – объект VFP;  2 – ActiveX-элемент управления;  3 – COM-компонент;  4 – OLEBound-объект (поле General)

Пример:

mSineVar = GetObject("d:\Sine.xls")

? ComClassInfo(mSineVar, 1) && Напечатает: Excel.Sheet.8

? ComClassInfo(mSineVar, 2) && Напечатает: Excel.Sheet

? ComClassInfo(mSineVar, 3) && Напечатает: Лист Microsoft Excel

? ComClassInfo(mSineVar, 4) && Напечатает: {00020820-…-000000000046}

? ComClassInfo(mSineVar, 5) && Напечатает: 3

Замечания:

  1. Серверы Автоматизации VFP являются COM-объектами. EXE-файлы и динамические DLL-библиотеки создаются командой BUILD EXE | DLL | MTDLL.

  2. Если экземпляр ActiveX-элемента управления создается CREATEOBJECT( ), например следующим образом:

x = CreateObject("MSComCtl2.MonthView.2")

то при nInfoType = 5 COMCLASSINFO( ) вернет 3 (COM-компонент).

Функция

COMPROP(oCOMObject, cProperty [, eValue]) )

устанавливает и возвращает значения свойств UTF8 и PUTREF COM-объекта. Если параметр eValue опущен, то функция вернет текущее значение свойства cProperty.

Параметры:

oCOMObject – ссылка на COM-объект. Используется полное имя, например oForm.OLEControl1.

cProperty – имя свойства COM-объекта. Может принимать приведенные в табл. 13.7 значения.

Таблица 13.7

Значения cProperty

cProperty

Описание

UTF8

Определяет, будет ли строка UNICODE, получаемая от COM-объекта, преобразовываться в ANSI (по умолчание преобразование выполняется)

PUTREF

Устанавливает вид присваивания для свойств: "PROPERTY_PUT" (по умолчанию) или "PUTREF". В первом случае устанавливается значение, во втором – ссылка

eValue – задает вариант поведения cProperty. Принимает следующие значения:

  • 0 – используется заданное по умолчанию поведение.

  • 1 – в случае UTF8 строка UNICODE не преобразовывается в строку ANSI, а для свойства PUTREF VFP первоначально пытается использовать значение "PUTREF", а в случае неудачи употребляется присваивание "PROPERTY_PUT".

Пример:

ComProp(oForm.OLEControl1, 'PUTREF', 1)

Функция

COMARRAY(oObject [, nNewValue]) )

задает способ передачи массива COM-объекту.

Возвращает, вызванная без параметров, текущую COMARRAY-установку. Тип результата – Numeric.

Параметры:

oObject – ссылка на COM-объект.

nNewValue – число, определяющее способ передачи массива COM-объекту. Принимает приведенные в табл. 13.8 значения.

Таблица 13.8

Значения параметра nNewValue

nNewValue

Описание

0

Массив передается по значению как 0-массив

1

Массив передается по значению как 1-массив (по умолчанию)

10

Массив передается по ссылке как 0-массив

11

Массив передается по ссылке как 1-массив

100

Массив фиксированной формы (форма массива не может быть изменена COM-объектом)

1000

Byte-массивы не преобразовываются в строки

Замечание. Индекс первого элемента 0-массива равен 0; индекс первого элемента 1-массива равен 1.

Значения 100 и 1000 добавляются к значению 0, 1, 10 или 11.

Функция COMARRAY( ) применяется, только когда массив передается COM-объекту с использованием следующего синтаксиса:

oComObject.Method(@MyArray)

Когда передается Byte-массив (VT_UI1), то VFP преобразовывает его в строку, если только к nNewValue не добавлено число 1000.

Если клиент передает Byte-массив по ссылке VFP COM-серверу, то в VFP необходимо добавить к nNewValue значение 1000. Это можно выполнить в Init-событии VFP COM-сервера, например так:

ComArray(This, 1000)

Если префикс @ опущен, то COM-объекту будет передан только первый элемент массива; установка COMARRAY( ) не действует.

Пример. Массив передается COM-объекту с nNewValue = 11 + 100. Поэтому попытка изменить его размер методом RedimensionArray класса ArrayHandler приводит к ошибке.

Перед запуском примера, для проекта, содержащего определение класса

define class ArrayHandler as Custom OLEPUBLIC

procedure RedimensionArray(aArray, nRows)

dimension aArray[nRows]

endproc

endDefine

строится DLL-файл T1.dll:

build dll T1.dll from d:\Projects\ArrayHandler

При таком вызове команды BUILD DLL файл T1.dll запишется в директорию, из которой стартует VFP, возвращаемую функцией HOME(0).

Код программы, запускаемой из VFP:

local loSvr, laTest

loSvr = NewObject("t1.ArrayHandler")

dimension laTest[10]

laTest = 3 && Инициализация массива laTest

? ComArray(loSvr, 11 + 100)

&& COM-сервер вернет ошибку (рис. 13.9), поскольку выполняется попытка изменить

&& размер массива laTest, переданного с параметром nNewValue = 11 + 100

loSvr.RedimensionArray(@laTest, 4)

? Alen(laTest)

Рис. 13.9. Ошибка, полученная от COM-сервера

Ошибки не возникнет, если в качестве второго параметра взять число 10:

loSvr.RedimensionArray(@laTest, 10)

Функция

COMRETURNERROR(cExceptionSource, cExceptionText) )

заполняет структуру COM-исключения информацией, которую клиент Автоматизации может использовать для определения источника ошибки Автоматизации.

Параметры:

cExceptionSource – текст, обозначающий источник ошибки.

cExceptionText – текст для описания исключения.

При выполнении функции COMRETURNERROR( ) указанный текст помещается в структуру COM-исключения; работа текущего метода сервера Автоматизации прекращается; процесс управления передается клиенту.

Текст, помещенный в структуру COM-исключения отобразит функция AERROR( ).

Функция

EVENTHANDLER(oCOMObject, oVFPObject [, lUnbind])  )

связывает события COM-объекта с методами объекта VFP; состав методов и их интерфейс определяется составом и интерфейсом событий COM-объекта. При наличии связи вместо события COM-объекта будет выполняться соответствующий метод VFP-объекта.

Функция вернет .T., если связь установлена, или .F. – в противном случае.

Параметры:

oCOMObject – ссылка на COM-объект.

oVFPObject – ссылка на объект VFP. Класс VFP, экземпляром которого объект является, должен содержать соответствующим образом оформленную опцию IMPLEMENTS и методы с интерфейсами, повторяющими интерфейсы событий COM-объекта.

lUnbind – если употребляется со значением .T., то функция разрывает связь событий COM-объекта с методами объекта VFP.

В общем случае один COM-объект можно связать с несколькими объектами VFP и несколько COM-объектов VFP могут быть связаны с одним объектом VFP.

Связь событий автоматически прекращается, когда COM- или VFP-объект освобождается.

Пример. Связываются события COM-объекта oRS класса RecordSet библиотеки классов ADODB. Библиотека расположена в файле c:\Program Files\Common Files\System\Ado\msAdo15.dll, представляющем Microsoft ActiveX Data Objects 2.7 Library.

Библиотека классов ADODB имеет приведенные на рис. 13.10 классы; на том же рисунке приведены и события класса RecordSet.

Рис. 13.10. Классы библиотеки ADODB и события класса RecordSet

Библиотека позволяет управлять данными удаленной базы данных.

В примере создается соединение с источником данных BookSaleDataBase, имеющим в частности таблицу Authors, второе поле которой содержит фамилию и имя авторов (подробно база данных BookSale.mdb описана в разд. 16.3.2).

Выполняется запрос к таблице Authors. С результатом запроса ассоциируется объект oRS.

Затем события объекта oRS связываются с методами объекта oEvents – экземпляра определенного в программе класса MyClass. При изменении значения поля Authors в первой записи результата запроса выполняются соответствующие обработчики событий объекта oEvents и выводятся сообщения, генерируемые методом SayProgAndDateTime – имя обработчика и дата и время возникновения события (все обработчики событий обращаются к этому методу).

После изменения значения поля связь событий объектов разрывается. Осуществляется переход к следующей записи (oRS.MoveNext) и вновь изменяется значение поля Authors. Однако поскольку связь обработчиков событий разорвана, никаких сообщений не выводится: обработчики событий объекта oEvents не выполняются.

local oEvents

local oRS as adodb.RecordSet

local oConn as adodb.Connection

oEvents = NewObject("MyClass")

oConn = NewObject("adodb.Connection")

&& Устанавливаем соединение с источником данных

oConn.ConnectionString = "DSN=BookSaleDataBase"

oConn.Open

&& Выполняем запрос к таблице Authors

oRS = oConn.Execute("select * from Authors")

&& Устанавливаем связь между обработчиками событий объектов oRS и oEvents

EventHandler(oRS, oEvents)

&& Выводимые обработчиками сообщения см. после текста программы

? Upper(oRS.Fields(1).Value)

&& Разрываем связь между обработчиками событий объектов oRS и oEvents

&& Вывод сообщений прекращается

EventHandler(oRS, oEvents, .T.)

oRS.MoveNext

? Upper(oRS.Fields(1).Value)

oConn.Close

&& Определение класса MyClass

define class MyClass as Session OLEPUBLIC

implements RecordsetEvents in "adodb.RecordSet"

&&

&& Необходимо описать методы, соответствующие обработчикам

&& всех событий класса RecordSet

&&

procedure RecordSetEvents_WillChangeField(cFields as Number @, ;

Fields as Variant @, adStatus as Variant @, pRecordset as Variant @) as Variant

This.SayProgAndDateTime(Program( ))

endProc

&&

procedure RecordSetEvents_FieldChangeComplete(cFields as Number @, ;

Fields as Variant @, pError as Variant @, adStatus as Variant @, ;

pRecordset as Variant @) as Variant

This.SayProgAndDateTime(Program( ))

endProc

&&

procedure RecordSetEvents_WillChangeRecord(adReason as Variant @, ;

cRecords as Number @, adStatus as Variant @, ;

pRecordset as Variant @) as Variant

This.SayProgAndDateTime(Program( ))

endProc

&&

procedure RecordSetEvents_RecordChangeComplete(adReason as Variant @, ;

cRecords as Number @, pError as Variant @, adStatus as Variant @, ;

pRecordset as Variant @) AS Variant

This.SayProgAndDateTime(Program( ))

endProc

&&

procedure RecordSetEvents_WillChangeRecordSet(adReason as Variant @, ;

adStatus as Variant @, pRecordset as Variant @) as Variant

This.SayProgAndDateTime(Program( ))

endProc

&&

procedure RecordSetEvents_RecordSetChangeComplete(adReason as Variant @, ;

pError as Variant @, adStatus as Variant @, pRecordset as Variant @) as Variant

This.SayProgAndDateTime(Program( ))

endProc

&&

procedure RecordSetEvents_WillMove(adReason as Variant @, ;

adStatus as Variant @, pRecordset as Variant @) as Variant

This.SayProgAndDateTime(Program( ))

endProc

&&

procedure RecordSetEvents_MoveComplete(adReason as Variant @, ;

pError as Variant @, adStatus as Variant @, pRecordset as Variant @) as Variant

This.SayProgAndDateTime(Program( ))

endProc

&&

procedure RecordSetEvents_EndOfRecordset(fMoreData as Logical @, ;

adStatus as Variant @, pRecordset as Variant @) as Variant

This.SayProgAndDateTime(Program( ))

endProc

&&

procedure RecordSetEvents_FetchProgress(Progress as Number @, ;

MaxProgress as Number @, adStatus as Variant @, ;

pRecordset as Variant @) as Variant

This.SayProgAndDateTime(Program( ))

endProc

&&

procedure RecordSetEvents_FetchComplete(pError as Variant @, ;

adStatus as Variant @, pRecordset as Variant @) as Variant

This.SayProgAndDateTime(Program( ))

endProc

&&

&& Функция, вызываемая всеми обработчиками событий класса

function SayProgAndDateTime(ProgName)

? ProgName + ' ' + Transform(DateTime( ))

endFunc

endDefine

Результат:

MyClass.RecordSetEvents_WillChangeRecordSet

02/13/05 08:27:52 PM

MyClass.RecordSetEvents_RecordSetChangeComplete

02/13/05 08:27:52 PM

MyClass.RecordSetEvents_WillMove

02/13/05 08:27:52 PM

MyClass.RecordSetEvents_MoveComplete

02/13/05 08:27:52 PM

ADAMS, PAT

ADRIAN, MERV

Замечание. При перетаскивании интерфейса из браузера COM-объекта (рис. 13.11) в программу VFP генерируется следующий код (приводится его фрагмент):

x=NEWOBJECT("MyClass")

DEFINE CLASS MyClass AS session OLEPUBLIC

IMPLEMENTS RecordsetEvents IN ;

"C:\PROGRAM FILES\COMMON FILES\SYSTEM\ADO\MSADO15.DLL"

PROCEDURE RecordsetEvents_WillChangeField(cFields AS Number, ;

Fields AS VARIANT, adStatus AS VARIANT @, ;

pRecordset AS VARIANT) AS VOID

* add user code here

ENDPROC

…

ENDDEFINE

Рис. 13.11. Интерфейс RecordsetEvents можно перетащить в программу VFP

Команда

APPEND GENERAL GeneralFieldName [FROM FileName] [DATA cExpression] [LINK] [CLASS OLEClassName]

импортирует OLE-объект из файла и помещает его в general-поле. Если OLE-объект в general-поле имеется, то он будет замещен.

Опции и параметры:

GeneralFieldName – имя general-поля текущей записи, в которое помещается OLE. Если поле принадлежит нетекущей таблице, то его имя предваряется псевдонимом таблицы и точкой.

FROM FileName – имя файла, содержащего OLE-объект. Если путь опущен, то файл ищется в директории по умолчанию.

DATA cExpression – символьное выражение, значение которого передается OLE-объекту general-поля. Опция задается, если OLE-объект способен принять такой параметр. Так, нельзя передать строку рисунку Paintbrush.

LINK – устанавливает связь между OLE-объектом и файлом, содержащим этот объект (создается связанный OLE-объект). В этом случае OLE-объект появляется в general-поле, но его определение остается в файле. Если опция опущена, то выполняется внедрение OLE-объекта.

Связанные OLE-объект, если его файл редактировался независимо, отобразит все произведенные изменения. Внедренный OLE-объект их не покажет.

CLASS OLEClassName – OLE-класс OLE-объекта, отличный от класса по умолчанию. Имя класса задается, например, когда расширение файла, содержащего OLE-объект, отлично от расширения по умолчанию или когда расширение по умолчанию используется несколькими серверами Автоматизации.

Команда APPEND GENERAL GeneralFieldName, выполненная без последующих опций, удалит OLE-объект из general-поля.

Пример:

&& Таблица Test открыта и имеет general-поле с именем GenField.

select Test

&& Добавляем в поле GenField связанный OLE-объект

append general GenField from d:\Sine.xls link

&& Открываем окно для редактирования OLE-объекта

&& Приложение Excel будет вызвано после двойного удара мышью

&& в окне, открытом командой MODIFY GENERAL

modify general GenField

Замечание. Объект в general-поле можно вставить из буфера обмена, употребив Edit – Paste или Edit – Paste Special. Для очистки general-поля можно употребить Edit – Clear.

Команда

MODIFY GENERAL GeneralField1 [, GeneralField2 ...] [NOMODIFY] [NOWAIT] [[WINDOW WindowName1] [IN [WINDOW] WindowName2 | IN SCREEN]]

открывает окна редактирования general-полей GeneralField1 [, GeneralField2 ...] текущей записи. Если нужно открыть окно для поля в нетекущей таблице, то имя поля предваряется псевдонимом таблицы и точкой.

Описание опций и параметров см. в табл. 1.6.

Команда

BUILD DLL DLLFileName FROM ProjectName [RECOMPILE]

создает динамическую библиотеку (dynamic-link library – DLL), используя имеющуюся в файле проекта информацию о классах.

Опции и параметры:

DLLFileName – имя файла динамической библиотеки. Может содержать путь. Расширение по умолчанию – DLL.

FROM ProjectName – имя проекта, определения классов которого выгружаются в динамическую библиотеку.

Проект должен содержать OLEPUBLIC-класс. При отсутствии такового генерируется ошибка. Такой класс определяется либо DEFINE CLASS с опцией OLEPUBLIC, либо в проектировщике класса в результате установки флажка OLE Public в диалоге Class Info, вызываемом из меню Class.

RECOMPILE – указывает, что перед построением DLL-библиотеки проект будет откомпилирован. Компилируются все программы, формы, отчеты, коды классов и хранимые процедуры базы данных проекта.

Команда BUILD DLL автоматически регистрирует серверы в системном регистре и в списке Server Classes (классы серверов) вкладки Servers диалога Project Information, открываемом после выполнения команды меню Project – Project Info или в результате нажатия Ctrl+J или Alt+Enter.

Пример см. в описании функции COMARRAY( ).

Команда

BUILD MTDLL MTDLLFileName FROM ProjectName [RECOMPILE]

создает многониточную динамическую библиотеку, используя имеющуюся в файле проекта информацию о классах.

Смысл опций и параметров см. в описании команды BUILD DLL.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]