コンテンツフレーム起動

コンテキストメニュー 文書を SAP ライブラリストラクチャに組み込む

Dynpro のユーザインタフェースは、メニューペインタで定義し、タイプダイアログステータスを割り当てた GUI ステータス によって定義されます。各ダイアログステータスについて、標準コンテキストメニューが自動的に生成され、ユーザは、画面上で右クリックして ( または Shift+F10 を押して) 表示することができます。標準コンテキストメニューには、機能が割り当てられているすべての機能キーが表示されます。そのため、キーボードを使用して、 すべての使用可能な機能コードに簡単にアクセスすることができます。通常、アプリケーションツールバーには最も重要なものを割り当てます。 

また、標準コンテキストメニューの他に、以下の Dynpro エレメントにコンテキスト依存のメニューを定義することができます。

        入出力項目

        テキスト項目

        テーブルコントロール

        グループボックス

        従属画面

これらのエレメントのいずれかを右クリックすると、ABAP プログラムに動的コンテキストメニューを登録することができます。これにはあらゆる機能を含めることができ、機能キーに限定されません。押ボタン、チェックボックス、またはラジオボタンにコンテキストメニューを割り当てることはできません。ただし、一意の機能コードを割り当てることはできます。

グローバルクラス CL_CTMENU

コンテキストメニューは、ABAP オブジェクト のグローバルクラス CL_CTMENU のオブジェクトです。クラスライブラリでは、このクラスはフロントエンドサービスコンポーネントに属します。このコンポーネントには、コントロールフレームワークのクラスも格納されています ( カスタムコントロールを参照) 。このクラスには、プログラムで動的にコンテキストメニューを定義するためのメソッドが格納されています。テンプレートとして、メニューペインタで独自のコンテキストメニューを静的に登録することもできます。

クラス CL_CTMENU の最も重要なメソッドは以下のとおりです。

メソッド

機能

 

LOAD_GUI_STATUS

メニューペインタですでに静的に定義されているコンテキストメニューをプログラムのローカルコンテキストメニューに割り当てます。

ADD_FUNCTION

プログラムのコンテキストメニューに 1 つの機能を割り当てます。

ADD_MENU

プログラムの別のローカルコンテキストメニューを現在のローカルコンテキストメニューに割り当てます。

ADD_SUBMENU

プログラムの別のローカルコンテキストメニューを現在のローカルコンテキストメニューにカスケードメニューとして割り当てます。

ADD_SEPARATOR

セパレータを追加します。

HIDE_FUNCTIONS

機能を非表示にします。

SHOW_FUNCTIONS

機能を表示します。

DISABLE_FUNCTIONS

機能を無効化します。

ENABLE_FUNCTIONS

機能を有効化します。

SET_DEFAULT_FUNCTION

メニューが表示されたときに強調表示されるデフォルトの機能を設定します。

上の表で、" プログラムのローカルコンテキストメニュー" は、クラス CL_CTMENU のオブジェクトを意味します。CL_CTMENU は、コンテキストによってさまざまな方法で使用します。

コントロールでコンテキストメニューを使用する場合、クラスCL_CTMENU のオブジェクトを登録する必要があるかどうかは、クラスのラッパによって決まります ( 関連する機能がコントロールクラスにすでにカプセル化されている場合があります) 。通常、コントロールユーザは独自のコンテキストメニューを登録する必要はありません。これにより、コントロールのイベント処理でコンフリクトが発生することがなくなります。詳細は、個々のコントロールクラスの文書を参照してください。

Dynpro ( または一覧) にコンテキストメニューを定義する場合、プログラムに明示的に登録するのではなく、実行時環境によってクラス CL_CTMENU の関連するオブジェクトが自動的に生成されます。オブジェクトへの参照は、ABAP プログラムの特殊なコールバックルーチンのパラメータとして渡されます。

Dynpro 上のエレメントのコンテキストメニュー

コンテキストメニューを前述の Dynpro エレメントのいずれかとリンクするには、スクリーンペインタでエレメント属性のコンテキストメニュー項目に ID <context> を入力すればよいだけです。特定の Dynpro エレメントにコンテキストメニューを定義していない場合、階層上でその次に上位のエレメントからコンテキストメニューが継承されます。たとえば、独自のコンテキストメニューがないグループボックス内のすべての Dynpro エレメントには、グループボックスのコンテキストメニューが継承されます。最上位レベルはデフォルトのコンテキストメニューで、現在のダイアログステータスのすべてのキー設定が格納されています。

