Diese Artikel soll einen ersten Einblick darüber verschaffen, wie ein Windows Steuerelement (Custom Control) in eine SAP Dynpro Oberfläche zu integrieren ist. Für einen ersten Ansatz bedienen wir uns dem ohnehin schon reichhaltigen Angebot. (nicht gewußt? .. nicht schlimm!)
..und was gibt’s denn so ?
Generell hängt das davon ab, was man so installiert hat.
Z.B kommen mit der Installation des SAPGUI ca 72 Custom Controls.Informieren könnte man sich, indem man seine Festplatte oder Registry nach *.ocx absucht, oder in Excel/Word nach „Verweisen/einfügbaren Objekten“ gräbt.
Manchmal sind es allerdings auch DLL Dateien. (siehe scintilla.org ein Freeware Sourcecode Editor mit Syntax Highlighting und Code-Folding, sehr ähnlich dem neuen ABAP Editor).
Eine der populärsten Control-Collections stammt von MS selbst, genauer: „C:\WINDOWS\system32\FM20.DLL“. Diese Datei wird für das kleine Beispiel zwingend benötigt und ist auf Windows XP / Win7 standardmäßig vorhanden !
Was in dieser Wundertüte enthalten ist, kann man in Excel oder Word Toolbox etc. betrachten.
Beispiel mit Elementen der Forms 2 Collection:
Wichtiger Hinweis des Authors :
Diese Art der „Oberflächengestaltung“ bitte nicht nachmachen !
Darum geht es jetzt!
Ein Button Control (mit Uhrzeit Caption)
Wir gehen nun nach folgendem Prinzip vor:
- Erstellung einer ABAP OO-Klasse, welche das OCX Control auf Betriebssystemebene anspricht und Methoden und Events des Controls an das aufrufende ABAP weiterreicht.
- Erstellung eines Reports mit Dynpro zum Aufruf und Test der Klasse.
Die Abap OO – Klasse / the Core
Für unsere Klasse, (gern auch als „Wrapper class“ bezeichnet, wegen der „Ummantelung“ des eigentlichen Controls), legen wir mit der Transaktion SE24 oder SE80 die Klasse an.
Wir „vererben“ die Klasse CL_GUI_CONTROL und haben dadurch Zugang zum CFW, dem Control Framework. Desweiteren die Typgruppe CNTL, mit einigen wichtigen Definitionen. Durch das „Erbe“ wird auch der Constructor von CL_GUI_CONTROL vererbt, der aber für unser Control so nicht brauchbar ist und REDEFINIERT werden muß! Der Constructor ist eine sehr spezielle Methode, die eine Klasse initialisiert, bzw das Control im umgebenen Custom Container zum Vorschein bringt.
abap | | copy code | | ? |
METHOD CONSTRUCTOR . |
DATA prog_id(80). |
DATA style TYPE i. |
IF parent IS INITIAL. |
RAISE error_cntl_create. |
ENDIF. |
CLASS cl_gui_cfw DEFINITION LOAD. |
* assign prog_id to get the frontend specific control |
IF NOT activex IS INITIAL. |
prog_id = 'Forms.CommandButton.1'. |
ELSEIF NOT javabean IS INITIAL. |
RAISE gui_type_not_supported. |
ENDIF. |
IF prog_id IS INITIAL. |
RAISE gui_type_not_supported. |
ENDIF. |
* Set the window styles of the control when style parameter was not |
* set with constructor call. |
* For more information on the styles see WIN32 SDK |
IF style IS INITIAL. |
* otherwise the control would be invisible and the mistake would be |
* hard to find |
style = cl_gui_control=>ws_visible |
+ cl_gui_control=>ws_child |
+ cl_gui_control=>ws_clipsiblings. |
ENDIF. |
* Create the control |
CALL METHOD super->constructor |
EXPORTING |
clsid = prog_id |
shellstyle = style |
parent = parent |
lifetime = lifetime |
name = name |
EXCEPTIONS |
OTHERS = 1. |
IF sy-subrc <> 0. |
RAISE error_cntl_create. |
ENDIF. |
* register instance at framework |
CALL METHOD cl_gui_cfw=>subscribe |
EXPORTING |
shellid = h_control-shellid |
ref = me |
EXCEPTIONS |
OTHERS = 1. |
IF sy-subrc <> 0. |
RAISE error_cntl_create. |
ENDIF. |
* create and initialize dataprovider => m_dp_handle |
CALL FUNCTION 'DP_CREATE' |
CHANGING |
h_dp = m_dp_handle |
EXCEPTIONS |
dp_create_error = 1 |
dp_install_error = 2 |
dp_error = 3 |
OTHERS = 4. |
IF sy-subrc <> 0. |
RAISE error_dp_create. |
ENDIF. |
ENDMETHOD. |
Report YBC_TEST_COMMAND_BUTTON
abap | | copy code | | ? |
*&---------------------------------------------------------------------* |
*& Report YBC_TEST_COMMAND_BUTTON * |
*& * |
*&---------------------------------------------------------------------* |
*& * |
*& * |
*&---------------------------------------------------------------------* |
REPORT ybc_test_command_button . |
DATA: button TYPE REF TO ycl_gui_button_control. |
DATA: ccont TYPE REF TO cl_gui_custom_container. |
DATA ok_code TYPE sy-ucomm. |
DATA gv_color(4) TYPE x value '00C0E0FF'. |
*---------------------------------------------------------------------* |
* CLASS lcl_application DEFINITION |
*---------------------------------------------------------------------* |
* ........ * |
*---------------------------------------------------------------------* |
CLASS lcl_application DEFINITION. |
PUBLIC SECTION. |
METHODS: |
handle_click |
FOR EVENT click OF ycl_gui_button_control. |
ENDCLASS. "lcl_application DEFINITION |
*---------------------------------------------------------------------* |
* CLASS lcl_application IMPLEMENTATION |
*---------------------------------------------------------------------* |
* ........ * |
*---------------------------------------------------------------------* |
CLASS lcl_application IMPLEMENTATION. |
METHOD handle_click. |
PERFORM handle_click. |
ENDMETHOD. "handle_click |
ENDCLASS. "lcl_application IMPLEMENTATION |
DATA: g_application TYPE REF TO lcl_application. |
START-OF-SELECTION. |
CALL SCREEN 100. |
EXIT. |
*&---------------------------------------------------------------------* |
*& Module STATUS_0100 OUTPUT |
*&---------------------------------------------------------------------* |
* text |
*----------------------------------------------------------------------* |
MODULE status_0100 OUTPUT. |
SET PF-STATUS 'CLICK'. |
* SET TITLEBAR 'xxx'. |
IF ccont IS INITIAL. |
****Create the local event callback class |
IF g_application IS INITIAL. |
CREATE OBJECT g_application. |
ENDIF. |
****Create the container for the Button |
CREATE OBJECT ccont |
EXPORTING |
container_name = 'CCONT'. |
****Create the Button |
CREATE OBJECT button |
EXPORTING |
parent = ccont |
* LIFETIME = |
* NAME = |
EXCEPTIONS |
gui_type_not_supported = 1 |
error_cntl_create = 2 |
error_dp_create = 3 |
OTHERS = 4. |
IF sy-subrc <> 0. |
ENDIF. |
****Set Event handler for Button |
SET HANDLER g_application->handle_click FOR button. |
DATA: my_simple_event TYPE cntl_simple_event. |
DATA: my_simple_events TYPE cntl_simple_events. |
****Register button Event with CFW |
my_simple_event-eventid = button->evt_click. |
* Specify that it's an application event |
my_simple_event-appl_event = ''. |
APPEND my_simple_event TO my_simple_events. |
CALL METHOD button->set_registered_events |
EXPORTING |
events = my_simple_events |
EXCEPTIONS |
cntl_error = 1 |
cntl_system_error = 2 |
illegal_event_combination = 3 |
OTHERS = 4. |
IF sy-subrc <> 0. |
ENDIF. |
CALL METHOD button->set_backcolor |
EXPORTING |
color = gv_color. |
CALL METHOD button->set_caption |
EXPORTING |
text = 'Press to delete everything'. |
ENDIF. |
ENDMODULE. " STATUS_0100 OUTPUT |
*&---------------------------------------------------------------------* |
*& Module USER_COMMAND_0100 INPUT |
*&---------------------------------------------------------------------* |
* text |
*----------------------------------------------------------------------* |
MODULE user_command_0100 INPUT. |
CASE ok_code. |
WHEN 'BACK'. |
IF NOT button IS INITIAL. |
CALL METHOD button->free. |
FREE button. |
ENDIF. |
IF NOT ccont IS INITIAL. |
CALL METHOD ccont->free |
EXCEPTIONS |
OTHERS = 1. |
IF sy-subrc <> 0. |
* MESSAGE E002 WITH F_RETURN. |
ENDIF. |
FREE ccont. |
ENDIF. |
LEAVE PROGRAM. |
ENDCASE. |
ENDMODULE. " USER_COMMAND_0100 INPUT |
*&---------------------------------------------------------------------* |
*& Form handle_click |
*&---------------------------------------------------------------------* |
* text |
*----------------------------------------------------------------------* |
* -->PERCENTDONE text |
*----------------------------------------------------------------------* |
FORM handle_click. |
DATA rc TYPE i. |
data txtstr type string. |
data txt(40). |
* ADD 251 TO gv_color. |
* |
* CALL METHOD button->set_backcolor |
* EXPORTING |
* color = gv_color. "Rot |
CALL METHOD cl_gui_cfw=>set_new_ok_code |
EXPORTING |
new_code = 'ENT' |
IMPORTING |
rc = rc. |
write sy-uzeit to txt. |
concatenate 'Zeit:' txt into txtstr separated by space. |
CALL METHOD button->set_caption |
EXPORTING |
text = txtstr. |
ENDFORM. "handle_progress |
Das Miniprojekt im SAPLINK - format zum Downloaden