Sapforum.Biz

Инструменты => ABAP - Инструментальные средства => Тема розпочата: A. від Січень 28, 2010, 03:22:18 ПП

Назва: CL_GUI_SPLITTER_CONTAINER: значения eventid для событий
Відправлено: A. від Січень 28, 2010, 03:22:18 ПП
День добрый, уважаемые.

Хочу обрабатывать события 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.

Назва: Re: CL_GUI_SPLITTER_CONTAINER: значения eventid для событий
Відправлено: Dmitriy від Січень 28, 2010, 08:08:22 ПП
  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 .
Назва: Re: CL_GUI_SPLITTER_CONTAINER: значения eventid для событий
Відправлено: A. від Січень 28, 2010, 08:17:51 ПП
Спасибо, потом уже и сам нашел, они объявлены как Protected, напрямую через => использовать не получилось.

Однако, события не срабатывают! :-) Может быть сап подразумевает под этими событиями движение всего объекта-сплиттера по кастом-гуи-контейнеру? :-)
Назва: Re: CL_GUI_SPLITTER_CONTAINER: значения eventid для событий
Відправлено: Dmitriy від Січень 28, 2010, 08:29:30 ПП
Да не за что, со сплитом не доводилось работать просто, вот и заинтересовало. Тут коллега подсказывает: "думается, что move не будет ловиться...". ;)
Назва: Re: CL_GUI_SPLITTER_CONTAINER: значения eventid для событий
Відправлено: Uukrul від Січень 28, 2010, 08:32:53 ПП
Цитата: Dmitriy від Січень 28, 2010, 08:29:30 ПП
Да не за что, со сплитом не доводилось работать просто, вот и заинтересовало. Тут коллега подсказывает: "думается, что move не будет ловиться...". ;)
Мне тоже кажется что не будет, так как должен отработать абап-код, а оно находится на апликейшене, значит надо просто апликейшин при этом загрузить так, что тому мало не покажется... короче не делфи однако...
Назва: Re: CL_GUI_SPLITTER_CONTAINER: значения eventid для событий
Відправлено: A. від Січень 28, 2010, 08:39:46 ПП
Как тогда можно отловить событие изменения размеров областей в сплиттер-контейнере? Возможно, что в PAI запихнуть логику, но когда тот PAI сработает, всегда ли, когда нужно - вопрос, однако... Либо в PBO...
Назва: Re: CL_GUI_SPLITTER_CONTAINER: значения eventid для событий
Відправлено: Dmitriy від Січень 28, 2010, 09:18:18 ПП
Uukrul верно говорит про ресурсы. А использовать pai и pbo не получится.
Цитата...можно попробовать внедриться в защищенный метод и попробовать оттуда с залинковановым объектом что нибудь сотворить, но вероятность благоприятного исхода ~ 0.
Назва: Re: CL_GUI_SPLITTER_CONTAINER: значения eventid для событий
Відправлено: Uukrul від Січень 28, 2010, 09:25:32 ПП
Вопрос не по теме, а зачем ловить изменение размеров области? Вроде как элементы умеют сами подстраиваться под изменение областей.
Назва: Re: CL_GUI_SPLITTER_CONTAINER: значения eventid для событий
Відправлено: Dmitriy від Січень 28, 2010, 09:32:21 ПП
Цитата: Uukrul  link=topic=1029.msg6408#msg6408 date=1264706732
Вопрос не по теме, а зачем ловить изменение размеров области? Вроде как элементы умеют сами подстраиваться под изменение областей.
Совершенно верно, умеют. Присоединяюсь к вопросу.
Назва: Re: CL_GUI_SPLITTER_CONTAINER: значения eventid для событий
Відправлено: A. від Січень 29, 2010, 08:11:26 ДП
В зависимости от размеров областей необходимо изменять заголовок отчета.

Попробовал остальные эвенты - вообще никакие не срабатывают...
Назва: Re: CL_GUI_SPLITTER_CONTAINER: значения eventid для событий
Відправлено: Uukrul від Січень 29, 2010, 10:30:30 ДП
Цитата: A. від Січень 29, 2010, 08:11:26 ДП
В зависимости от размеров областей необходимо изменять заголовок отчета.
Тип длинное, среднее и краткое? Я бы не заморачивался на таком, это уже из разряда ну очень сильный бантиков...
Назва: Re: CL_GUI_SPLITTER_CONTAINER: значения eventid для событий
Відправлено: A. від Січень 29, 2010, 10:47:33 ДП
Ну, не совсем. На одном экране расположены три отчета, построенные на одних данных, но в разных разрезах. С помощью дивайдеров можно изменять размеры области экрана, отданных под один или другой отчет. Можно даже скрыть один или два, и оставить все пространство одному. Так вот, в зависимости от значения высоты элемента сплиттер-контейнера, необходимо выводить заголовок.

Допустим, отчет №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, но моменты срабатывания...
Назва: Re: CL_GUI_SPLITTER_CONTAINER: значения eventid для событий
Відправлено: Uukrul від Січень 29, 2010, 10:53:15 ДП
Цитата: A. від Січень 29, 2010, 10:47:33 ДП
P.S. На данный момент зашил это в PBO, но моменты срабатывания...
Ну наверное это и есть единственное решение...
Назва: Re: CL_GUI_SPLITTER_CONTAINER: значения eventid для событий
Відправлено: NachDenken від Лютий 03, 2010, 11:16:56 ДП
сильные хотелки у ваших заказчиков  ???