Dynpro エレメントがコンテキストメニュー ( 独自のコンテキストメニューまたは継承されたコンテキストメニュー) とリンクされている場合、ユーザが右クリックすると、ABAP プログラムで特殊なサブルーチン

ON_CTMENU_<context>

が呼び出されます。PAI イベントはトリガされません。コンテキストメニューを動的に定義するには、このサブルーチン ( コールバックルーチン) を使用します。これは、処理ロジックでプログラムする必要があります。サブルーチンがない場合、コンテキストメニューは表示されません。

同じコンテキストメニュー<context> を任意の数の Dynpro エレメントにリンクすることができます。その場合、これらのエレメントすべてで同じサブルーチンが使用されます。

処理ロジックでのコンテキストメニューの定義

Dynpro 上のエレメントについて呼び出すコンテキストメニューごとに、対応するコールバックルーチンをプログラムする必要があります。

FORM ON_CTMENU_<context> USING <l_menu> TYPE REF TO cl_ctmenu.
  ...
ENDFORM.

各ルーチンに、クラス CL_CTMENU の参照変数として入力される 1 つの USING パラメータが必要です。Dynpro 上のエレメントに割り当てられている各コンテキストメニューについて、実行時環境によって自動的にクラスのオブジェクトが生成されます。ユーザが右クリックによってコンテキストメニューを要求すると、該当するサブルーチンが呼び出され、対応するオブジェクトへの参照が仮パラメータに渡されます。

オブジェクトが渡されたときには、コンテキストメニューにエントリはありません。サブルーチンで、前述のオブジェクトのメソッドを使用してコンテキストメニューを動的に構築することができます。 

事前定義コンテキストメニューの使用

ダイアログステータスとダイアログボックスステータスに加えて、3 種類目の GUI ステータス 、つまりコンテキストメニューをメニューペインタで定義することができます。メニューペインタでコンテキストメニューを登録する方法については、ストラクチャのリンクコンテキストメニューの登録を参照してください。

事前定義コンテキストメニューを使用すると、静的に定義されている機能コードのグループをコンテキスト依存で使用できるようにすることができます。メソッドLOAD_GUI_STATUS を使用すると、ABAP プログラムからプログラムのローカルコンテキストメニューにコンテキストメニューをロードすることができます。通常、同じ意味を持つダイアログステータス内の機能コードをコンテキスト依存で再利用する場合には、事前定義コンテキストメニューを使用します。事前定義コンテキストメニューをプログラムのローカルコンテキストメニューにロードし、必要に応じて変更することができます ( 他の事前定義コンテキストメニューの挿入、機能の追加または削除、他のコンテキストメニューの追加など)

新しいコンテキストメニューの定義

新しいコンテキストメニューを登録するには、既存のコンテキストメニューを変更するか、新しいメニューを構築します。

コンテキストメニューには、新しい機能をいくつでも追加することができます。新しい機能を追加する際には、機能テキスト、機能コード、および機能タイプ ( たとえば、無条件モジュールコールの場合は E) を指定する必要があります。

ただし、プログラムから他のローカルコンテキストメニューを追加することもできます。この場合、他のコンテキストメニューへの参照を渡せばよいだけです ( 下記の例を参照) 。プログラムにコンテキストメニューオブジェクトの集合を登録し、必要に応じて、それを使用したり結合したりすることができます。また、サブメニューを構築することもできます。ネストが深いメニューを構築するには、既存のサブメニューにサブメニューを追加します。

人間工学に関するガイドライン

コンテキストメニューを登録する際には、以下のルールに従ってください。

        コンテキストメニュー内の機能は、プログラム内の機能のサブセットでなければなりません。事前定義コンテキストメニューを使用すると、これが保証されます。

        コンテキストメニューの個々のレベルに含めるエントリは、10 個以下でなければなりません。

        Dynpro エレメントにコンテキストメニューを使用する場合、そのエレメントに使用可能なすべての機能が含まれていなければなりません。少なくとも、 選択コピーカットペーストなどの標準コマンドが必要です。

        機能の順序は、オブジェクト固有のコマンド、コピーコマンド、その他のコマンドの順でなければなりません。

        コンテキストメニューでマウスの左ボタンを使用して選択することができる機能を繰り返すことはできません。

