Event Handler dynamisch registrieren

Die Objektorientierung mit ABAP®: Vererbung, Dynamische Programmierung, GUI Controls (u.a. ALV im OO).
5 Beiträge • Seite 1 von 1
5 Beiträge Seite 1 von 1

Event Handler dynamisch registrieren

Beitrag von Tommy Nightmare (ForumUser / 28 / 5 / 1 ) »
Hallo zusammen,

ich frage mich gerade, ob man Event Handler dynamisch registrieren kann.

Code: Alles auswählen.

SET HANDLER method-name.
Leider wird da der Methodenname (class=>method) erwartet, Feldsymbole, Literale oder Strings mag er nicht :(

Die Idee war, alle meine Eventhandler Methoden dynamisch zu registrieren:

Code: Alles auswählen.

    DATA lr_classdescr TYPE REF TO cl_abap_classdescr.

    DATA(lr_typedescr) = cl_abap_typedescr=>describe_by_object_ref( me ).
    lr_classdescr ?= lr_typedescr.
    LOOP AT lr_classdescr->methods ASSIGNING FIELD-SYMBOL(<s_method>).
      IF <s_method>-name(6) = 'handle'.

        SET HANDLER <s_method>-name.

      ENDIF.
    ENDLOOP.
Hat irgendjemand noch eine Idee?

LG Tommy

gesponsert
Stellenangebote auf ABAPforum.com schalten
kostenfrei für Ausbildungsberufe und Werksstudenten


Re: Event Handler dynamisch registrieren

Beitrag von a-dead-trousers (Top Expert / 4271 / 213 / 1140 ) »
Leider gibt die Syntax das (derzeit) nicht her.
Was ich in diesem Umfeld aber gerne mache, ist eine eigene MODIFY_EVENTS-Methode zu schreiben.
Dieser übergebe ich einen Parameter ACTIVATION und sofern notwendig eine Instanz deren Events registriert werden sollen.
Intern rufe ich dann SET HANDLER mit allen Methoden auf, die registriert werden müssen, sowie die Instanz und die ACTIVATION.
Somit habe ich alle (thematisch zusammengehörigen) Eventhandler-Registrierungen unter einem Dach und muss mir beim Instanzieren bzw. Finalisieren der Instanzen keine Gedanken mehr darüber machen welche einzelnen Methoden eigentlich registriert sind. Somit vergesse ich auch nie die zuvor registrierten Event-Handler wieder zu deregistrieren wenn die Instanz zerstört wird. Einfach beim Initiliaisieren ein MODIFY_EVENTS( activation = abap_true ) und beim Finalisieren MODIFY_EVENTS( activation = abap_false ).

lg ADT

P.S.:
Es gibt SYSTEM-CALLs für den Objektmanager, die einen dynmischen Aufruf ermöglichen, aber leider gibt es für das De-/Registrieren keine solchen Funktionen.
(In der SAP HIlfe nach SYSTEM-CALL suchen oder https://www.erpworkbench.com/abap-state ... all_oo.htm)
Theory is when you know something, but it doesn't work.
Practice is when something works, but you don't know why.
Programmers combine theory and practice: Nothing works and they don't know why.

ECC: 6.18
Basis: 7.50

Re: Event Handler dynamisch registrieren

Beitrag von ewx (Top Expert / 4784 / 294 / 628 ) »
Vielleicht über einen kleinen Umweg:
du baust eine eigene Klasse und registrierst die dortigen Events statisch (geht ja auch nicht anders...).
In der Handler-Routine rufst du dann dynamisch deine Methode auf.
Du musst der Klasse bei Registrierung der Handler nur die entsprechenden Handler-Methoden übergeben.

Ob das sinnvoll ist, weiss ich nicht... ;)

Code: Alles auswählen.

REPORT.


CLASS global_text_event_receiver DEFINITION.
  PUBLIC SECTION.

    TYPES: BEGIN OF ts_events_map,
             global_event TYPE string,
             object_event TYPE string,
           END OF ts_events_map,
           tt_events_map TYPE STANDARD TABLE OF ts_events_map WITH DEFAULT KEY.


    METHODS constructor
      IMPORTING
        object     TYPE REF TO cl_gui_textedit
        sender     TYPE REF TO object
        events_map TYPE tt_events_map.
    METHODS handler_doubleclick
                  FOR EVENT          dblclick OF cl_gui_textedit.
    METHODS handler_context_menu
                  FOR EVENT          context_menu OF cl_gui_textedit
      IMPORTING menu.
    METHODS handler_context_menu_selected
                  FOR EVENT context_menu_selected OF cl_gui_textedit
      IMPORTING fcode.



    DATA object TYPE REF TO cl_gui_control.
    DATA sender TYPE REF TO object.
    DATA events_map TYPE tt_events_map.

ENDCLASS.

CLASS global_text_event_receiver IMPLEMENTATION.
  METHOD constructor.
    me->sender     = sender.
    me->object     = object.
    me->events_map = events_map.

    object->register_event_dblclick( ).
    object->register_event_context_menu( ).

    SET HANDLER handler_doubleclick           FOR object.
    SET HANDLER handler_context_menu          FOR object.
    SET HANDLER handler_context_menu_selected FOR object.



  ENDMETHOD.

  METHOD handler_doubleclick.

    DATA(dyn_handler) = events_map[ global_event = 'DBLCLICK' ]-object_event.
    TRY.
        CALL METHOD sender->(dyn_handler).
      CATCH cx_sy_dyn_call_error.
    ENDTRY.
  ENDMETHOD.

  METHOD handler_context_menu.

    DATA(dyn_handler) = events_map[ global_event = 'CONTEXT_MENU' ]-object_event.
    TRY.
        CALL METHOD sender->(dyn_handler) EXPORTING menu = menu.
      CATCH cx_sy_dyn_call_error.
    ENDTRY.
  ENDMETHOD.

  METHOD handler_context_menu_selected.
    DATA(dyn_handler) = events_map[ global_event = 'CONTEXT_MENU_SELECTED' ]-object_event.
    TRY.
        CALL METHOD sender->(dyn_handler) EXPORTING fcode = fcode.
      CATCH cx_sy_dyn_call_error.
    ENDTRY.
  ENDMETHOD.

ENDCLASS.

CLASS main DEFINITION.
  PUBLIC SECTION.
    METHODS constructor IMPORTING container TYPE REF TO cl_gui_container.

    METHODS do_double_click
                  FOR EVENT          dblclick OF cl_gui_textedit.
    METHODS process_context_menu
                  FOR EVENT          context_menu OF cl_gui_textedit
      IMPORTING menu.
    METHODS process_context_menu_selected
                  FOR EVENT context_menu_selected OF cl_gui_textedit
      IMPORTING fcode.

ENDCLASS.
CLASS main IMPLEMENTATION.

  METHOD constructor.
    DATA(editor) = NEW cl_gui_textedit( parent = container ).
    DATA(events) = NEW global_text_event_receiver(
                         object     = editor
                         sender     = me
                         events_map = VALUE #(
                            ( global_event = 'DBLCLICK'              object_event = 'DO_DOUBLE_CLICK' )
                            ( global_event = 'CONTEXT_MENU'          object_event = 'PROCESS_CONTEXT_MENU' )
                            ( global_event = 'CONTEXT_MENU_SELECTED' object_event = 'PROCESS_CONTEXT_MENU_SELECTED' ) ) ).
  ENDMETHOD.

  METHOD do_double_click.
    MESSAGE 'Doubleclick funktioniert!' TYPE 'I'.
  ENDMETHOD.
  METHOD process_context_menu.
    menu->add_function(
      EXPORTING
        fcode             = 'Clickme'
        text              = 'Klickmich!'  ).

  ENDMETHOD.
  METHOD process_context_menu_selected.
    CASE fcode.
      WHEN 'Clickme'.
        MESSAGE 'Kontextmenu funktioniert!' TYPE 'I'.
    ENDCASE.
  ENDMETHOD.

