Event vereben

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

Event vereben

Postby Max2577 » Wed Aug 25, 2010 4:24 pm

Hallo,

wie kann ich das protected Ereignis TOOLBAR_BUTTON_CLICK der Klasse CL_GUI_ALV_GRID, die dieses selbst geerbt hat, für ein eigen programmiertes ALV-Grid nutzbar gestalten ?

Protected Methoden der Oberklasse in einer selbst definierten lokalen Klasse verwendbar zu integrieren, stellt kein Problem dar.
Bsp:
CLASS lcl_gui_alv_grid DEFINITION INHERITING FROM cl_gui_alv_grid.
PUBLIC SECTION.
METHODS GET_GRID_MODIFIED_PUBLIC
EXPORTING modified TYPE i.
ENDCLASS.
CLASS lcl_gui_alv_grid IMPLEMENTATION.
METHOD GET_GRID_MODIFIED_PUBLIC.
CALL METHOD me->get_grid_modified
IMPORTING
modified = modified.
ENDMETHOD.
ENDCLASS.

Wenn so etwas mit Methoden funktioniert, könnte es doch hoffentlich auch für Events möglich sein ?

Gruß mit Dank
Mattes
Max2577
.
.
 
Posts: 6
Joined: Thu Mar 09, 2006 4:54 pm

Postby Eymen5010 » Thu Aug 26, 2010 4:56 pm

Hallo Mattes,

zuerst, ich verstehe die Frage nicht richtig:
Wenn du eine Subklasse bildest, erbt es auch die Events. D.h. das Event wird auch in der Subklasse ausgelöst. Auf dieses Event reagiert dann ein registierter Event-Controler.

Wenn du in der Subklasse auf dieses eigene Event reagieren willst, dann musst du die Klasse bzw. ein Objekt der Klasse auch als Event-Controler registrieren. Dazu sind zwei Schritte nötig:

1. Lege in der Subklasse eine Methode an, die das Event behandelt.
2. Regitriere das Objekt deiner Subklasse im Constuctor deiner Subklasse für dieses Event mit der Methode (1.)

Bedenke aber bitte, dass du damit das MVC-Modell durchbrichst. Deine View ist dann auch Controler. Das kann nötig sein, mir fällt gerade nicht das Warum ein, ist aber "unschön".
Eymen5010
...
...
 
Posts: 192
Joined: Thu Mar 27, 2008 11:08 am

Postby Max2577 » Sat Aug 28, 2010 12:31 pm

Hallo Udo,

zuerst einmal Vielen Dank für Deine Rückmeldung.

Möchte mein Anliegen in Verbindung Deiner Antwort präzisieren:

Habe in einem Report mit Dynpro & ALV_Grid eine Subklasse definiert
und mein Grid darauf instanziert:

CLASS lcl_gui_alv_grid DEFINITION INHERITING FROM cl_gui_alv_grid.
...
ENDCLASS.
CLASS lcl_gui_alv_grid IMPLEMENTATION.
...
ENDCLASS.
data: alv_grid type ref to lcl_gui_alv_grid.

Dann habe ich eine weitere lokale Klasse kreiert, die meine gewünschten Events auslösen soll.

CLASS lcl_event_receiver DEFINITION.
PUBLIC SECTION.
methods:
handle_toolbar
for event toolbar of cl_gui_alv_grid
importing e_object e_interactive,

handle_user_command
for event user_command of cl_gui_alv_grid
importing e_ucomm.

PROTECTED SECTION.
METHODS handle_toolbar_click
FOR EVENT TOOLBAR_BUTTON_CLICK OF cl_gui_alv_grid
IMPORTING fcode.
ENDCLASS.

CLASS lcl_event_receiver IMPLEMENTATION.
METHOD handle_toolbar.
data: ls_toolbar type stb_button.

