ABAP-TREE-CL_GUI_SIMPLE_TREE

本文详细介绍了一种在ABAP中实现树形控件的方法,包括创建容器、树控件,设置对齐方式,注册事件处理器,以及如何通过双击事件处理节点选择。通过实例展示了如何构建多层次的树形结构,并设置了节点的属性。

*&---------------------------------------------------------------------*
*& Report  Y_ABC_12
*&
*&---------------------------------------------------------------------*
*& 屏幕100添加CONTAINER控件'CON_TREE';
*&     EXIT_0100 添加 关闭事件代码;
*&     USER_COMMAND_0100
*&---------------------------------------------------------------------*

REPORT Y_ABC_12.


CLASS LCL_APPLICATION DEFINITION DEFERRED.
DATA: G_APPLICATION TYPE REF TO LCL_APPLICATION.
DATA: GT_NODE TYPE TABLE OF MTREESNODE.

DATA: G_CONTAINER TYPE REF TO CL_GUI_CUSTOM_CONTAINER,
      G_TREE      TYPE REF TO CL_GUI_SIMPLE_TREE.

DATA: G_UCOMM TYPE SY-UCOMM.
DATA: OK_CODE TYPE SY-UCOMM.

*----------------------------------------------------------------------*
*       CLASS lcl_application DEFINITION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS LCL_APPLICATION DEFINITION.
  PUBLIC SECTION.
    METHODS:
      HANDLE_NODE_DOUBLE_CLICK
          FOR EVENT NODE_DOUBLE_CLICK OF CL_GUI_SIMPLE_TREE
          IMPORTING NODE_KEY.

ENDCLASS.                    "lcl_application DEFINITION

*----------------------------------------------------------------------*
*       CLASS lcl_application IMPLEMENTATION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS LCL_APPLICATION IMPLEMENTATION.
  METHOD  HANDLE_NODE_DOUBLE_CLICK.
    PERFORM FRM_NODE_DOUBLE_CLICK USING NODE_KEY.
  ENDMETHOD.                    "handle_node_double_click

ENDCLASS.                    "lcl_application IMPLEMENTATION



START-OF-SELECTION.
  CALL SCREEN 100.


*&---------------------------------------------------------------------*
*&      Module  STATUS_0100  OUTPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
MODULE MODULE_STATUS_0100 OUTPUT.
  SET PF-STATUS '0100'.
*  SET TITLEBAR 'xxx'.

ENDMODULE.                 " STATUS_0100  OUTPUT
*&---------------------------------------------------------------------*
*&      Module  EXIT_0100  INPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
MODULE EXIT_0100 INPUT.
  SET SCREEN 0.

ENDMODULE.                 " EXIT_0100  INPUT
*&---------------------------------------------------------------------*
*&      Module  USER_COMMAND_0100  INPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
MODULE USER_COMMAND_0100 INPUT.
  G_UCOMM = OK_CODE.
  CASE G_UCOMM.
    WHEN 'UCOM_YES'.
      LEAVE TO SCREEN 0.
*    WHEN OTHERS.
*      LEAVE TO SCREEN 0.
  ENDCASE.
ENDMODULE.                 " USER_COMMAND_0100  INPUT
*&---------------------------------------------------------------------*
*&      Module  MODULE_INIT_0100  OUTPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
MODULE MODULE_INIT_0100 OUTPUT.
  PERFORM FRM_INIT_100_TREE.
ENDMODULE.                 " MODULE_INIT_0100  OUTPUT
*&---------------------------------------------------------------------*
*&      Form  FRM_INIT_100_TREE
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM FRM_INIT_100_TREE .

  CHECK G_CONTAINER IS INITIAL .
  PERFORM FRM_CREATE_CONTAINER USING 'CON_TREE' G_CONTAINER.

  CHECK SY-SUBRC = 0.
  PERFORM FRM_CREATE_TREE USING G_CONTAINER G_TREE.

  CHECK SY-SUBRC = 0.
  PERFORM FRM_TREE_SET_ALIGNMENT USING 15 G_TREE.

  PERFORM FRM_ADD_TREE_EVENT USING G_TREE G_APPLICATION.
  PERFORM FRM_ADD_NODE_TABLE TABLES GT_NODE.   " 设置节点数据;
  PERFORM FRM_ADD_TREE_NODES TABLES GT_NODE USING 'MTREESNODE' G_TREE.