ENDCLASS.

PARAMETERS p.

INITIALIZATION.
  DATA(main) = NEW main( NEW cl_gui_docking_container( side = cl_gui_docking_container=>dock_at_bottom ratio = 50 ) ).

Folgende Benutzer bedankten sich beim Autor ewx für den Beitrag:
Tommy Nightmare


Re: Event Handler dynamisch registrieren

Beitrag von ewx (Top Expert / 4784 / 294 / 628 ) »
Oder du arbeitest mit einem Interface für die Handler-Methoden.
Dann kannst du den Namen direkt angeben.

Code: Alles auswählen.

REPORT.


INTERFACE global_text_event_receiver.

  METHODS handler_doubleclick
      FOR EVENT          dblclick OF cl_gui_textedit.
  METHODS handler_context_menu
                FOR EVENT          context_menu OF cl_gui_textedit
    IMPORTING menu.
  METHODS handler_context_menu_selected
                FOR EVENT context_menu_selected OF cl_gui_textedit
    IMPORTING fcode.


ENDINTERFACE.


CLASS main DEFINITION.
  PUBLIC SECTION.
    METHODS constructor IMPORTING container TYPE REF TO cl_gui_container.

    INTERFACES global_text_event_receiver.

ENDCLASS.
CLASS main IMPLEMENTATION.

  METHOD constructor.
    DATA(editor) = NEW cl_gui_textedit( parent = container ).

    editor->register_event_dblclick( ).
    editor->register_event_context_menu( ).

    SET HANDLER global_text_event_receiver~handler_doubleclick           FOR editor.
    SET HANDLER global_text_event_receiver~handler_context_menu          FOR editor.
    SET HANDLER global_text_event_receiver~handler_context_menu_selected FOR editor.

  ENDMETHOD.

  METHOD global_text_event_receiver~handler_doubleclick.
    MESSAGE 'Doubleclick funktioniert!' TYPE 'I'.
  ENDMETHOD.
  METHOD global_text_event_receiver~handler_context_menu.
    menu->add_function(
      EXPORTING
        fcode             = 'Clickme'
        text              = 'Klickmich!'  ).

  ENDMETHOD.
  METHOD global_text_event_receiver~handler_context_menu_selected.
    CASE fcode.
      WHEN 'Clickme'.
        MESSAGE 'Kontextmenu funktioniert!' TYPE 'I'.
    ENDCASE.
  ENDMETHOD.

