Sapforum.Biz
Инструменты => ABAP - Инструментальные средства => Тема начата: A. от Январь 28, 2010, 03:22:18 pm
-
День добрый, уважаемые.
Хочу обрабатывать события MOVE_CONTROL и SIZE_CONTROL для объекта класса CL_GUI_SPLITTER_CONTAINER. Делаю как обычно: создаю класс с методами-обработчиками для событий, получаю уже зарегистрированные события методом GET_REGISTERED_EVENTS, и далее надо дополнить таблицу событий, чтобы затем выполнить метод SET_REGISTERED_EVENTS. Но дело в том, что коды, которые присваиваются, неизвестны! И как узнать - неясно.
Сделал так: заполнил таблицу значениями от 1 до 20 в цикле DO, и попробовал зарегистрировать. Зарегистрировались события без ошибок, но никак не проявляются себя. Объект для класса обработки событий создан, методы обработчики событий определены через SET HANDLER для объекта сплиттера. Реакции нет. В имплементации методов стоит просто вывод сообщения MESSAGE 'foobar' TYPE 'I'.
Вопрос, собственно, в следующем: как узнать значения EventID для нужных событий для класса CL_GUI_SPLITTER_CONTAINER? Либо, если дело не в этом, как реагировать на указанные события?
DATA: g_cl_gui_splitter_cont TYPE REF TO cl_gui_splitter_container.
...
CLASS lcl_splitter_event_receiver DEFINITION.
PUBLIC SECTION.
METHODS
handle_move_control
FOR EVENT move_control OF cl_gui_splitter_container.
METHODS
handle_size_control
FOR EVENT size_control OF cl_gui_splitter_container.
ENDCLASS. "lcl_splitter_event_receiver DEFINITION
CLASS lcl_splitter_event_receiver IMPLEMENTATION.
METHOD handle_move_control.
MESSAGE 'handle_move_control' TYPE 'I'.
ENDMETHOD. "handle_move_control
METHOD handle_size_control.
MESSAGE 'handle_size_control' TYPE 'I'.
ENDMETHOD. "handle_size_control
ENDCLASS. "lcl_splitter_event_receiver IMPLEMENTATION
...
CREATE OBJECT g_cl_gui_splitter_cont
EXPORTING
parent = g_cl_gui_custom_cont
rows = 4
columns = 1
EXCEPTIONS
OTHERS = 1.
* Переменные для событий
DATA: lt_events TYPE cntl_simple_events,
l_event TYPE cntl_simple_event.
DATA: l_event_splitter_receiver TYPE REF TO lcl_splitter_event_receiver.
CLEAR: lt_events[], l_event.
* Получить уже имеющиеся
CALL METHOD g_cl_gui_splitter_cont->get_registered_events
IMPORTING
events = lt_events.
* События
DO 100 TIMES.
l_event-eventid = sy-index.
APPEND l_event TO lt_events.
ENDDO.
* Зарегистрировать события
CALL METHOD g_cl_gui_splitter_cont->set_registered_events
EXPORTING
events = lt_events
EXCEPTIONS
cntl_error = 1
cntl_system_error = 2
illegal_event_combination = 3.
* Создать объект и хэндлер
CREATE OBJECT l_event_splitter_receiver.
SET HANDLER l_event_splitter_receiver->handle_move_control FOR g_cl_gui_splitter_cont.
SET HANDLER l_event_splitter_receiver->handle_size_control FOR g_cl_gui_splitter_cont.
-
constants EVENT_LEFT_CLICK_DESIGN type I value 1 .
constants EVENT_LEFT_CLICK_RUN type I value 16 .
constants EVENT_MOVE type I value 11 .
constants EVENT_RIGHT_CLICK type I value 2 .
constants EVENT_SIZE type I value 12 .
-
Спасибо, потом уже и сам нашел, они объявлены как Protected, напрямую через => использовать не получилось.
Однако, события не срабатывают! :-) Может быть сап подразумевает под этими событиями движение всего объекта-сплиттера по кастом-гуи-контейнеру? :-)
-
Да не за что, со сплитом не доводилось работать просто, вот и заинтересовало. Тут коллега подсказывает: "думается, что move не будет ловиться...". ;)
-
Да не за что, со сплитом не доводилось работать просто, вот и заинтересовало. Тут коллега подсказывает: "думается, что move не будет ловиться...". ;)
Мне тоже кажется что не будет, так как должен отработать абап-код, а оно находится на апликейшене, значит надо просто апликейшин при этом загрузить так, что тому мало не покажется... короче не делфи однако...
-
Как тогда можно отловить событие изменения размеров областей в сплиттер-контейнере? Возможно, что в PAI запихнуть логику, но когда тот PAI сработает, всегда ли, когда нужно - вопрос, однако... Либо в PBO...
-
Uukrul верно говорит про ресурсы. А использовать pai и pbo не получится.
...можно попробовать внедриться в защищенный метод и попробовать оттуда с залинковановым объектом что нибудь сотворить, но вероятность благоприятного исхода ~ 0.
-
Вопрос не по теме, а зачем ловить изменение размеров области? Вроде как элементы умеют сами подстраиваться под изменение областей.
-
Вопрос не по теме, а зачем ловить изменение размеров области? Вроде как элементы умеют сами подстраиваться под изменение областей.
Совершенно верно, умеют. Присоединяюсь к вопросу.
-
В зависимости от размеров областей необходимо изменять заголовок отчета.
Попробовал остальные эвенты - вообще никакие не срабатывают...
-
В зависимости от размеров областей необходимо изменять заголовок отчета.
Тип длинное, среднее и краткое? Я бы не заморачивался на таком, это уже из разряда ну очень сильный бантиков...
-
Ну, не совсем. На одном экране расположены три отчета, построенные на одних данных, но в разных разрезах. С помощью дивайдеров можно изменять размеры области экрана, отданных под один или другой отчет. Можно даже скрыть один или два, и оставить все пространство одному. Так вот, в зависимости от значения высоты элемента сплиттер-контейнера, необходимо выводить заголовок.
Допустим, отчет №1 занимает 60%, отчет №2 - 38%, отчет №3 - 2%. Произвожу сравнение каждой величины с заданной константой visible_level, которая определяет, когда отчет считается видимым. В данном случае получаются видимыми отчеты №1 и №2. Ну и я присваивают SET TITLEBAR '5101' "Отчет №1 & Отчет №2". Последняя цифра кода титл-бара - это состояние, в котором могут находится отчеты. Всего таких состояний будет 7 (2^3 – 1, т.к. состояния невидимости всех отчетов нет). Для каждого состояния определен титл-бар - всего будет 7 штук. Определение состояние производится как раз на основании высот.
Можно было, конечно, сделать на закладках, или слева налабать менюшку как в Report Painter, где выбирается отчет для вывода, однако в данном случае упор сделан на то, чтобы ОДНОВРЕМЕННО видеть данные в нужных разрезах. Реализована процедура синхронного перехода и просмотра между отчета.
В общем, все на благо пользователя, остался единственный бантик - это названия писать, но как поймать событие изменения размеров частей сплиттер-контейнера - я не знаю... Перекопал SDN, всякие форумы, просто гуглил - ничего не могу найти.
P.S. На данный момент зашил это в PBO, но моменты срабатывания...
-
P.S. На данный момент зашил это в PBO, но моменты срабатывания...
Ну наверное это и есть единственное решение...
-
сильные хотелки у ваших заказчиков ???