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.