注册事件处理器

*----------------------------------------------------------------------*
*       CLASS c1 DEFINITION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS c1 DEFINITION."事件源
  PUBLIC SECTION.
    EVENTS: e1 EXPORTING value(p1TYPE c,e2.
    CLASS-EVENTS ce1 EXPORTING value(p2TYPE i.
    METHODS:trigger."事件触发方法
ENDCLASS.                    "c1 DEFINITION

*----------------------------------------------------------------------*
*       CLASS c1 IMPLEMENTATION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS  c1 IMPLEMENTATION.
  METHOD trigger.
    RAISE EVENT: e1 EXPORTING p1 'A',e2,ce1 EXPORTING p2 1.
  ENDMETHOD.                    "trigger
ENDCLASS.                    "c1 IMPLEMENTATION

*静态(如下面的h1方法)或非静态(如下面的h2方法)事件处理方法都可以处理静态或非静态事件,事件的处理方法是否只能处理
*静态的还是非静态事件与事件的静态与否没有关系,但事件的触发方法与事件的静态与否有关系(实例方法既可触发静态事件,也可
*触发非静态事件,但静态方法就只能触发静态事件);但是,事件的处理方法虽然能处理的事件与事件的静态与否没有关系,但如果
*处理的是静态事件,那此处理方法就成为了今天处理器,只能采用静态注册方法对此处理方法进行注册。如果处理的是非静态事件,
*那此处理方法就是非静态处理器,只能采用非静态注册方式对此处理方法进行注册
*处理器的静态与否与处理方法本身是否静态没有关系,只与处理的事件是否静态有关
*----------------------------------------------------------------------*
*       CLASS c2 DEFINITION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS c2 DEFINITION."监听器:即事件处理器
  PUBLIC SECTION.
    "静态方法也可以处理非静态事件,此方法属于非静态处理器,只能采用非静态注册方式
    CLASS-METHODS h1 FOR EVENT e1 OF c1 IMPORTING p1 sender.
    "非静态方法处理非静态事件,此方法属于非静态处理器,只能采用非静态注册方式
    METHODS:h2 FOR EVENT e2 OF c1 IMPORTING sender,
      "非静态方法当时更可以处理静态事件,此方法属于静态处理器,只能采用静态注册方式
       h3 FOR EVENT ce1 OF c1 IMPORTING p2.
ENDCLASS.                    "c2 DEFINITION
*----------------------------------------------------------------------*
*       CLASS c2 IMPLEMENTATION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS c2 IMPLEMENTATION.
  METHOD h1.
    WRITE'c2=>h1'.
  ENDMETHOD.                    "h1
  METHOD :h2.
    WRITE:'c2=>h2'.
  ENDMETHOD.                    ":h2
  METHOD:h3.
    WRITE:'c2=>h3'.
  ENDMETHOD.                    "h3
ENDCLASS.                    "c2 IMPLEMENTATION

DATA:trigger TYPE REF TO c1,
      trigger2 TYPE REF TO c1,
handler TYPE REF TO c2.

START-OF-SELECTION.
  CREATE OBJECT trigger.
  CREATE OBJECT trigger2.
  CREATE OBJECT handler.
  "由于h1、h2两个处理方法分别是用来处理非静态事件e1、e2的,所以只能采用实例注册方式
  SET HANDLER:c2=>h1 handler->h2 FOR trigger,
  "h3处理方法是用来处理静态事件ce1的,属于静态处理器,所以只能采用静态注册方法
              handler->h3.
  trigger->trigger).
  "虽然trigger( ) 方法会触发e1,e2,ce1三种事件,但h1、h2未向实例trigger2注册,而h3属于静态处理器,即好比向所有实例注册过了一样
  trigger2->trigger).

posted @ 2017-09-15 14:25  独吊东南枝  阅读(268)  评论(0编辑  收藏  举报