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

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

nFlags

Биты

Тип события

Описание

0

000

Объект VFP

Вызывает код метода oEventHandler перед вызовом кода события cEvent (действует по умолчанию)

1

001

"

Вызывает код события cEvent перед вызовом код метода oEventHandler

2

010

"

Не вызывает метода при программном вызове события объекта oEventSource

3

011

"

При возникновении события вызывает код события cEvent перед вызовом кода метода oEventHandler; не вызывает события (метода) при программном вызове события объекта oEventSource

4

100

Сообщение Windows

Предотвращает рекурсию в результате получения такого же сообщения в момент выполнения его обработчика

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

Код события не выполняется, только когда метод объекта oEventHandler вызывается программно и значение первого бита nFlags равно 0.

Нельзя связывать событие, параметры которого передаются по ссылке. Хотя вызов BINDEVENT( ) и не приведет к генерации ошибки, но она обнаружится при возникновении события, например в результате вызова RAISEEVENT( ).

При связывании свойства, имеющего Assign-метод, Delegate-метод может сработать дважды: первый раз при вызове Assign-метода, второй – при выполнении присваивания свойства в самом Assign-методе.

Если связывается свойство, то VFP выполняет связывание с его неявным Assign-методом. Событие возникает при изменении значения свойства.

Некоторые события, такие, как GotFocus, LostFocus, InteractiveChange и ProgrammaticChange, будучи употребленные с функцией BINDEVENT( ), не работают, если 2-й бит параметра nFlags равен 1. В таком случае они воспринимаются как методы, вызванные VFP, а не как события. То же справедливо и для метода Refresh формы.

Функция BINDEVENT( ) не поддерживает свойство Value, которое обрабатывается VFP особым образом. Взамен следует употреблять события InteractiveChange и ProgrammaticChange.

Если событие содержит команду NODEFAULT, то при связывании VFP все равно выполняет событие, поскольку перед ним мог быть вызван Delegate-метод. (Команда NODEFAULT употребляется только со встроенными событиями VFP.)

Повторный вызов BINDEVENT( ) с теми же параметрами VFP игнорируется. Условия связывания, однако, можно изменить, повторно обратившись к BINDEVENT( ) с новым значением nFlags.

Информация об установленных связях получается функцией AEVENTS( ).

Пример. Метод CloseForm формы oForm связывается функцией BINDEVENT( ) с методом ShowMess объекта oCust. При вызове RAISEEVENT( ) первоначально выполняется пользовательский метод ShowMess, выводящий сообщение "Форма будет закрыта!", а затем связанный с ним метод CloseForm, приводящий к закрытию формы oForm. Такой порядок выполнения связанных методов при вызове RAISEEVENT( ) задает последний, равный 1 параметр функции BINDEVENT( ).

public oForm

oCust = CreateObject("CustClass")

oForm = CreateObject("SomeForm")

oForm.Visible = .T.

BindEvent(oCust, "ShowMess", oForm, "CloseForm", 1)

RaiseEvent(oCust, "ShowMess")

define class CustClass as Custom

procedure ShowMess

MessageBox("Форма будет закрыта!")

endProc

endDefine

define class SomeForm as Form

procedure CloseForm

ThisForm.Release

endProc

endDefine

Если вызвать метод программно:

…

&& Устанавливаем nflags = 2

BindEvent(oCust, "ShowMess", oForm, "CloseForm", 2)

oCust.ShowMess

то после вывода процедурой ShowMess сообщения форма oForm не будет закрыта: связанный метод CloseForm не выполнится.

Если вызов функции BINDEVENT( ) оставить без изменения (с nflags = 1), то программный вызов oCust.ShowMess инициирует также и срабатывание метода CloseForm и форма закроется.

Функции

UNBINDEVENTS(oEventSource, cEvent, oEventHandler, cDelegate) )

или

UNBINDEVENTS(oEventObject)

разрывают связь между событиями, свойствами или методами объектов VFP, установленную функцией BINDEVENT( ).

Функция возвращает число прекращенных связей. Функция вернет 0, если выполняется попытка разорвать несуществующую связь.

В первом варианте разрывается связь указанного параметром cEvent события. Смысл параметров для первого варианта см. в описании функции BINDEVENT( ).

Во варианте втором разрываются все ассоциируемые с объектом oEventObject события (свойства, методы), включая как события объекта oEventObject, выступающие в качестве источников событий, так и события других объектов, связанные с Delegate-методами объекта oEventObject.

Если имеющуюся связь прервать не удается, то VFP генерирует ошибку.

Команда

READ EVENTS

начинает обработку событий.

В каждый момент времени может быть активна только одна команда READ EVENTS. Все последующие команды эффекта не имеют.

