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.
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 dos blocos de código, é importante perceber os eventos e propriedades que permitem a funcionalidade.
Esta propriedade determina se o controlo está ou não capaz de receber dados que nele são largados.
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.
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.
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.
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
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
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.
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.
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 In fileList Dim lvi As New ListViewItem lvi.Text = f lvi.SubItems.Add("DragDrop") ListView1.Items.Add(lvi) Next End Sub
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.