ENDCLASS.

PARAMETERS p.

INITIALIZATION.
  DATA(main) = NEW main( NEW cl_gui_docking_container( side = cl_gui_docking_container=>dock_at_bottom ratio = 50 ) ).

Folgende Benutzer bedankten sich beim Autor ewx für den Beitrag:
Tommy Nightmare


Re: Event Handler dynamisch registrieren

Beitrag von Tommy Nightmare (ForumUser / 28 / 5 / 1 ) »
OK Danke für die Info

Seite 1 von 1

Vergleichbare Themen

0
Antw.
1145
Views
WebDynpro: Event Handler für externes Event
von Tommy Nightmare » 20.06.2018 09:05 • Verfasst in ABAP Objects®
1
Antw.
2094
Views
Ein ComponentController-EVENT in einem View registrieren
von vmath » 12.07.2007 10:18 • Verfasst in Web Application Server
1
Antw.
1772
Views
Event Handler mit OLE
von snoodels » 10.12.2005 11:27 • Verfasst in ABAP Objects®
2
Antw.
1317
Views
OCX in VBA registrieren?
von stori » 08.05.2006 20:33 • Verfasst in ABAP Objects®
1
Antw.
13334
Views
RFC Server am Sap Gateway registrieren
von abap-strizi » 01.09.2006 11:22 • Verfasst in ABAP® Core

Über diesen Beitrag


Unterstütze die Community und teile den Beitrag für mehr Leser und Austausch

Newsletter Anmeldung

Keine Beiträge verpassen! Wöchentlich versenden wir lesenwerte Beiträge aus unserer Community.
Die letzte Ausgabe findest du hier.
Details zum Versandverfahren und zu Ihren Widerrufsmöglichkeiten findest du in unserer Datenschutzerklärung.