Пример см. в описании метода AddObject.

Команда

CLEAR EVENTS

завершает обработку событий, начало которой положено командой READ EVENTS.

После выполнения команды CLEAR EVENTS программа продолжает функционирования начиная со строки следующей после команды READ EVENTS.

13.5. COM-объекты

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

COM-объекты имеют такую же организацию, что и рассмотренные выше объекты VFP-классов. То есть обладают свойствами, методами и событиями.

Доступ к методам, событиям и свойствам COM-объекта осуществляется через его интерфейс, реализуемый как группа взаимосвязанных функций. В общем случае объект может поддерживать несколько интерфейсов.

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

Приложение, создавшее COM-объект и употребляемое для его редактирования, называется сервером COM-объекта.

В качестве экземпляра COM-объекта могут выступать ActiveX-элемент управления, COM-компонент или OLEBound-объект (поле типа General).

Ссылку на COM-объект возвращают функции CREATEOBJECT( ), CREATEOBJECTEX( ) и NEWOBJECT( ).

Пример. Открывается лист Microsoft Excel.

public x

set oleobject on

x = NewObject('Excel.Sheet')

x.Application.Visible = .T.

Функция

CREATEOBJECTEX(cCLSID | cPROGID, cComputerName [, cIID]) )

создает экземпляр зарегистрированного COM-объекта на удаленном компьютере. Возвращает ссылку на созданный экземпляр. Тип результата – Object.

Параметры:

cCLSID | cPROGID – идентификатор класса (CLSID) или программный идентификатор (PROGID) COM-объекта. Если задается CLSID, то COM-объект должен быть зарегистрирован на удаленном сервере, заданном параметром cComputerName. Если – PROGID, то COM-объект должен быть зарегистрирован как на локальном компьютере пользователя, так и на удаленном. Попытка использовать PROGID без регистрации сервера на локальном компьютере приведет к генерации OLE-ошибки "Invalid Class String" с кодом 0x800401f3.

Для VFP серверов Автоматизации, созданных на локальном компьютере, можно использовать свойства CLSID и PROGID для задания локальных CLSID и PROGID значений.

cComputerName – имя удаленного компьютера, на котором создается экземпляр COM-объекта. Если cComputerName – это пустая строка, то экземпляр COM-объекта создается на локальном компьютере. Параметр cComputerName поддерживает UNC-имена (universal naming convention), такие, как "\\myserver" и "myserver," и DNS-имена (domain system names).

cIID – задает GUID (глобальный уникальный идентификатор) интерфейса CLSID или PROGID, когда создается рано связываемый экземпляр класса. Если в качестве cIID передается пустая строка, то VFP пытается получить заданный по умолчанию интерфейс CLSID или PROGID.

Пример:

public x

x = CreateObjectEx("Excel.Application", "", ;

"{000208D5-0000-0000-C000-000000000046}")

&& Следующий вызов использует заданный по умолчанию интерфейс Excel.Application

&& x = CreateObjectEx("Excel.Application", "", "")

&&

&& Открываем Microsoft Excel

x.Visible = .T.

&& или:

&& x.Application.Visible = .T.

Функция CREATEOBJECTEX( ) не может быть использована вместо функции CREATEOBJECT( ).

CREATEOBJECTEX( ) поддерживает раннее связывание (на этапе компиляции) через cIID, что помогает улучшить производительность за счет отказа от многочисленных IDispatch-вызовов.

Функция

GETINTERFACE(oObject [, cIID | cInterface [, cTypelib | cProgID]])  )

обеспечивает посредством раннего связывания доступ к свойствам, методам и событиям COM-объекта. Возвращает ссылку на интерфейс COM-объекта.

Параметры:

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

cIID – задает GUID интерфейса объекта oObject. Параметр cIID может быть таким интерфейсом, как "IContextState" или GUID, например "{94631BEC-EE81-479A-AE64-A6CFC37B4799}". Если параметр – это "IDispatch", то функция GETINTERFACE( ) возвращает ссылку на поздно связываемый (на этапе исполнения) интерфейс IDispatch. Если параметр cIID не задан, то функция вернет рано связываемый интерфейс объекта.

cInterface – имя интерфейса.

cTypelib – имя библиотеки типа, содержащей класс объекта oObject.

cProgID – имя программы для поиска библиотеки типа.

Функция GETINTERFACE( ) не может быть использована для объектов VFP.

Если DLL строится на платформе Windows 9x (Windows95, Windows98 и Windows ME), то библиотека типа не включается в DLL. Когда GETINTERFACE( ) ссылается на DLL, созданную на одной из этих платформ, то в качестве третьего параметра следует использовать имя библиотеки типа, а не имя DLL, например:

oX = GetInterface(x, "IMyClass", "MyClass1.tlb")

