События объектов 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-методы. Функция возвращает число связываний для событий объекта. Замечания:
Параметры: 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
Поскольку осуществляются вызовы и события, и ассоциированного с ним метода, причем в зависимости от значения флага в разной последовательности, в документации рекомендуется, чтобы и событие, и метод возвращали одинаковое значение. Код события не выполняется, только когда метод объекта 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. |