Предоставляет возможность исполнять пользовательский программный код (метод объекта) при наступлении события.

При помощи первого варианта, из приведенных ниже синтаксисов функции, вы можете использовать BINDEVENT( ) для присвоения событий, свойств или методов "родных" объектов Visual FoxPro другим объектам Visual FoxPro.

При помощи второго варианта синтаксиса, вы можете связывать события Windows Message (Win Msg).

NoteЗамечание

Если вы желаете привязаться к событиям из объектов Component Object Model (COM), используйте функцию EVENTHANDLER().

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

Параметры

oEventSource

Указывает источник события, которым должен полноценный, действительный объект Visual FoxPro.

hWnd

Указывает целочисленный дескриптор окна, которое получает Windows Messages.

Если в качестве этого параметра посылается 0, то конкретное событие (nMessage) перехватывается для всех окон.

Вы можете использовать значение свойства hWnd (Visual FoxPro) для связки Windows Messages (событий) получаемых _VFP, _SCREEN и экземпляра формы. Элементы ActiveX также могут иметь свойство hWnd.

cEvent

Указывает имя события, метода или свойства, которое вы желаете связать.

nMessage

Указывает действительное сообщение Windows Messages, которое должно быть перехвачено. Для получения более подробной информации о сообщениях Windows смотрите описания на сайте MSDN (Microsoft Developer Network).

oEventHandler

Указывает объект, который должен быть действительным объектом Visual FoxPro, обрабатывающим событие.

cDelegate

Указывает метод, или "delegate (делегат - далее по тексту будут использоваться синонимы "уполномоченный метод" и "метод-делегат". Прим.переводчика)", который обрабатывает событие для oEventHandler.

Уполномоченный метод должен иметь теже самые параметры, что и событие, указанное в cEvent. Вы можете вызвать функцию AEVENTS() для передачи объектной ссылки источника события. Если уполномоченный метод не имеет достаточного количества параметров для обработки тех, которые посылаются событием, то Visual FoxPro генерирует ошибку.

Когда осуществляется перехват событий (Win Msg), метод cDelegate должен включать в себя предложение PARAMETERS, для приема четырех параметров, которые направляются ему. Формат параметров идентичен формату функции WindowProc Windows. Для получения более подробной информации о функции WindowProc смотрите описания на сайте MSDN (Microsoft Developer Network). Метод должен вернуть целочисленное значение.

nFlags

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

Параметр nFlags игнорируется, когда создается привязка события Windows message.

nFlags Bits Тип события Описание

0

000

FoxPro object

Вызывает код метода-делегата до кода события. (По умолчанию)

1

001

FoxPro object

ВЫзывает код события до кода делегата.

2

010

FoxPro object

Не запускает событие (вызывает код делегата) простым вызовом метода.

3

011

FoxPro object

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

4

100

Windows Message

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

В приведенной ниже таблице показаны - будет или нет поднято событие, когда Bit 1 выключен или включен.

Event trigger OFF (Default) ON

Interactive

YES

YES

Programmatic

YES

NO

RAISEEVENT( )

YES

YES

Expand imageВозвращаемое значение

Численный тип данных. BINDEVENT() возвращает число привязок к событию объекта.

BINDEVENT( ) всегда возвращает 1, когда создана привязка к событию Windows message. В этом случае не производится выявления ошибки, так что в случае, если в качестве значений hWnd и nMessage были указаны недействительные величины, функция по-прежнему будет возвращать 1 и привязка будет действовать до тех пор, пока она не будет высвобождена.

Expand imageПримечания

Вы можете связывать любые действительные события, свойства или методы, включая методы Access и Assign объектов Visual FoxPro. Однако, событие и уполномоченные методы (делегаты) должны быть членами класса с областью видимости public, не являться protected или hidden.

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

Когда вы привязываете свойство, вы должны связать его напрямую, а не через метод Assign. Если же вы привязываетесь к методу Assign, имейте в виду, что методы Access и Assign маркированы, как Protected и не видимыми, за исключением видимости в пределах класса.

NoteЗамечание

Если вы привязываетесь к свойству, которое имеет метод Assign, метод-делегат может сработать дважды. Первый раз он сработает, когда производится вызов присвоения свойства. Второй раз он будет вызван, когда значение свойства будет реально установлено, внутри метода Assign, в значение параметра, которое ему передается. Метод-делегат должен предусматривать такую возможность.

