现在的位置: 首页 > 综合 > 正文

Simple Tree学习笔记—darg and drop事件

2012年11月07日 ⁄ 综合 ⁄ 共 3573字 ⁄ 字号 评论关闭

      好久没有更新这个博客了,今天周末也没什么事情做,所以就更新一下,作为09年的开篇吧!今天主要学习如何在simple tree上实现drag and drop事件.

      首先思考一下,既然要实现Drag and Drop事件,那么必须的有一个实体来承载Drag,同样也会有一个实体承载Drop,这两个实体可以一样。在这次的实例中选择了simple tree作为Drag的实体, textedit作为Drop的实体。即从simple tree中拖一个节点到textedit中。因此首先我们的在simple tree上实现drag事件在textedit上实现Drop事件。

      在simple tree上实现drag事件以及在textedit上实现drop事件,说难不难说简单也不简单,但只要理清了思路了解了原理还是比较容易实现的。因此,首先我们来看一些实现原理。

      在Reository Browser中选择Class/Interface,然后选择CL_GUI_SIMPLE_TREE,展开Events文件夹我们可以看到ON_DRAG时间,然后可以看到ON_DRAG时间带有NODE_KEY以及DRAG_DROP_OBJECT这两个parameter.NODE_KEY这个参数主要用来表示Drag了哪一个节点。因此在在程序中要实现该ON_DRAG事件。Drag事件完成以后紧接着的就应该是DROP事件了。而DROP这个事件应该是放在textedit这个实体上去实现。因此可以以同样的办法查看到Textedit上有一个ON_DROP事件,该事件带有INDEXLINE、POS、DRAGDROP_OBJECT这四个参数。

     弄清楚了这两个事件之后,接下来看如何实现这两个事件。废话不说了直接看代码吧。

 

//定义事件
CLASS DRAGDROP_RECEIVER DEFINITION.
  PUBLIC SECTION.
    METHODS:
      DARG FOR EVENT ON_DRAG of CL_GUI_SIMPLE_TREE
                             IMPORTING NODE_KEY DRAG_DROP_OBJECT,
      DROP FOR EVENT ON_DROP of CL_GUI_TEXTEDIT
                             IMPORTING INDEX LINE POS DRAGDROP_OBJECT.
 ENDCLASS.                    "DRAGDROP_RECEIVER DEFINITION

//事件具体实现

 

CLASS DRAGDROP_RECEIVER IMPLEMENTATION.
  METHOD DARG.
    DATA drag_object TYPE REF TO lcl_drag_object.
    READ TABLE nodes WITH KEY node_key = node_key INTO node.            
    CREATE OBJECT drag_object.
    drag_object->text = node-text.
    drag_drop_object->object = drag_object.
  ENDMETHOD.                    "DARG
  METHOD DROP.
    DATA textline(256).
    DATA text_table LIKE STANDARD TABLE OF textline.
    DATA drag_object TYPE REF TO lcl_drag_object.
    CATCH SYSTEM-EXCEPTIONS move_cast_error = 1.
      drag_object ?= dragdrop_object->object.
    ENDCATCH.
    IF sy-subrc = 1.
      CALL METHOD dragdrop_object->abort.
      EXIT.
    ENDIF.
    CALL METHOD edit->get_text_as_stream
      IMPORTING
        text = text_table.
    CALL METHOD cl_gui_cfw=>flush.
    textline = drag_object->text.
    INSERT textline INTO text_table INDEX 1.
    CALL METHOD edit->set_text_as_stream
      EXPORTING
        text            = text_table
      EXCEPTIONS
        error_dp        = 1
        error_dp_create = 2.
  ENDMETHOD.                    "DROP

       实现了Drag and Drop事件后,接下来需要做的就是在PBO module中实例话tree和textedit以及对事件进行相应的注册。值得注意的是在给simple tree添加notes的时候,要指明哪些note是可以被Drag哪些是不可以的。具体方法为:

 

DATA handle_tree TYPE i.

  

CLEAR node.
  node-node_key = 'First_child'.
  node-text = '中文'.
  node-dragdropid = ' '.
  node-relatkey = 'Root'.
  node-relatship = cl_gui_simple_tree=>relat_last_child.
  node-dragdropid = handle_tree.
  APPEND node TO nodes.

      接下来需要定义两个指向

cl_dragdrop的对象然后进行创建该对象的实例。其中一个实例用于将前面定义的handle_tree通过

get_handle方法附加上去,另外一个实例通过textedit的

set_dragdrop方法附加。

  就写到这里吧,不善言语不知道如何表达,还不如直接看代码来的爽快。

/Files/flysky927/ZTEST_DRAGDROP.txt

抱歉!评论已关闭.