Esse artigo faz parte da revista Clube Delphi edição 2. Clique aqui para ler todos os artigos desta edição



Atenção: por essa edição ser muito antiga não há arquivo PDF para download. Os artigos dessa edição estão disponíveis somente através do formato HTML. 

 

Drag And Drop

Aprenda a implementar o ‘Arrastar e Soltar’ em suas aplicações

 

Nosso propósito com esta coluna é mostrar exemplos de programação simples, ou seja, para iniciantes, e assim conquistar mais adeptos a esta maravilhosa linguagem.

Como primeiro exemplo desta coluna, escolhi o recurso ‘Drag and Drop’ (clicar e arrastar), que foi o que mais me impressionou quando eu estava aprendendo Delphi. Senti-me em outro estágio de programação ao clicar e arrastar as janelas do windows, visto que meus projetos da época eram desenvolvidos em Pascal e Clipper.

Você usa este recurso é utilizado quando se arrasta de um objeto origem para outro de destino.

 O início de tudo é selecionar o objeto que será arrastado e mudar a propriedade DragMode para dmAutomatic: se  executar o programa perceberá que ao clicar e arrastar o objeto, o cursor tomará forma de Ø (negação). Isto quer dizer que o objeto de fundo não permite o arrasto.

O segundo passo do Drag and Drop é justamente este: permitir que o objeto destino aceite o arrasto. Para isto basta ir ao evento OnDragOver do objeto e digitar o código:

 

Accept := True

 

Compilando o projeto(F9), perceberá que ao clicar no objeto de origem e arrastar para o de destino, o cursor assume a forma do ícone de arrasto, demonstrando que a operação é válida.

O evento OnDragDrop do objeto de destino ocorre quando você solta o botão do mouse após o arrasto. Como o nome diz, este é o evento OnDragDrop, você clicou e arrastou de um objeto para outro.

Mostrarei a seguir um exemplo de mover e copiar itens de um TlistBox para outro.

Crie um novo projeto e insira no form dois objetos TListBox, nomeados pelo próprio Delphi. Mude a propriedade DragMode para dmAutomatic, em ambos.

Selecione-os e escreva no evento onDragOver, o código:

 

Accept := (sender <> Source ) and ((Source as Tlistbox).items.count >=0)

 

Este código é explicado mais adiante.

 

Nota: Quando você segura a tecla SHIFT e seleciona dois ou mais  objetos e clica em algum evento,estará escrevendo o mesmo código para todos os objetos selecionados, economizando tempo de projeto.

Para se referenciar ao objeto cujo evento foi chamado, use a variável Sender.

 

Agora escreva o código abaixo no evento onDragDrop dos objetos:

 

begin

(Sender as TListBox).Items.Add((Source as TListBox).Items[(Source as TListBox).Itemindex]);

 //o item será inserido na lista de destino, aqui representado por sender

 

 (Source as TListBox).Items.Delete((Source as TListBox).Itemindex);

 //o item da lista de origem será excluído, aqui representado por source

end;

 

Explicação para o código: primeiro o evento OnDragOver:

Este código é uma operação lógica.

A função da primeira parte(Source <> Sender) é permitir que se possa arrastar apenas itens de uma lista para outra. E a outra parte ((Source as TListBox).items.count > 0)restringirá o usuário a mover itens somente quando a lista não estiver vazia, pois caso contrário, poderá ocorrer um erro no projeto.

 

Código da procedure OnDragDrop:

A palavra Source está declarada no cabeçalho da procedure como uma variável do tipo TObject. No caso, Source é o objeto de onde vamos selecionar os itens, ou seja, o objeto origem. Mas como vimos, Source está declarado como uma variável do tipo TObject, e por este motivo possui apenas as propriedades e métodos desta classe. Neste exemplo queremos usar um objeto da classe TListBox, então precisamos forçar uma mudança na classe do objeto Source , de TObject para TListBox. Esta mudança é feita usando o operador “as” como visto no exemplo anterior.

 

(Source as Tlistbox)

 

Agora explicarei as propriedades e métodos do ListBox escritos no código.

 

Propriedade Items – Esta é herdada da classe TStrings. Por ser deste tipo, você pode referenciar-se a um item usando os colchetes.

Exemplo:

 

Showmessage(Listbox.items[0]);

 

O comando ShowMessage exibiria uma mensagem com o conteúdo do primeiro item da lista.

 

Propriedade ItemIndex – Esta propriedade retorna o identificador do item selecionado. Se não houver item selecionado, o valor será -1.

 

O método Add – Este método não é do objeto ListBox, e sim da propriedade items do ListBox, que por sua vez também é um Objeto.

Veja um exemplo:

 

ListBox1.Items.Add(‘Novo’);

 

Neste exemplo, um item chamado “Novo” será adicionado ao ListBox.

Você pode também usar variáveis e propriedades como parâmetro deste método, bastando ser do tipo String.

 

O método Delete – Este método permite a exclusão de um item da lista. Para isto, basta passar como parâmetro o índice do item que deseja excluir.

Exemplo:

 

ListBox1.Items.Delete(2);

 

Neste exemplo o terceiro item da lista seria excluído (lembrando que a lista começa em 0). Este método também pertence a propriedade Items.

As propriedades e métodos aqui aplicados, também podem ser usados com o objeto TComboBox, ou ainda com qualquer outro que possua uma propriedade do tipo TStrings.

Até aqui aprendemos a mover os itens de uma lista para outra. Veremos agora a cópia de itens caso a tecla CRTL esteja pressionada.

Para começar, crie uma variável Global do tipo boolean:

 

var

  Form1: TForm1;

  copia : Boolean;

implementation

 

{$R *.dfm}

 

Mude a propriedade KeyPreview do formulário para True, e no evento OnKeyDown do form escreva o código abaixo:

 

Copia:=Shift=[ssCTRL];

 

Continuando com as listas selecionadas, escreva o código abaixo no evento OnStartDrag:

 

if Copia then

(Sender as TListBox).Cursor:=crMultiDrag;

else

(Sender as bTListBox).Cursor:=crDrag;

 

Este código mudará a forma do cursor quando estiver movendo ou copiando

itens. Isto servirá para dar uma melhor apresentação visual ao seu programa.

Agora, basta incluir uma linha de código no evento OnDragDrop, para que se possa excluir apenas se a variável Copia seja False, como vemos a seguir:

 

begin

(Sender as TListBox).Items.Add((Source as TListBox).

Items[(Source as TListBox).Itemindex]);

//o item será inserido na lista de destino, aqui representado //por sender

if Copia=False then

(Source as TListBox).Items.Delete((Source as TListBox).Itemindex);

//o item da lista de origem será excluído, aqui representado //por source

end;

 

 

Pronto! O projeto já pode ser compilado e executado. Confira o resultado deste simples exemplo de Drag And Drop. Você pode encontrar o fonte deste exemplo em nossa Home Page: http://www.clubedelphi.com.br

 

Conclusão

O recurso Drag and Drop é uma das novidades trazidas pelo Windows e pode ser facilmente aplicada a seus projetos em Delphi. Lembre-se que este é um dos recursos mais agradáveis para o usuário, e o que apresenta o menor tempo de aprendizado. Pense em como este recurso pode melhorar a apresentação de suas aplicações, pois certamente o usuário verá seu sistema com outros olhos. Só depende de sua criatividade e bom gosto