ENDFORM.                    " FRM_INIT_100_TREE
*&---------------------------------------------------------------------*
*&      Form  FRM_ADD_NODE_TABLE
*&---------------------------------------------------------------------*
*       设置节点表数据
*----------------------------------------------------------------------*
FORM FRM_ADD_NODE_TABLE TABLES P_GT_NODE STRUCTURE MTREESNODE.
  DATA: LS_NODE TYPE MTREESNODE.
  REFRESH P_GT_NODE.
  CLEAR LS_NODE.

  "第1层节点'
  LS_NODE-NODE_KEY = 'ROOT'.
  LS_NODE-RELATKEY = ''.
  LS_NODE-TEXT     = '分类'.
  LS_NODE-ISFOLDER = 'X'.
  APPEND LS_NODE TO P_GT_NODE.

  "第2层节点'
  LS_NODE-NODE_KEY = 'a1'.
  LS_NODE-RELATKEY = 'ROOT'.
  LS_NODE-TEXT     = '分类1'.
  LS_NODE-ISFOLDER = 'X'.
  APPEND LS_NODE TO P_GT_NODE.
  LS_NODE-NODE_KEY = 'a2'.
  LS_NODE-RELATKEY = 'ROOT'.
  LS_NODE-TEXT     = '分类2'.
  LS_NODE-ISFOLDER = 'X'.
  APPEND LS_NODE TO P_GT_NODE.

  "第3层节点'
  LS_NODE-NODE_KEY = 'b1'.
  LS_NODE-RELATKEY = 'a2'.
  LS_NODE-TEXT     = '分类3'.
  LS_NODE-ISFOLDER = 'X'.
  APPEND LS_NODE TO P_GT_NODE.

  CLEAR: LS_NODE.


ENDFORM.                    " FRM_NODE_TABLE
*&---------------------------------------------------------------------*
*&      Form  FRM_NODE_DOUBLE_CLICK
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_NODE_KEY  text
*----------------------------------------------------------------------*
FORM FRM_NODE_DOUBLE_CLICK  USING    P_NODE_KEY.
  BREAK-POINT.
ENDFORM.                    " FRM_NODE_DOUBLE_CLICK
*&---------------------------------------------------------------------*
*&      Form  FRM_CREATE_CONTAINER
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      <--P_G_CONTAINER  text
*----------------------------------------------------------------------*
FORM FRM_CREATE_CONTAINER
        USING PV_CON_TREE
              PV_CONTAINER TYPE REF TO CL_GUI_CUSTOM_CONTAINER.
  CREATE OBJECT PV_CONTAINER
    EXPORTING
      CONTAINER_NAME              = PV_CON_TREE   " 100屏幕CONTAINER控件
    EXCEPTIONS
      CNTL_ERROR                  = 1
      CNTL_SYSTEM_ERROR           = 2
      CREATE_ERROR                = 3
      LIFETIME_ERROR              = 4
      LIFETIME_DYNPRO_DYNPRO_LINK = 5.
ENDFORM.                    " FRM_CREATE_CONTAINER
*&---------------------------------------------------------------------*
*&      Form  FRM_CREATE_TREE
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_G_CONTAINER  text
*      <--P_G_TREE  text
*----------------------------------------------------------------------*
FORM FRM_CREATE_TREE
        USING    P_G_CONTAINER TYPE REF TO CL_GUI_CUSTOM_CONTAINER
                 P_G_TREE TYPE REF TO CL_GUI_SIMPLE_TREE.

  CREATE OBJECT P_G_TREE
    EXPORTING
*     lifetime                    =
      PARENT                      = P_G_CONTAINER
*     shellstyle                  =
      NODE_SELECTION_MODE         = P_G_TREE->NODE_SEL_MODE_SINGLE
*     hide_selection              =
*     name                        =
    EXCEPTIONS
      LIFETIME_ERROR              = 1
      CNTL_SYSTEM_ERROR           = 2
      CREATE_ERROR                = 3
      FAILED                      = 4
      ILLEGAL_NODE_SELECTION_MODE = 5
      OTHERS                      = 6.

ENDFORM.                    " FRM_CREATE_TREE
*&---------------------------------------------------------------------*
*&      Form  FRM_TREE_SET_ALIGNMENT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_15     text
*      <--P_G_TREE  text
*----------------------------------------------------------------------*
FORM FRM_TREE_SET_ALIGNMENT  USING P_ALIGNMENT
                                   P_G_TREE TYPE REF TO CL_GUI_SIMPLE_TREE.
  CALL METHOD P_G_TREE->SET_ALIGNMENT
    EXPORTING
      ALIGNMENT = P_ALIGNMENT. """ 不能大于15;

ENDFORM.                    " FRM_TREE_SET_ALIGNMENT
*&---------------------------------------------------------------------*
*&      Form  FRM_ADD_TREE_EVENT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      <--P_G_TREE         text
*      <--P_G_APPLICATION  text
*----------------------------------------------------------------------*
FORM FRM_ADD_TREE_EVENT
        USING P_G_TREE TYPE REF TO CL_GUI_SIMPLE_TREE
              P_G_APPLICATION TYPE REF TO LCL_APPLICATION.
  DATA: LT_EVENTS TYPE CNTL_SIMPLE_EVENTS,
        LS_EVENT  TYPE CNTL_SIMPLE_EVENT.
  " node double click
  LS_EVENT-EVENTID = CL_GUI_SIMPLE_TREE=>EVENTID_NODE_DOUBLE_CLICK.
  LS_EVENT-APPL_EVENT = 'X'. " process PAI if event occurs
  APPEND LS_EVENT TO LT_EVENTS.

  CALL METHOD P_G_TREE->SET_REGISTERED_EVENTS
    EXPORTING
      EVENTS                    = LT_EVENTS
    EXCEPTIONS
      CNTL_ERROR                = 1
      CNTL_SYSTEM_ERROR         = 2
      ILLEGAL_EVENT_COMBINATION = 3.

  CHECK SY-SUBRC = 0.
  CREATE OBJECT P_G_APPLICATION.
  SET HANDLER P_G_APPLICATION->HANDLE_NODE_DOUBLE_CLICK FOR P_G_TREE.

ENDFORM.                    " FRM_ADD_TREE_EVENT
*&---------------------------------------------------------------------*
*&      Form  FRM_ADD_TREE_NODES
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_GT_NODE  text
*      -->PV_STRUS   text
*      <--P_G_TREE   text
*----------------------------------------------------------------------*
FORM FRM_ADD_TREE_NODES
        TABLES   P_GT_NODE STRUCTURE MTREESNODE
        USING    PV_STRUS
                 P_G_TREE TYPE REF TO CL_GUI_SIMPLE_TREE.

  CALL METHOD P_G_TREE->ADD_NODES
    EXPORTING
      TABLE_STRUCTURE_NAME           = PV_STRUS
      NODE_TABLE                     = P_GT_NODE[]
    EXCEPTIONS
      FAILED                         = 1
      ERROR_IN_NODE_TABLE            = 2
      DP_ERROR                       = 3
      TABLE_STRUCTURE_NAME_NOT_FOUND = 4
      OTHERS                         = 5.

ENDFORM.                    " FRM_ADD_TREE_NODES

<think>首先,用户的问题是关于在ABAP屏幕中使用textedit的set_readonly_mode方法来隐藏文本框。用户提到了参考内容,包括引用[1]、[2]、[3],这些是关于ABAP中长文本处理和GUI控件的内容。 用户的直接查询是:"我想查找在ABAP屏幕中使用textedit->set_readonly_mode时隐藏文本框的方法"。意思是用户想在ABAP屏幕中,当使用CL_GUI_TEXTEDIT的set_readonly_mode方法时,如何隐藏文本框。set_readonly_mode通常用于设置文本框是否可编辑(只读模式),而不是直接隐藏它。 从引用[3]中看到:用户展示了如何根据操作模式(如创建或更改)设置只读模式: - 如果操作是 'CREATE' 或 'CHANGE',设置 readonly_mode = 0(可编辑)。 - 否则,设置 readonly_mode = 1(只读)。 但用户现在想知道如何隐藏文本框,而不是只设置只读。 在ABAP中,CL_GUI_TEXTEDIT控件是GUI控件的一部分。要隐藏一个控件,通常需要使用方法来控制控件的可见性。CL_GUI_TEXTEDIT类中没有直接隐藏的方法;隐藏控件通常是通过其容器或父控件来实现的。 在ABAP Dynpro中,控件如CL_GUI_TEXTEDIT通常嵌入在容器中。要隐藏控件,应该使用set_visible方法或类似的方法来控制其可见性。 回顾类CL_GUI_TEXTEDIT: - 我没有完整的SAP文档,但从标准知识来看,CL_GUI_TEXTEDIT继承自CL_GUI_CONTROL,而CL_GUI_CONTROL有方法来设置可见性。 - 具体来说,CL_GUI_CONTROL类应该有方法SET_VISIBLE来设置控件的可见性。 所以,隐藏文本框的正确方法应该是调用SET_VISIBLE方法,将可见性设置为FALSE。 用户的问题提到了"在使用textedit->set_readonly_mode时",但set_readonly_mode不是用于隐藏的;它是用于只读状态的。所以,我需要解释清楚:隐藏和只读是不同的概念。用户可能混淆了,或者说想在某个条件下既设置只读又隐藏。 我的回答应该: 1. 澄清隐藏和只读的区别。 2. 提供隐藏文本框的方法。 3. 参考用户提供的引用,因为它提到了相关类和方法。 从引用[3]中,有调用set_readonly_mode的例子。但要隐藏,应该使用SET_VISIBLE。 在ABAP中,对于控件,继承层次是: - CL_GUI_TEXTEDIT 继承自 CL_GUI_CONTROL。 - CL_GUI_CONTROL 有方法 SET_VISIBLE ( EXPORTING VISIBLE TYPE ABAP_BOOL ). 所以,要隐藏文本框,代码应该是: CALL METHOD editor->set_visible EXPORTING visible = abap_false. 其中,editor 是 CL_GUI_TEXTEDIT 的实例。 如果用户想在设置只读模式时同时隐藏,他们可以在同一个逻辑中调用 set_visible。 现在,生成相关问题: - 根据系统指令,我需要在回答末尾生成相关问题。 - 相关问题应该基于主题,比如ABAP控件操作、隐藏方法等。 回答结构: - 先用中文清晰地解释。 - 确保语法正确。 - 添加引用标识,如 [^1]、[^2]、[^3],但要自然地引用用户提供的引用。 - 由于用户引用了这些,我应该引用它们来解释。 用户提供的引用: - [^1]: 关于长文本处理和 CL_GUI_TEXTEDIT 方法。 - [^2]: 读取和设置文本的例子。 - [^3]: 设置只读模式的例子。 在我的回答中,我可以提到: - 引用 [^3] 展示了设置只读模式,但隐藏需要使用其他方法。 - 引用 [^1] 和 [^2] 是关于文本处理的上下文。 最终回答: - 解释隐藏文本框的方法。 - 给出示例代码。 - 生成相关问题。 </think>在 ABAP Dynpro 屏幕中,`CL_GUI_TEXTEDIT` 控件的 `SET_READONLY_MODE` 方法仅用于控制文本框的**可编辑状态**(是否只读),而不是隐藏控件本身。隐藏文本框需要调用 `SET_VISIBLE` 方法(继承自父类 `CL_GUI_CONTROL`),该方法可直接设置控件的可见性。下面我将逐步解释实现方法,并确保回答可靠,参考了您提供的引用内容。 ### 步骤 1:理解 `SET_READONLY_MODE` 与隐藏的区别 - **`SET_READONLY_MODE`**:控制文本框是否可编辑。例如: - `readonly_mode = 0`: 文本框可编辑。 - `readonly_mode = 1`: 文本框只读(内容可见但不可修改)。 这在引用 [^3] 的示例中已有演示(基于操作模式设置只读状态),但它不会隐藏控件。 - **隐藏文本框**:需使用 `SET_VISIBLE` 方法,设置 `visible = abap_false` 使控件完全不可见(包括内容)。这是独立的操作,与只读模式无关。 ### 步骤 2:隐藏文本框的实现方法 在 ABAP 屏幕控制器中,先创建 `CL_GUI_TEXTEDIT` 实例(如在 `PBO` 模块中初始化),然后在需要隐藏时调用 `SET_VISIBLE`。以下是完整示例代码,基于引用 [^3] 的逻辑扩展(假设控件已定义): ```abap DATA: lo_textedit TYPE REF TO cl_gui_textedit. " 声明文本框实例 DATA: gv_operate TYPE string. " 示例变量,代表当前操作模式 " 初始化文本框(通常在 PBO 模块中) IF lo_textedit IS NOT BOUND. CREATE OBJECT lo_textedit EXPORTING parent = cl_gui_container=>screen0. " 绑定到屏幕容器 ENDIF. " 根据条件隐藏或显示文本框(例如在用户操作触发时) IF gv_operate = 'HIDE'. " 当需要隐藏时 " 调用 SET_VISIBLE 方法隐藏控件 CALL METHOD lo_textedit->set_visible EXPORTING visible = abap_false " abap_false 表示隐藏 EXCEPTIONS error_cntl_call_method = 1 invalid_parameter = 2 OTHERS = 3. IF sy-subrc <> 0. " 错误处理(如 MESSAGE 语句) ENDIF. ELSE. " 其他情况下显示控件(visible = abap_true) CALL METHOD lo_textedit->set_visible EXPORTING visible = abap_true. ENDIF. " 可选:同时设置只读状态(如引用 [^3] 的逻辑) IF gv_operate = 'CHANGE'. CALL METHOD lo_textedit->set_readonly_mode EXPORTING readonly_mode = 0. " 可编辑 ELSE. CALL METHOD lo_textedit->set_readonly_mode EXPORTING readonly_mode = 1. " 只读 ENDIF. ``` #### 关键点说明: 1. **方法调用**: - `SET_VISIBLE` 是核心方法,接受参数 `visible`(类型 `ABAP_BOOL`)。 - `abap_false` 隐藏控件,`abap_true` 显示控件。 2. **错误处理**: - 检查 `sy-subrc` 处理异常(如无效参数或调用失败),引用 [^3] 中的错误处理可作为参考。 3. **与只读模式的结合**: - 隐藏和只读可独立使用或组合(例如,先隐藏再显示时恢复只读状态)。 4. **性能注意事项**: - 隐藏操作不会影响文本内容,后续可通过 `GET_TEXT_AS_STREAM` 或 `GET_TEXT_AS_R3TABLE` 读取数据(如引用 [^1] 和 [^2] 中的文本处理逻辑)。 ### 注意事项 - 确保控件已正确绑定到容器(如 `parent` 参数),否则隐藏可能失效。 - 在屏幕生命周期中(如 `PBO` 或事件处理模块)调用方法,避免在无效上下文中操作。 - 本方法适用于所有 ABAP GUI 控件(继承自 `CL_GUI_CONTROL`),引用 [^1] 和 [^3] 中的类层级支持此操作[^1][^3]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值