clear ls_toolbar.
move 3 to ls_toolbar-butn_type.
append ls_toolbar to e_object->mt_toolbar.
clear ls_toolbar.
move 'SHOW' to ls_toolbar-function.
move icon_overview to ls_toolbar-icon.
move 'Detail-Übersicht'(011) to ls_toolbar-quickinfo.
move ' ' to ls_toolbar-disabled.
append ls_toolbar to e_object->mt_toolbar.
clear ls_toolbar.
ENDMETHOD.

METHOD handle_user_command.
case e_ucomm.
when 'SHOW'.
...
endcase.
ENDMETHOD.

METHOD handle_toolbar_click.
...
ENDMETHOD.
ENDCLASS.

Im PBO wird das ALV_Grid-Objekt nach gängiger Technik erzeugt mit den typischen weiteren Schritten, um die Daten anzuzeigen.

if container is initial.
create object container
exporting
container_name = 'CONTAINER'.
create object alv_grid
exporting
i_parent = container.

...

CREATE OBJECT event_receiver.

call method alv_grid->set_table_for_first_display
...

SET HANDLER event_receiver->handle_user_command for alv_grid.
SET HANDLER event_receiver->handle_toolbar for alv_grid.

SET HANDLER event_receiver->handle_toolbar_click FOR alv_grid.
...
endif.

Die Events event toolbar & user_command gehören der Klasse cl_gui_alv_grid und lassen sich so einwandfrei einbinden und auslösen.
Beim Event TOOLBAR_BUTTON_CLICK, welches von der Oberklasse cl_gui_alv_grid_base geerbt wird, funktioniert schon das Aktivieren nicht, da mir der Compiler meldet, dass auf die geschützte Methode handle_toolbar_click nicht zugegriffen werden darf.

Wenn ich diese Methode handle_toolbar_click in meiner lokalen Klasse als public definiere, erhalte ich die Fehlermeldung, dass der Zugriff auf das geschützte Ereignis nicht erlaubt ist.

Wo ist mein Denkfehler ?
Was lasse ich möglicherweise bei dem ganzen Prozedere ausser acht, so dass ständig ein Syntaxfehler gemeldet wird.

Diese Technik funktioniert bei vererbten Methoden einer Oberklasse einwandfrei.
Habe auch versucht das Ereignis direkt in die lokale ALV_Grid-Subklasse einzubinden oder auch direkt auf seine Oberklasse zu beziehen.

Das Ergebnis ist immer das selbe.
Der Compiler meldet einen Syntaxfehler.

Gruß Mattes
Max2577
.
.
 
Posts: 6
Joined: Thu Mar 09, 2006 4:54 pm

Postby Eymen5010 » Fri Sep 10, 2010 10:12 am

Hallo Mattes,

OK, das Event "TOOLBAR_BUTTON_CLICK" ist "Protected". Daher kann das Event nur von "CL_GUI_ALV_GRID" und deren Subklassen bzw. deren Instanzen konsumiert werden. Da kommst du auf direkten Weg nicht raus.

Mein Tipp, ohne es probiert zu haben:

In deiner Subklasse "lcl_gui_alv_grid" ein neues, Public-Event definieren. Bsp: "MY_TOOLBAR_BUTTON_CLICK". In dieser Klasse auch einen eigenen Handler für "TOOLBAR_BUTTON_CLICK" definieren und implementieren (ähnlich deiner Methode "handle_toolbar_click" in "lcl_event_receiver"). Diesen Handler im eigenen Constructor für sich selbst registrieren:
"SET HANDLER handle_toolbar_click FOR ME".
In der Methode "handle_toolbar_click" dann das eigene Event "MY_TOOLBAR_BUTTON_CLICK" auslösen. Deine Klasse "lcl_event_receiver" muss sich dann natürlich auf das neue Event "MY_TOOLBAR_BUTTON_CLICK" registrieren. Dann sieht die Kette so aus:
Die Klasse "cl_gui_alv_grid" löst das Protected Event "TOOLBAR_BUTTON_CLICK" aus. Deine Subklasse lcl_gui_alv_grid konsumiert dieses Event mit der Methode "handle_toolbar_click". In dieser Methode wird das Event "MY_TOOLBAR_BUTTON_CLICK" ausgelöst, dass dann deine Klasse "lcl_event_receiver" konsumiert. - Besser wäre zu schreiben "Instanzen der Klasse" statt "Klasse" aber ich hoffe, du verstehst, was ich meine.
Eymen5010
...
...
 
