Всем привет. Значит ситуация такая:
1) Создал класс-оболочку "zcl_editbox"(насл. от CL_GUI_CONTROL) для ActiveX контрола "Forms.TextBox.1"
1.1) Переопределил CONSTRUCTOR, SET_REGISTERED_EVENTS, DISPATCH все как положено.
2) Создал программу в которой на экране лежит контейнер и в PBO создается экземпляр zcl_editbox
3) Задача такая: отловить событие на любое изменение (onchange) в этом контроле.
И проблемма: событие совится успешно, но после первой ловли контрол как бы блокируется для дальнейшего ввода,
и лишь после того как в него ткнуть мышкой в него опять можно вводить, хотя только ОДНИН символ, и проблемма опять повторяется.
КАК РЕШИТЬ ПРОБЛЕММУ!? Я всю голову переломал. Спасибо.
код zcl_editbox:
Code:
METHOD constructor.
DATA prog_id(80).
IF parent IS INITIAL.
RAISE create_error..
ENDIF.
CLASS cl_gui_cfw DEFINITION LOAD.
IF NOT activex IS INITIAL.
prog_id = 'Forms.TextBox.1'.
ELSEIF NOT javabean IS INITIAL.
prog_id = ''.
RAISE create_error.
ENDIF.
CALL METHOD super->constructor
EXPORTING
clsid = prog_id
shellstyle = shellstyle
parent = parent
lifetime = lifetime
name = name
EXCEPTIONS
OTHERS = 1.
IF sy-subrc <> 0.
RAISE create_error.
ENDIF.
DATA: my_simple_event TYPE cntl_simple_event,
my_simple_events TYPE cntl_simple_events.
my_simple_event-eventid = 2. "OnChange
my_simple_event-appl_event = space.
APPEND my_simple_event TO my_simple_events.
CALL METHOD me->set_registered_events
EXPORTING
events = my_simple_events.
ENDMETHOD.
Code:
METHOD set_registered_events.
IF h_control IS INITIAL.
RAISE cntl_error.
ENDIF.
DATA:
simple_event TYPE cntl_simple_event,
ex_event TYPE cntl_event,
events_ex TYPE cntl_events.
LOOP AT events INTO simple_event.
ex_event-eventid = simple_event-eventid.
ex_event-is_shellevent = space.
IF simple_event-appl_event IS INITIAL.
ex_event-is_systemevent = 'X'.
ENDIF.
APPEND ex_event TO events_ex.
CLEAR simple_event.
CLEAR ex_event.
ENDLOOP.
CALL METHOD me->set_registered_events_ex
EXPORTING
eventtab = events_ex
EXCEPTIONS
OTHERS = 1.
IF sy-subrc <> 0.
RAISE cntl_error.
ENDIF.
registered_simple_events[] = events[].
ENDMETHOD.
Code:
METHOD dispatch.
CASE eventid.
WHEN 2.
DATA lv_text TYPE string.
CALL METHOD me->GET_PROPERTY
EXPORTING
property = 'Text'
IMPORTING
value = lv_text.
CALL METHOD cl_gui_cfw=>flush.
RAISE EVENT onchange EXPORTING text = lv_text.
WHEN OTHERS.
RAISE cntl_error.
ENDCASE.
ENDMETHOD.
Code:
REPORT z_testeditbox.
DATA: ok_code LIKE sy-ucomm,
my_edit TYPE REF TO zcl_editbox,
custom_container TYPE REF TO cl_gui_custom_container.
CLASS lcl_handler DEFINITION.
PUBLIC SECTION.
METHODS: onchange FOR EVENT onchange OF zcl_editbox IMPORTING text.
ENDCLASS. "lcl_handler DEFINITION
CLASS lcl_handler IMPLEMENTATION.
METHOD onchange.
message 'df' TYPE 'I'.
ENDMETHOD.
ENDCLASS. "lcl_handler IMPLEMENTATION
DATA:
handler TYPE REF TO lcl_handler.
START-OF-SELECTION.
CALL SCREEN 0100.
MODULE status_0100 OUTPUT.
IF custom_container IS INITIAL.
CREATE OBJECT custom_container
EXPORTING
container_name = 'CONTAINER'.
ENDIF.
IF my_edit IS INITIAL.
CREATE OBJECT my_edit
EXPORTING
parent = custom_container.
ENDIF.
IF handler is initial.
create object handler.
set handler handler->onchange for my_edit.
ENDIF.
ENDMODULE. " STATUS_0100 OUTPUT
MODULE user_command_0100 INPUT.
CASE ok_code.
WHEN 'EXIT'.
SET SCREEN 0.
WHEN OTHERS.
ENDCASE.
ENDMODULE.