3

のインスタンスがありCL_SIMPLE_TREE_MODEL、イベントをトリガーして処理しCONTEXT_MENU_REQUEST、コンテキスト メニューを作成しました。

思い通りに機能を追加しました。

問題は、コンテキスト メニューからオプションの 1 つを選択しても、何も起こらないことです。つまり、プログラム フローは のハンドラ内には入りませんCONTEXT_MENU_SELECT

もちろん、コンテキスト メニューの関数をクリックすると、このイベントが発生すると想定しています。

公式ドキュメントを見つけましたが、Shift + F10でアクセスする「デフォルトのコンテキストメニュー」のみで、起動するにはプログラム内の特定のサブルーチンが必要です。

私がしたこと:

  1. そのイベントのハンドラーであるメソッドを定義して実装しました。
  2. CONTEXT_MENU_REQUESTイベントのハンドラーを設定したのと同じ場所にイベントのハンドラーを設定しました
  3. SET_REGISTERED_EVENTSそのイベントのクラス属性に ID が定義されていないため、イベントを登録しませんCONTEXT_MENU_REQUESTでした。

コード:

REPORT.

CLASS lcl_tree_handler DEFINITION.

  PUBLIC SECTION.
    METHODS:
      pbo,
      on_ctx_menu_request FOR EVENT node_context_menu_request OF cl_simple_tree_model
        IMPORTING node_key menu sender, "TYPE TM_NODEKEY CL_CTMENU
      on_ctx_menu_select FOR EVENT node_context_menu_select OF cl_simple_tree_model
        IMPORTING node_key fcode. "TYPE TM_NODEKEY SY-UCOMM
    DATA:
      po_tree_model TYPE REF TO cl_simple_tree_model,
      gt_tree       TYPE TABLE OF treemsnodt,
      control       TYPE REF TO cl_gui_control.
ENDCLASS.

CLASS lcl_tree_handler IMPLEMENTATION.

  METHOD pbo.
    DATA: lt_events TYPE cntl_simple_events,
          ls_event  TYPE cntl_simple_event.
    FIELD-SYMBOLS <gs_tree> TYPE treemsnodt.

    CHECK po_tree_model IS NOT BOUND.

    CREATE OBJECT po_tree_model
      EXPORTING
        node_selection_mode = po_tree_model->node_sel_mode_single.

    APPEND INITIAL LINE TO gt_tree ASSIGNING <gs_tree>.
    <gs_tree>-node_key = 'Node key 1'.
    <gs_tree>-text = 'First node'.
    <gs_tree>-isfolder = 'X'.
    APPEND INITIAL LINE TO gt_tree ASSIGNING <gs_tree>.
    <gs_tree>-node_key = 'Node key 2'.
    <gs_tree>-relatkey = 'Node key 1'.
    <gs_tree>-relatship = cl_tree_model=>relat_last_child.
    <gs_tree>-text = 'First child'.
    po_tree_model->add_nodes(
          node_table = gt_tree ).

    ls_event-eventid = cl_simple_tree_model=>eventid_node_context_menu_req.
    ls_event-appl_event = 'X'.              "tried with space too
    APPEND ls_event TO lt_events.

    CALL METHOD po_tree_model->set_registered_events
      EXPORTING
        events = lt_events.

    SET HANDLER on_ctx_menu_request FOR po_tree_model.
    SET HANDLER on_ctx_menu_select FOR po_tree_model.

    po_tree_model->create_tree_control(
      EXPORTING
        parent = cl_gui_container=>screen0
      IMPORTING
        control = control ).

  ENDMETHOD.

  METHOD on_ctx_menu_request.                 "I initialize the context menu object here.
    DATA: lt_chidren_keys TYPE treemnotab,
          ls_child_key    TYPE tm_nodekey,
          lv_text         TYPE gui_text.

    CALL METHOD sender->node_get_children
      EXPORTING
        node_key       = node_key
      IMPORTING
        node_key_table = lt_chidren_keys
      EXCEPTIONS
        OTHERS         = 2.

    LOOP AT lt_chidren_keys INTO ls_child_key.
      lv_text = ls_child_key.
      CALL METHOD menu->add_function
        EXPORTING
          fcode = 'ONE'
          text  = lv_text
          ftype = 'B'.
    ENDLOOP.

    menu->add_separator( ).
    CALL METHOD menu->add_function
      EXPORTING
        fcode = 'ALL'
        text  = 'All the work groups'
        ftype = 'W'.

  ENDMETHOD.

  METHOD on_ctx_menu_select.
    BREAK-POINT.                 "tried actual code here too.
  ENDMETHOD.

ENDCLASS.


DATA: go_tree_handler TYPE REF TO lcl_tree_handler.

PARAMETERS dummy.

INITIALIZATION.
  CREATE OBJECT go_tree_handler.

AT SELECTION-SCREEN OUTPUT.
  go_tree_handler->pbo( ).

AT SELECTION-SCREEN ON EXIT-COMMAND.
  go_tree_handler->control->free( ).

ツリーが表示され、右クリックするとコンテキスト メニューが表示されます。

しかし、メニュー項目を選択しても何も起動しません。何か不足していますか?

4

1 に答える 1

2

指定した関数型 (ftype = 'W'および'B') はサポートされていません (基になるドメインの固定値を確認してくださいCUA_FUNTYP)。その場合、何も起こりません。

古典的な解決策は、ftype = ' '(通常の機能)を使用することです:

    LOOP AT lt_chidren_keys INTO ls_child_key.
      lv_text = ls_child_key.
      CALL METHOD menu->add_function
        EXPORTING
          fcode = 'ONE'
          text  = lv_text
          ftype = ' '.
    ENDLOOP.

    menu->add_separator( ).
    CALL METHOD menu->add_function
      EXPORTING
        fcode = 'ALL'
        text  = 'All the work groups'
        ftype = ' '.

可能なftype値は次のとおりです (ソース: domain CUA_FUNTYP):

  • ' ' : 通常機能
  • 'H' : ヘルプ機能 (PROCESS ON HELP REQUEST)
  • 'S' : システム関数 (DYNP によって直接処理される)
  • 'T' : トランザクション呼び出し (LEAVE TO TRANSACTION)
  • 'E' : 'AT EXIT COMMAND' のモジュールにアクセス -> プレフィックスとして /E
  • 'I' : メニューを含める (実行時に置換 - サポートされていません)
  • 'N' : 'AT EXIT COMMAND' 関数、> DYNP > プレフィックスとしての /N

注意: 質問の最初のバージョンのコードには、2 番目のイベント ハンドラーの登録がありませんでしたSET HANDLER go_tree_handler->on_ctx_menu_select FOR po_tree_model.(今は問題ありません) 。

于 2012-11-07T10:51:44.933 に答える