Event Handler dynamisch registrieren


Die Objektorientierung mit ABAP®: Vererbung, Dynamische Programmierung, GUI Controls (u.a. ALV im OO).

Moderatoren: Jan, Steff

Event Handler dynamisch registrieren

Beitragvon Tommy Nightmare » 22.11.2018, 09:50

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
Tommy Nightmare
ForumUser
 
Beiträge: 27
Registriert: 08.09.2017, 11:38
Dank erhalten: 1 mal
Ich bin: Entwickler/in

Sponsor

Alte ABAP-Entwicklerweisheit: Weißt du weder aus noch ein, baust du einen BADI ein

Re: Event Handler dynamisch registrieren

Beitragvon a-dead-trousers » 22.11.2018, 10:19

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.07
Basis: 7.40
a-dead-trousers
Top Expert
 
Beiträge: 3106
Registriert: 07.02.2011, 13:40
Dank erhalten: 767 mal
Ich bin: Entwickler/in

Re: Event Handler dynamisch registrieren

Beitragvon ewx » 22.11.2018, 10:51

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&#91; global_event = 'DBLCLICK' &#93;-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&#91; global_event = 'CONTEXT_MENU' &#93;-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&#91; global_event = 'CONTEXT_MENU_SELECTED' &#93;-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 ) ).

Für diese Nachricht hat ewx einen Dank bekommen :
Tommy Nightmare
ewx
Top Expert
 
Beiträge: 3835
Registriert: 04.08.2003, 19:55
Wohnort: Schleswig-Holstein
Dank erhalten: 320 mal

Re: Event Handler dynamisch registrieren

Beitragvon ewx » 22.11.2018, 10:51

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 ) ).

Für diese Nachricht hat ewx einen Dank bekommen :
Tommy Nightmare
ewx
Top Expert
 
Beiträge: 3835
Registriert: 04.08.2003, 19:55
Wohnort: Schleswig-Holstein
Dank erhalten: 320 mal

Re: Event Handler dynamisch registrieren

Beitragvon Tommy Nightmare » 22.11.2018, 14:39

OK Danke für die Info
Tommy Nightmare
ForumUser
 
Beiträge: 27
Registriert: 08.09.2017, 11:38
Dank erhalten: 1 mal
Ich bin: Entwickler/in


Zurück zu ABAP Objects®

  Aktuelle Beiträge   
Applikations-Toolbar dynamisch erzeugen
vor 9 Stunden von ralf.wenzel 0 Antw.
CP_BD_DIRECT_INPUT_PLAN
Gestern von Gottschall 0 Antw.
Logische Datenbank: Selektieren mit Loop
vor 4 Stunden von deejey 12 Antw.
Globale Konstanten - Organisationseinheiten
vor 13 Stunden von ralf.wenzel 5 Antw.
Kein Zugriff auf Dateien im Applikationsserver
Gestern von zzcpak 1 Antw.

  Ähnliche Beiträge beta
WebDynpro: Event Handler für externes Event
20.06.2018, 08:05 von Tommy Nightmare 0 Antw.
Event Handler mit OLE
12.12.2005, 10:58 von Arno Simon 1 Antw.
OCX in VBA registrieren?
10.05.2006, 06:48 von stori 2 Antw.
ALV-Tree Ereignis registrieren
17.05.2005, 13:25 von RiffRaff 5 Antw.
Handler- und ALV-Problem
19.12.2011, 14:24 von a-dead-trousers 8 Antw.

 

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder