数据:lo_toolbar TYPE REF TO cl_gui_toolbar。
lo_Tree->get_toolbar_object(
IMPORTING
er_toolbar = lo_toolbar " Toolbar Object
).
lo_toolbar->delete_all_buttons(
EXCEPTIONS
cntl_error = 1
others = 2
).
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
"add my own buttons
lo_toolbar->add_button(
EXPORTING
fcode = 'ADDROOT' " Function Code Associated with Button
icon = '@04@' " Icon Name Defined Like "@0a@"
butn_type = cntb_btype_button " Button Types Defined in CNTB
quickinfo = 'Create new portfolio' " Purpose of Button Text
EXCEPTIONS
cntl_error = 1
cntb_btype_error = 2
cntb_error_fcode = 3
others = 4
).
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
我有类cl_gui_alv_tree的实例。我想删除工具栏中的标准按钮并添加我自己的按钮。所以我调用get_toolbar_object
及其方法delete_all_buttons,但它不起作用。输出是我的按钮在第一个位置,然后是标准按钮。你能帮我吗?
如果检查名为"delete_all_buttons"的方法内部的代码,则会看到对另一个名为"call_method"的方法的调用。这只是一个调用,也就是方法的动态方法调用,可以作为参数传递,然后你会看到很多这样的行:(如果听起来很奇怪,也就是说,动态方法调用是如何构建的,请不要担心。至少有一种方法,但在这种情况下,我们处理的ABAP和OLE超出了这个范围)。
WHEN 3.
CALL METHOD OF H_CONTROL-OBJ VERB = RESULT NO FLUSH
EXPORTING #1 = P1
#2 = P2
#3 = P3.
或者类似的:
WHEN 14.
CALL METHOD OF H_CONTROL-OBJ VERB = RESULT NO FLUSH QUEUEONLY
EXPORTING #1 = P1
#2 = P2
#3 = P3
#4 = P4
#5 = P5
#6 = P6
#7 = P7
#8 = P8
#9 = P9
#10 = P10
#11 = P11
#12 = P12
#13 = P13
#14 = P14.
您应该注意的是关键字"NO FLUSH"和/或"QUEUE ONLY"。
要了解更多信息,请标记它们并按F1。OLE-文档告诉你更多,如果需要。
它们意味着,无论对后端的对象表示器进行了什么更改,sapgui前端都不会得到通知,只有后端知道新状态、更改、删除等。
一般来说,任何pbo/pai都应该同步前端和后端,事实上,我甚至认为,只有那些设置了QUEUEONLY的pbo/pai才会在下一个周期自动同步。
如果要强制同步,只需调用gui类控制框架库的静态方法AKA cl_gui_cfw即可。
正确的方法调用是(事实上,如果你想更改ui控件,但你不能依赖任何pbo/pai循环,这是最好的选择):
CALL METHOD cl_gui_cfw=>flush.
我能帮你吗?