Sapforum.Biz

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

Название: CL_GUI_SPLITTER_CONTAINER: значения eventid для событий
Отправлено: 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? Либо, если дело не в этом, как реагировать на указанные события?


Код: You are not allowed to view links. Register or Login
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 pm
Код: You are not allowed to view links. Register or Login
  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 pm
Спасибо, потом уже и сам нашел, они объявлены как Protected, напрямую через => использовать не получилось.

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

Попробовал остальные эвенты - вообще никакие не срабатывают...
Название: Re: CL_GUI_SPLITTER_CONTAINER: значения eventid для событий
Отправлено: Uukrul от Январь 29, 2010, 10:30:30 am
You are not allowed to view links. Register or Login
В зависимости от размеров областей необходимо изменять заголовок отчета.
Тип длинное, среднее и краткое? Я бы не заморачивался на таком, это уже из разряда ну очень сильный бантиков...
Название: Re: CL_GUI_SPLITTER_CONTAINER: значения eventid для событий
Отправлено: A. от Январь 29, 2010, 10:47:33 am
Ну, не совсем. На одном экране расположены три отчета, построенные на одних данных, но в разных разрезах. С помощью дивайдеров можно изменять размеры области экрана, отданных под один или другой отчет. Можно даже скрыть один или два, и оставить все пространство одному. Так вот, в зависимости от значения высоты элемента сплиттер-контейнера, необходимо выводить заголовок.

Допустим, отчет №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 am
You are not allowed to view links. Register or Login
P.S. На данный момент зашил это в PBO, но моменты срабатывания...
Ну наверное это и есть единственное решение...
Название: Re: CL_GUI_SPLITTER_CONTAINER: значения eventid для событий
Отправлено: NachDenken от Февраль 03, 2010, 11:16:56 am
сильные хотелки у ваших заказчиков  ???