Если DLL построена на платформе Windows XP, Windows 2000 или Windows NT, то допустим следующий вызов:

oX = GetInterface(x, "IMyClass", "MyClass1.DLL")

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

local oMTX, oContext, oContextState

local lTxnState, lGetTxnState, lDone, lGetDone

lGetDone = .F. && Начальные установки

lGetTxnState = 0

&&

oMTX = CreateObject("MTXAS.APPSERVER.1")

oContext = oMTX.GetObjectContext( )

oContextState = GetInterface(oContext, "IContextState")

&&

&& Установки активизации:

&& .T. – сделать неактивным, .F. – оставить активным

lDone = .T.

oContextState.SetDeactivateOnReturn(lDone)

oContextState.GetDeactivateOnReturn(@lGetDone)

…

&& Установки транзакции:

&& 0 – выполнить, 1 – прервать

lTxnState = 1

oContextState.SetMyTransactionVote(lTxnState)

oContextState.GetMyTransactionVote(@lGetTxnState)

Функция

GETOBJECT(cFileName | Moniker [, cClassName]) )

возвращает ссылку на объект Автоматизации. Тип возвращаемого значения – Object.

cFileName – полное имя активизируемого файла. Приложение указывать не нужно, поскольку динамическая библиотека OLE находит приложение по имени указанного файла.

Пример. Переменной mSineVar присваивается ссылка на объект Sine.xls.

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

XLApp = mSineVar.Application

XLApp.WorkBooks.Open('d:\Sine.xls')

XLApp.Visible = .T.

Moniker – идентификатор COM-объекта, имеющего IMoniker-интерфейс.

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

Пример 1. Состав массива someArray отображается в Microsoft Excel.

declare someArray(7, 4)

&& Протяженности массива someArray по первому и второму измерениям

m = Alen(someArray, 1)

n = Alen(someArray, 2)

&& Инициализация массива someArray

someArray(1, 1) = ""

for j = 2 to n

someArray(1, j) = "C" + Transform(j - 1)

next

for i = 2 to m

someArray(i, 1) = "X" + Transform(i)

for j = 2 to n

someArray(i, j) = i + j

next

next

&& Массив someArray:

&&

C1

C2

C3

&&

X1

4

5

6

&&

X2

5

6

7

&&

X3

6

7

8

&&

X4

8

9

&&

X5

7

9

10

&&

X6

8

10

11

&&

&& Ссылка на Excel.Application

XLApp = GetObject("", "Excel.Application")

&& Делаем объект видимым, добавляем рабочую книгу,

&& получаем ссылку на активный лист Excel

XLApp.Visible = .T.

XLApp.WorkBooks.Add( )

XLSheet = XLApp.ActiveSheet

&& Переносим данные массива в ячейки листа Excel

&& Результат приведен на рис. 13.7

for i = 1 to m

for j = 1 to n

XLSheet.Cells(i, j).Value = someArray(i, j)

next

next

Рис. 13.7. Массив someArray в Microsoft Excel

Пример 2. По данным массива someArray строится диаграмма Microsoft Excel.

public oXLChart1

declare someArray(7, 4)

&& Протяженности массива someArray по первому и второму измерениям

m = Alen(someArray, 1)

n = Alen(someArray, 2)

&& Код инициализации массива someArray см. в примере 1

…

&&

&& Получаем ссылку на объект Excel.Chart

oXLChart1 = GetObject("", "Excel.Chart")

XLApp = oXLChart1.Application

XLApp.Visible = .T.

XLSheet = XLApp.WorkSheets(1)

&& Передаем данные массива someArray первому листу Microsoft Excel

&& Результат приведен на рис. 13.8

for i = 1 to m

for j = 1 to n

XLSheet.Cells(i, j).Value = someArray(i, j)

next

next

Рис. 13.8. Диаграмма Microsoft Excel по данным массива someArray

Пример 3. В Microsoft Word передается строка текста.

public oWDdoc

oWDdoc = GetObject("", "Word.Basic") && Или: oWDdoc = NewObject("Word.Basic")

oWDdoc.AppShow

oWDdoc.FileNewDefault

oWDdoc.Insert('Строка из приложения VFP')

Функция

COMCLASSINFO(oObject [, nInfoType]) )

возвращает регистрационную информацию о COM-объекте. Тип результата – Character.

Функция COMCLASSINFO( ) вернет пустую строку, если регистрационная информация для указанного объекта недоступна.

Параметры:

oObject – ссылка на COM- или OLE-объект; может быть также ссылкой и на объект, созданный на основе класса VFP, например класса Form.

nInfoType – состав возвращаемой информации. Принимает приведенные в табл. 13.6 значения.

Таблица 13.6

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