ABAP - cl_gui_toolbar->delete_all_buttons 不起作用



数据: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.

我能帮你吗?

相关内容

  • 没有找到相关文章

最新更新