Posts: 192
Joined: Thu Mar 27, 2008 11:08 am

Postby Roxana2802 » Fri Sep 10, 2010 1:20 pm

Ich weiß zwar nicht genau warum du das Event abfangen willst aber warum benutzt du nicht einfach das Public Event USER_COMMAND?

Mfg
Stefan
Roxana2802
..
..
 
Posts: 57
Joined: Tue Sep 23, 2008 11:10 am

Postby Max2577 » Thu Sep 23, 2010 5:13 pm

Hallo allerseits,

da ich auf den Toolbar-Button "Zeile anhängen" in der Form reagieren möchte, dass ich mindestens einem Feld sofort einen Wert mitgeben möchte, muss ich wohl ein Event finden, auf das dieser Toolbar-Button reagiert.
Und genau das ist das Problem beim Public Event "User_Command".
Durch Auslösen von "Zeile anhängen" wird "User_Command" nicht angesprochen.
Z.B. bei "Filter setzen" wird "User_Command" ausgelöst oder auch bei selbstdefinierten Drucktasten.

@Udo
Natürlich freue ich mich darüber, dass Du Dir Gedanken über den Sachverhalt gemacht hast.
Nur leider verstehe ich hierzu irgendetwas nicht.
Mit Deinem Vorschlag komme ich leider nicht klar.
Entweder ich erhalte sofort den Syntax-Fehler "Bei der Definition eines Behandlers für ein Ereignis kann die Sichtbarkeit (PUBLIC, PROTECTED, PRIVATE) nicht erweitert werden"
oder ich schaffe es erst gar nicht eine Verbindung von meinem eigenen Handler mit eigenem Event zum Protected TOOLBAR_BUTTON_CLICK der Klasse cl_gui_alv_grid herzustellen, so dass während der Laufzeit überhaupt nichts passiert.

Vielen Dank für die Hilfsbereitschaft & Gruß
Mattes
Max2577
.
.
 
Posts: 6
Joined: Thu Mar 09, 2006 4:54 pm

Re: Event vereben

Postby Marc2511 » Wed Jan 09, 2013 4:19 pm

Das Thema ist alt aber soweit ich weiss bis heute ungelöst und das Event TOOLBAR_BUTTON_CLICK klingt ganz spannend. Endlich könnte man kopierte und eingefügte Zeilen in ALV-Programmen sauber unterscheiden …

Ich habe eine gute und eine schlechte Nachricht.
Die gute: Ich konnte einen Handler für dieses Event registrieren (und andere protected Events der Klasse CL_GUI_ALV_GRID_BASE).
Die schlechte: Bei einer ALV, welche auf Klasse CL_GUI_ALV_GRID basiert, ist das Event nie ausgelöst. Die Methode CL_GUI_ALV_GRID_BASE->DISPATCH, von welcher sie ev. ausgelöst sein könnten, ist im CL_GUI_ALV_GRID überschieben und dort kommen sie nicht vor.

Hier das Beispiel-Programm, welches zeigt wie kann man die protected Events der Klasse CL_GUI_ALV_GRID_BASE registrieren: http://www.kerum.pl/infodepot/00006
Vielleich hat jemand eine Idee, wie könnte man ALV dazu bringen, das Event auszulösen.

Gruss,
Kris
Marc2511
.
.
 
Posts: 2
Joined: Sat Mar 03, 2012 10:42 am


Return to ABAP Objects®

Who is online

Users browsing this forum: No registered users and 2 guests