Применяются обычные правила наследования. Если метод-делегат не содержит в себе никакого кода, Visual FoxPro ищет код для метода вверх по иерархии родителя.

Обработчик события вызывается, когда происходит срабатывание метода или когда он вызывается, как собственно метод. Вызов события,  как метода, поднимает событие, если вы не указали значение флага nFlags равным 2 или 3.

По умолчанию, Visual FoxPro вызывает метод-делегат до события. Однако, вы можете изменить дефолтное поведение с помощью соответствующей установки nFlags.

Если вы укажете свойство, как событие, которое вы желаете привязать, Visual FoxPro безусловно привязывает это свойство методу Assign. Когда свойство события изменяется, Visual FoxPro поднимает событие.

Если в качестве параметра было послано недействительное значение, Visual FoxPro сгенерирует ошибку, "Function argument value, type, or count is invalid." Однако, если проблема возникнет во время операции привязки, то Visual FoxPro не генерирует ошибки. Вы можете использовать возвращаемое функцией BINDEVENT( ) значение, для определения числа привязок.

Определенные события управляющих элементов такие, как GotFocus, LostFocus, InteractiveChange и ProgrammaticChange не работают, если установлен второй бит параметра nFlags, например, nFlags установлен в значение 2. Эти события Visual FoxPro внутренне рассматривает, как вызовы методов, даже несмотря на то, что они подразумеваются, как события. Аналогичное поведение применяется и к методу Refresh объекта на форме, который вызывается в случае, если вызван метод Refresh формы. Определенные события, такие, как When и Valid сработают только в том случае, если содержат в себе какой-либо код.

BINDEVENT() не поддерживает напрямую свойство Value, так как оно обслуживается Visual FoxPro особым образом. Вместо этого свойства, вы должны использовать события InteractiveChange и ProgrammaticChange, если желаете привязаться к этому значению. В дополнение к сказанному, отметьте себе, что свойство ActivePage не поддерживается.

Если оригинальное событие содержит в своем процедурном коде команду NODEFAULT, Visual FoxPro продолжает обслуживание события, по той причине, что метод-делегат содержит код и вызывается до события. NODEFAULT применяется только к "родным" объектам Visual FoxPro.

Если вы производите точный дубликат вызова BINDEVENT( ), Visual FoxPro сбрасывает вызов, но продолжит возвращать число привязок к событию объекта. Если вы измените установку nFlags, вы можете вызвать BINDEVENT() для перепривязки события.

При привязке к событиям Windows message (Win Msg), может существовать только один дескриптор hWnd для спаривания Windows message. Вы можете послать значение 0 в качестве hWnd, если вы желаете привязать все окна к одному и тому же событию Windows message. Привязка события Windows message может быть высвобождена с помощью функции UNBINDEVENTS() и командой CLEAR. Кроме того, если объект обработчика, указанный в параметре oEventHandler более не существует, привязка высвобождается, когда происходит его Windows message.

С привязкой события Windows message, ваш пользовательский код будет исполняться каждый раз, при наступлении события, включая сценарии, в который отображается модальный диалог. Это происходит потому, что Window Procedure обязана всегда обработать сообщение и вернуть результат. Поскольку возможно получение рекурсии события во время исполнения вашего, определенного для этой конкретной привязки, кода, вы можете пожелать указать значение 4 для nFlags, с целью предотвращения подобного поведения.

NoteЗамечание

Привязка к событию Windows message должна выполняться с учетом того, что ваш код привязан к событию, поднимаемому операционной системой Windows и эти события могут наступить там, где вы совсем не предполагали их.

Expand imageПример

Приведенный ниже пример показывает, как вы можете поддерживать позиционирование Class Browser с правой стороны рабочего стола Visual FoxPro, независимо от того, каким образом изменяются размеры рабочего стола BINDEVENT() ассоциирован с событием Resize системной переменной_SCREEN, или рабочим столом Visual FoxPro, с помощью который использует myresize как его делегат. Код для myresize запускается, когда поднимается событие Resize.

  CopyCode imageCopy Code
PUBLIC oHandler
oHandler=NEWOBJECT("myhandler")
DO (_browser)
BINDEVENT(_SCREEN,"Resize",oHandler,"myresize")

DEFINE CLASS myhandler AS Session
   PROCEDURE myresize
      IF ISNULL(_obrowser) THEN
         UNBINDEVENTS(THIS)
      ELSE
         _obrowser.left = _SCREEN.Width - _obrowser.width
      ENDIF
   RETURN
ENDDEFINE

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