Ir para o conteúdo

O Drag e Drop

Introdução

Desde os primórdios da introdução do rato, a funcionalidade Drag and Drop, literalmente Arrasta e Larga, tornou-se uma evidente evolução e desde a sua introdução inúmeras aplicações têm vindo a utilizar esta funcionalidade para melhorar a interação do utilizador com os seus interfaces.

Requisitos

Para que se possam efectuar Drag and Drops em VB, precisamos de dois controlos. Um de onde se inicie o arrasto e outro para receber os dados. Vamos dar um exemplo utilizando uma TextBox e uma ListView.

Antes da prática

Antes dos blocos de código, é importante perceber os eventos e propriedades que permitem a funcionalidade.

AllowDrop

Esta propriedade determina se o controlo está ou não capaz de receber dados que nele são largados.

MouseDown

Este evento é utilizado para dar início ao processo de arrastamento. Pode dar início ao Drag and Drop num outro evento, mas este é o mais prático.

DragEnter / DragOver

Este evento é disparado quando se passa por cima de um controlo enquanto se arrasta alguma coisa. Podemos utilizar este evento para alterar o aspecto do controlo ou do cursor do rato para dar a entender que existe ali uma possibilidade para drop.

DragLeave

Este evento é disparado quando se sai de cima de um controlo onde se estava anteriormente a arrastar alguma coisa. Podemos utilizar este evento, novamente, para alterar o aspecto do controlo ou do cursor do rato, mas desta vez para dar a entender que o alvo já não é aquele controlo.

DragDrop

Este evento é disparado quando se larga alguma coisa sobre um objecto. Utilizamos este evento para determinar que acção tomar quando algo é largado sobre ele.

A prática na nossa realidade

Public Class Form1

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        ListView1.View = View.Details
        ListView1.Columns.Add("Texto")
        ListView1.Columns.Add("Método")
        ListView1.AllowDrop = True
    End Sub

    Private Sub ListView1_DragDrop(ByVal sender As Object, ByVal e As System.Windows.Forms.DragEventArgs) Handles ListView1.DragDrop
        Dim lvi As New ListViewItem
        lvi.Text = e.Data.GetData(DataFormats.Text).ToString
        lvi.SubItems.Add("DragDrop")
        ListView1.Items.Add(lvi)
    End Sub

    Private Sub ListView1_DragEnter(ByVal sender As Object, ByVal e As System.Windows.Forms.DragEventArgs) Handles ListView1.DragEnter
        e.Effect = DragDropEffects.Copy
        ListView1.BorderStyle = BorderStyle.FixedSingle
    End Sub

    Private Sub ListView1_DragLeave(ByVal sender As Object, ByVal e As System.EventArgs) Handles ListView1.DragLeave
        ListView1.BorderStyle = BorderStyle.Fixed3D
    End Sub

    Private Sub TextBox1_DragDrop(ByVal sender As Object, ByVal e As System.Windows.Forms.DragEventArgs) Handles TextBox1.DragDrop
        TextBox1.Text = e.Data.GetData(DataFormats.Text)
    End Sub

    Private Sub TextBox1_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles TextBox1.MouseDown
        TextBox1.DoDragDrop(TextBox1.Text, DragDropEffects.Copy)
    End Sub

End Class

Ao pormenor

lvi.Text = e.Data.GetData(DataFormats.Text)

Vai apanhar os dados que são transportados no argumento. É necessário determinar o formato certo. Para além de texto, é possível transportar, entre outros, imagens e sons.

Ideia: No evento DragEnter é possível verificar que tipo de dados estão a ser arrastados através do e.Data.GetDataPresent, especificando o tipo de dados, para alterar o aspecto que dita se esse controlo pode receber os dados que estão a ser arrastados ou não.

TextBox1.DoDragDrop(TextBox1.Text, DragDropEffects.Copy)

Inicia o processo de DragDrop passando como argumentos os dados que se querem arrastar e o efeito inicial.

e.Effect = DragDropEffects.Copy

O efeito especificado no DragEnter tem de ser igual ao escolhido no início do processo, para que possa aparecer.

Para ficheiros

Por vezes, também é útil ao utilizador arrastar ficheiros para um determinado controlo, por exemplo, uma lista, em vez de indicar o seu caminho manualmente. A única coisa a alterar para a lista aceitar os caminhos dos ficheiros é o método ListView1_DragDrop, para o seguinte código:

Private Sub ListView1_DragDrop(ByVal sender As Object, ByVal e As System.Windows.Forms.DragEventArgs) Handles ListView1.DragDrop
    ' obter a lista de ficheiro que forem largados no controlo
    ' aqui o que muda é o formato usado: DataFormats.FileDrop
    Dim fileList As String() = e.Data.GetData(DataFormats.FileDrop)

    ' por cada ficheiro largado, vamos criar uma entrada na lista com o caminho
    For Each f As String In fileList
        Dim lvi As New ListViewItem
        lvi.Text = f
        lvi.SubItems.Add("DragDrop")
        ListView1.Items.Add(lvi)
    Next
End Sub

Conclusão

O efeito e funcionalidade Drag and Drop são sem dúvida uma mais-valia para qualquer interface gráfico que necessite de espaço que se desperdiçaria em botões ou outros métodos de acção, e nem por isso apresenta um grau de dificuldade elevado.