[ABAP] Objekte über die Systemklasse CL_OS_STATE clonen (kopieren)

* die Klasse, deren Objekte geclont werden sollen, muss von CL_OS_STATE
* ableiten, damit das Interface IF_OS_CLONE implementiert wird
CLASS lcl_clone_test DEFINITION INHERITING FROM cl_os_state.

  PUBLIC SECTION.
* ALIAS für die Implementierung von cl_os_state=>if_os_clone~clone( )
* ruft SYSTEM-CALL OBJMGR CLONE me TO result.
    ALIASES: clone FOR if_os_clone~clone.

    METHODS:
      constructor
        IMPORTING i_text TYPE string.
    METHODS:
      get_text
        RETURNING VALUE(rv_text) TYPE string.

  PRIVATE SECTION.
    DATA:
      gv_text TYPE string.

ENDCLASS.

CLASS lcl_clone_test IMPLEMENTATION.

  METHOD constructor.
* Konstruktor der Basisklasse CL_OS_STATE rufen
    super->constructor( ).
    gv_text = i_text.
  ENDMETHOD.

  METHOD get_text.
    rv_text = gv_text.
  ENDMETHOD.

ENDCLASS.

START-OF-SELECTION.
  DATA(o_src) = NEW lcl_clone_test( 'SRC' ).
  WRITE: / o_src->get_text( ).

* Objekt O_SRC clonen, Rückgabe von REF TO object nach LCL_CLONE_TEST explizit casten
* es wird ein neues, zu O_SRC identisches, Objekt erzeugt
  DATA(o_clone) = CAST lcl_clone_test( o_src->clone( ) ).
  WRITE: / o_clone->get_text( ).

Drag und Drop innerhalb eines TreeViews

  • im Beispiel wird eine TreeNode innerhalb des TreeViews verschoben
  • als erstes ist das Ereignis ItemDrag zu behandeln:
private void TreeView1_ItemDrag(object sender, ItemDragEventArgs e)
{
    TreeView tv = sender as TreeView;

    if (tv != null)
    {
        if (tv.SelectedNode != null)
        {
            tv.DoDragDrop(tv.SelectedNode, DragDropEffects.Copy);
        }
    }
}
  • beim TreeView muss die Eigenschaft AllowDrop = True gesetzt sein
  • zusätzlich sind die Ereignisse DragOver und DragDrop zu behandeln:
private void TreeView1_DragOver(object sender, DragEventArgs e)
{
    e.Effect = DragDropEffects.None;

    // Quellnode
    TreeNode tns = e.Data.GetData(typeof(TreeNode)) as TreeNode;
    // akt. Zielnode unter dem Mauspfeil
    TreeNode tnd = TreeView1.GetNodeAt(TreeView1.PointToClient(new Point(e.X, e.Y)));

    if ((tns != null) && (tnd != null))
    {
        // hier im Beispiel die Verschiebung nur zulassen, wenn ChildNodes (Level == 1)
        // auf andere Parent-/Rootnodes (Level == 0) gezogen werden.
        if ((TreeView1.SelectedNode.Level == 1) && (tnd.Level == 0) && (tnd != tns.Parent))
        {
            e.Effect = DragDropEffects.Copy;
        }
    }
}

private void TreeView1_DragDrop(object sender, DragEventArgs e)
{
    // Quellnode
    TreeNode tns = e.Data.GetData(typeof(TreeNode)) as TreeNode;
    // akt. Zielnode unter dem Mauspfeil
    TreeNode tnd = TreeView1.GetNodeAt(TreeView1.PointToClient(new Point(e.X, e.Y)));

    if ((tns != null) && (tnd != null))
    {
        // neue TreeNode aus Clone der Quellnode erstellen
        TreeNode tnnew = (TreeNode)tns.Clone();
        tnd.Nodes.Add(tnnew);
        tnd.Expand();

        // alte Quell-TreeNode entfernen
        TreeNode cat = tns.Parent;
        cat.Nodes.Remove(tns);
    }
}