コンテキストメニューの表示

コールバックルーチンでコンテキストメニューを動的に定義したら、即時に画面に表示されます。ユーザがメニューから機能を選択すると、PAI イベントがトリガされ、SY-UCOMM および OK_CODE 項目に該当する機能コードが挿入されます。

次の例は、コンテキストメニューを登録する方法の一部を示しています。ただし、必ずしもスタイルガイドすべてに従っているとは限りません。

例

REPORT demo_dynpro_context_menu.

DATA: field1 TYPE i VALUE 10,
      field2 TYPE p DECIMALS 4.

DATA: prog TYPE sy-repid,
      flag(1) TYPE c VALUE 'X'.

DATA: ok_code TYPE sy-ucomm,
      save_ok TYPE sy-ucomm.

prog = sy-repid.

CALL SCREEN 100.

MODULE status_0100 OUTPUT.
   SET TITLEBAR 'TIT100'.
   IF flag = 'X'.
     SET PF-STATUS 'SCREEN_100' EXCLUDING 'REVEAL'.
   ELSEIF flag = ' '.
     SET PF-STATUS 'SCREEN_100' EXCLUDING 'HIDE'.
ENDIF.
LOOP AT SCREEN.
     IF screen-group1 = 'MOD'.
   IF flag = 'X'.
         screen-active = '1'.
       ELSEIF flag = ' '.
         screen-active = '0'.
ENDIF.
MODIFY SCREEN.
     ELSEIF screen-name = 'TEXT_IN_FRAME'.
   IF flag = 'X'.
         screen-active = '0'.
       ELSEIF flag = ' '.
         screen-active = '1'.
ENDIF.
MODIFY SCREEN.
ENDIF.
ENDLOOP.
ENDMODULE.

MODULE cancel INPUT.
   LEAVE PROGRAM.
ENDMODULE.

MODULE user_command_0100.
  save_ok = ok_code.

   CLEAR ok_code.
  CASE save_ok.
     WHEN 'HIDE'.
         flag = ' '.
     WHEN 'REVEAL'.
         flag = 'X'.
     WHEN 'SQUARE'.
       field2 = field1 ** 2.
    WHEN 'CUBE'.

       field2 = field1 ** 3.
    WHEN 'SQUAREROOT'.

       field2 = field1 ** ( 1 / 2 ).
     WHEN 'CUBICROOT'.
       field2 = field1 ** ( 1 / 3 ).
ENDCASE.
ENDMODULE.

*******************************************************
*
コールバックルーチン
*******************************************************

FORM on_ctmenu_text USING l_menu TYPE REF TO cl_ctmenu.
   CALL METHOD:l_menu->load_gui_status
                       EXPORTING program = prog
                                 status  = 'CONTEXT_MENU_1'
                                 menu    = l_menu.

ENDFORM.

FORM on_ctmenu_frame USING l_menu TYPE REF TO cl_ctmenu.
   CALL METHOD:l_menu->load_gui_status
                      EXPORTING program = prog
                                status  = 'CONTEXT_MENU_2'
                                menu    = l_menu,
              l_menu->load_gui_status
                      EXPORTING program = prog
                                status  = 'CONTEXT_MENU_1'
                                menu    = l_menu,
              l_menu->set_default_function
                      EXPORTING fcode = 'HIDE'.

ENDFORM.

FORM on_ctmenu_reveal USING l_menu TYPE REF TO cl_ctmenu.
   CALL METHOD:l_menu->load_gui_status
                      EXPORTING program = prog
                                status  = 'CONTEXT_MENU_3'
                                menu    = l_menu,
              l_menu->load_gui_status
                      EXPORTING program = prog
                                status  = 'CONTEXT_MENU_1'
                                menu    = l_menu,
              l_menu->set_default_function
                      EXPORTING fcode = 'REVEAL'.

ENDFORM.

