好久没有更新这个博客了,今天周末也没什么事情做,所以就更新一下,作为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事件,该事件带有INDEX、LINE、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方法附加。
就写到这里吧,不善言语不知道如何表达,还不如直接看代码来的爽快。