Распечатать страницу

События объектов VFP

« Назад

При возникновении события вызывается процедура класса, обрабатывающее это событие. Имя процедуры совпадает с именем события.

Код процедуры, обрабатывающей событие, может быть вызван в трех следующих случаях:

1) при интерактивном событии, например ударе мышью по элементу управления;

2) программно – явное обращение к обработчику события по его имени;

3) в результате выполнения функции RAISEEVENT( ).

Функция

RAISEEVENT(oEventSource, cEvent [, eParm1, ...])

вызывает событие, метод или свойство объекта VFP.

Функция всегда возвращает .T.

Параметры:

oEventSource – ссылка на объект VFP, событие которого вызывается.

cEvent – имя вызываемого события, метода или свойства. Событие (метод, свойство) должно иметь статус PUBLIC, а не HIDDEN или PROTECTED. Метод (свойство) может быть как встроенным, например метод SetFocus класса CommandButton, так и пользовательским.

eParm1, ... – значение одного или нескольких параметров события или метода. Не употребляется, если событие (метод) параметров не имеет.

Функция RAISEEVENT( ) может быть употреблена для вызова события, связанного BINDEVENT( ) с методом другого объекта (в тех случаях, когда прямое обращение к методу не приводит к выполнению обработчика события).

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

Рекурсивные вызовы RAISEEVENT( ) с одинаковыми обязательными параметрами игнорируются.

Пример. В результате вызова RAISEEVENT( ) выполняется метод ShowMess.

oCust = CreateObject("CustClass")

RaiseEvent(oCust, "ShowMess", oCust.MessToShow) 

define class CustClass as Custom

                                            MessToShow = "Этот текст выводится в результате вызова RAISEEVENT( )"

                                            &&

                                            procedure ShowMess(Mess)

                                               MessageBox(Mess)

                                            endProc

endDefine

Пример. В результате вызова свойства выполняется его Access-метод.

oCust = CreateObject("CustClass")

RaiseEvent(oCust, "MessToShow") 

define class CustClass as Custom                                            MessToShow = "Этот текст выводится в результате вызова RAISEEVENT( )"

                                            &&

                                            procedure MessToShow_access

                                               MessageBox(Mess)

                                            endProc

endDefine

Функция

DODEFAULT([eParameter1 [, eParameter2] ...])

выполняет событие или метод родительского класса из одноименного события или метода подкласса.

Например, если функция DODEFAULT( ) размещена в обработчике события Click подкласса, то VFP выполнит обработчик события Click родительского класса.

Функция DODEFAULT( ) может быть помещена только в обработчик события или в метод.

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

Если родительский класс не имеет соответствующего события (метода), то DODEFAULT( ) не выполнит никаких действий.

Если соответствующее событие (метод) имеют в родительском классе атрибут HIDDEN, то VFP сгенерирует ошибку.

Пример. При вызове метода Test класса S2 выполнится одноименный метод класса S1.

x = CreateObject("S2")

x.Test("Работает метод Test родительского класса S1") 

define class S2 as S1

                                            procedure Test(sayWord)

                                               DoDefault(sayWord)

                                            endProc

endDefine 

define class S1 as Custom

                                            procedure Test(sayWord)

                                               wait window sayWord

                                            endProc

endDefine

Функция

BINDEVENT(oEventSource, cEvent, oEventHandler, cDelegate [, nFlags])

или

BINDEVENT(hWnd | 0, nMessage, oEventHandler, cDelegate [, nFlags])

связывает событие, свойство или метод объекта VFP (первый вариант) или Windows-сообщение (второй вариант) с событием, свойством или методом другого объекта VFP. Связываемые события (свойства, методы) должны быть PUBLIC и могут быть определены как Access- или Assign-методы.

Функция возвращает число связываний для событий объекта.

Замечания:

  1. Свойство ActivePage функцией BINDEVENT( ) не поддерживается.

  2. Связывание событий COM-объектов выполняет функция EVENTHANDLER( ).

Параметры:

oEventSource – ссылка на объект VFP, событие, свойство или метод которого связывается с другим объектом VFP.

hWnd – целочисленный идентификатор окна, получающего сообщения Windows. Если параметр равен нулю, то указанное параметром nMessage сообщение связывается для всех окон. В качестве идентификатора окна может быть использовано значение свойства hWnd формы, панели инструментов или таких объектов VFP, как _VFP и _SCREEN. Также это свойство имеют элементы управления ActiveX. Кроме того, для получения идентификатора окна пригодны функции SYS(2325), SYS(2326) и SYS(2327).

cEvent – имя связываемого события, свойства или метода.

nMessage – номер сообщения Windows. Информацию о Windows-сообщениях см. в MSDN (Microsoft Developer Network).

oEventHandler – ссылка на объект, с которым связывается событие, свойство или метод объекта oEventSource.

cDelegate – задает имя Delegate-метода, обрабатывающего событие объекта oEventHandler.

Если Delegate-метод имеет несоответствующий интерфейс, то VFP генерирует ошибку.

nFlags – битовый флаг, принимающий приведенные в табл. 13.5 значения.

Таблица 13.5

Значения параметра 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.