!--a11y-->

Dynpro のユーザインタフェースは、メニューペインタで定義し、タイプダイアログステータスを割り当てた GUI ステータス によって定義されます。各ダイアログステータスについて、標準コンテキストメニューが自動的に生成され、ユーザは、画面上で右クリックして ( または Shift+F10 を押して) 表示することができます。標準コンテキストメニューには、機能が割り当てられているすべての機能キーが表示されます。そのため、キーボードを使用して、 すべての使用可能な機能コードに簡単にアクセスすることができます。通常、アプリケーションツールバーには最も重要なものを割り当てます。
また、標準コンテキストメニューの他に、以下の Dynpro エレメントにコンテキスト依存のメニューを定義することができます。
キ 入出力項目
キ テキスト項目
キ テーブルコントロール
キ グループボックス
キ 従属画面
これらのエレメントのいずれかを右クリックすると、ABAP プログラムに動的コンテキストメニューを登録することができます。これにはあらゆる機能を含めることができ、機能キーに限定されません。押ボタン、チェックボックス、またはラジオボタンにコンテキストメニューを割り当てることはできません。ただし、一意の機能コードを割り当てることはできます。
コンテキストメニューは、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 エレメントのいずれかとリンクするには、スクリーンペインタでエレメント属性のコンテキストメニュー項目に 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
への参照を使用してローカル参照変数を宣言し、オブジェクトを登録して、機能コード SQUARE
、CUBE
、SQUAREROOT
、および CUBICROOT
を追加します。INPUT
のコンテキストメニューにこのコンテキストメニューを追加する際には、それが属するメニューエントリのテキストを指定する必要があります。
ユーザがプログラムを実行し、最初の行を右クリックすると、コンテキストメニュー TEXT が表示されます。2 番目の行を右クリックすると、コンテキストメニュー INPUT が表示されます。また、3 番目の行については FRAME が表示されます。4 番目の行は、プログラムによって非表示になっています。Dynpro の他のすべての領域については、すべての静的機能コードと F1 および F4 を含む標準のコンテキストメニューが表示されます。
ユーザが新しい動的機能のいずれかを選択すると、入力項目 FIELD1 の数値にもとづいて計算が行われ、その結果が FIELD2 に挿入されます。
ユーザが結果非表示 (HIDE) を選択すると、Dynpro が動的に変更されます。4 番目の行が表示され、ユーザはコンテキストメニュー REVEAL を表示できるようになります。