Operaciones de Drag & Drop

Xailer permite realizar varios tipos de operaciones de Drag & Drop, que son:

  • Arrastre de ficheros desde el propio explorador de archivos del sistema
  • Arrastre de elementos dentro de un TreeView
  • Arrastre de controles sobre otros controles


El arrastre de ficheros a cualquier control es la operación más básica que se puede realizar de Drag & Drop, pero su funcionalidad es limitada ya que tan sólo permite ‘enviar’ al control un fichero o lista de ficheros para que este los procese. Su funcionamiento es muy sencillo, tan sólo hay que ponar la propiedad lDragAcceptFiles a verdadero y por último atrapar el evento OnDropFiles. En dicho evento recibiremos una matriz con la lista de todos los ficheros recibidos, y su tratamiento podría ser algo así:

METHOD ListBox1DropFiles( oSender, aFiles, aPoint ) CLASS ...

   Aeval( aFiles, {|v| oSender:AddItem( v ) } )

RETURN Nil

Que como facilmente se comprueba no hace más que añadir en un control tipo TListBox los ficheros que han sido arrastrados.

El segundo sistema de Drag & Drop que incorpora Xailer es entre elementos de un control TreeView, Para poder hacer Drag & Drop de forma automática no hay más que establecer la propiedad lDragDropItem a verdadero. Con tan sólo está instrucción ya se pueden hacer operaciones de Drag & Drop entre elementos. No obstante el TreeView ofrece una serie de eventos para ofrecer mayor funcionalidad y potencia a este tipo de operaciones. Estos son:

  • Evento OnBeginDragItem: Evento que se produce cuando comienza una operación de Drag & Drop entre items. Recibe como segundo parametro después de oSender el objeto TtreeViewItem que lanzo el evento.
  • Evento OnDragOverItem: Evento que se produce cuando en una operación de Drag & Drop entre items, el cursor se encuentra encima de un determinado Item. Recibe como segundo parametro después de oSender el objeto TtreeViewItem donde se encuentra el cursor. Si retorna .F. se mostrará el cursor de Prohibido indicando que no es posible realizar la operación de Drop en ese Item.
  • Evento OnEndDragItem: Evento que se produce cuando termina una operación de Drag & Drop entre items. Recibe como segundo parametro después de oSender el objeto oItemFrom (TtreeViewItem) que disparó el evento, y como tercer parametro el objeto oItemTo (TtreeViewItem) en donde se soltó el cursor del ratón. Sólo si retorna NIL o no está capturado el evento, oItemFrom se moverá justo a continuación de oItemTo. Es posible, atrapando este evento, rechazar la operación de Drop o hacer que en vez de que vaya después del oItemTo, vaya antes o incluso que sea una rama hija del oItemTo.

El tercer sistema para operaciones de Drag & Drop permite realizar operaciones de Drag & Drop entre controles de Xailer, incluso aunque estos se encuentren en distintos formularios. Para ello Xailer ofrece los siguientes eventos que se encuentran a nivel de la clase TControl y por lo tanto los heredan todas las demás clases que heredan de ella, y estos eventos son:

  • Evento OnBeginDrag: Se produce cuando hay una solicitud de comienzo de operación de Drag & Drop. Si retorna verdadero significa que se permite la operación e inmediatemente se refleja cambiando el cursor del ratón.
  • Evento OnDragOver: Evento que se produce cuando se mueve el cursor del ratón encima de un control cuando existe una operación de Drag & Drop en marcha. Recibe como segundo parametro después de oSender, el control que inicio la operación de Drag & Drop. Si retorna verdadero significa que se puede realizar una operación de Drop e inmediatemente se refleja cambiando el cursor del ratón al estilo marcado por Screen:oCursorDropYes. Si el evento no es atrapado o devuelve un valor distinto de verdadero el cursor del ratón cambia al estilo marcado por Screen:oCursorDropNo.
  • Evento OnEndDrag: Evento que se produce cuando se suelta el botón izquierdo del ratón encima de un control cuando existe una operación de Drag & Drop en marcha. Recibe como segundo parametro después de oSender, el control que inicio la operación de Drag & Drop.

Los sistemas segundo y tercero no pueden ser usados conjuntamente.

Puede encontrar un ejemplo de uso de operaciones de Drag & Drop en el directorio SamplesDragDrop que muestra los tres sistemas a la vez.

Deja una respuesta