FORM on_ctmenu_input USING l_menu TYPE REF TO cl_ctmenu.
   DATA calculate_menu TYPE REF TO cl_ctmenu.
   CREATE OBJECT calculate_menu.
   CALL METHOD: calculate_menu->add_function
                      EXPORTING fcode = 'SQUARE'
                                text  = text-001,
               calculate_menu->add_function
                       EXPORTING fcode = 'CUBE'
                                 text  = text-002,
               calculate_menu->add_function
                       EXPORTING fcode = 'SQUAREROOT'
                                 text  = text-003,
               calculate_menu->add_function
                       EXPORTING fcode = 'CUBICROOT'
                                 text  = text-004,
               l_menu->add_submenu
                       EXPORTING menu = calculate_menu
                                 text = text-005.
ENDFORM.

Dynpro 100 の次画面 ( 静的に定義) Dynpro 100 です。この Dynpro のレイアウトは次のとおりです。

このグラフィックは添付のテキストに説明されています

エレメント一覧の関連する抽出は次のとおりです。

名称

タイプ

内容

コンテキストメニュー

TEXT

テキスト

さまざまな位置における右クリック (Shift+F10)

 

TEXT

FRAME

フレーム

 

FRAME

TEXT1

テキスト

入力

INPUT

FIELD1

I/O

 

INPUT

TEXT2

テキスト

結果

 

 

FIELD2

I/O

 

 

TEXT_IN_FRAME

テキスト

イベント表示

REVEAL

エレメント TEXT2 および FIELD2 には、独自のコンテキストメニューはありません。グループボックスからコンテキストメニュー FRAME が継承されます。これらは、修正グループ MOD に割り当てられています。

制御ロジックは次のとおりです。

PROCESS BEFORE OUTPUT.
   MODULE status_0100.

PROCESS AFTER INPUT.
   MODULE cancel AT EXIT-COMMAND.
   MODULE user_command_0100.

以下の機能コードおよび GUI ステータスがこの ABAP プログラムに割り当てられています。

機能コード

BACK

CANCEL

EXIT

HIDE

REVEAL

ダイアログステータス

 

 

 

 

 

SCREEN_100

X

X

X

X

X

コンテキストメニュー

 

 

 

 

 

CONTEXT_MENU_1

X

 

 

 

 

CONTEXT_MENU_2

 

 

 

X

 

CONTEXT_MENU_3

 

 

 

 

X

この表は、各 GUI ステータスに含まれる機能コードを示しています。

ダイアログステータス SCREEN_100 は、PBO で静的に設定されます。機能コード HIDE および REVEAL は、FLAG 項目の内容によって表示/ 非表示が切り替わります。

Dynpro エレメントのコンテキストメニューは、コールバックルーチンで次のように構築されます。

TEXT:
静的コンテキストメニュー CONTEXT_MENU_1 を変更しないでロードします。このコンテキストメニューには、取消という 1 つの行があります。

FRAME:
静的コンテキストメニュー CONTEXT_MENU_2 および CONTEXT_MENU_1 から構築されます。これには、結果非表示取消という 2 つの行があります。機能コード HIDE のエントリが強調表示されます。

REVEAL:
静的コンテキストメニュー CONTEXT_MENU_3 および CONTEXT_MENU_1 から構築されます。これには、結果表示取消という 2 つの行があります。機能コード REVEAL のエントリが強調表示されます。

INPUT:
サブメニューとして 4 行のローカルコンテキストメニュー CALCULATE_MENU を追加することによって構築されます。そのためには、プログラムでクラス CL_CTMENU への参照を使用してローカル参照変数を宣言し、オブジェクトを登録して、機能コード SQUARECUBESQUAREROOT 、および CUBICROOT を追加します。INPUT のコンテキストメニューにこのコンテキストメニューを追加する際には、それが属するメニューエントリのテキストを指定する必要があります。

ユーザがプログラムを実行し、最初の行を右クリックすると、コンテキストメニュー TEXT が表示されます。2 番目の行を右クリックすると、コンテキストメニュー INPUT が表示されます。また、3 番目の行については FRAME が表示されます。4 番目の行は、プログラムによって非表示になっています。Dynpro の他のすべての領域については、すべての静的機能コードと F1 および F4 を含む標準のコンテキストメニューが表示されます。 

ユーザが新しい動的機能のいずれかを選択すると、入力項目 FIELD1 の数値にもとづいて計算が行われ、その結果が FIELD2 に挿入されます。

ユーザが結果非表示 (HIDE) を選択すると、Dynpro が動的に変更されます。4 番目の行が表示され、ユーザはコンテキストメニュー REVEAL を表示できるようになります。

 

 

 

 

コンテンツフレーム終了