Você está na página 1de 5

Drag on Drop com formulrios MDI no Delphi

O conceito de arrastar e soltar bastante conhecido pelos usurios de Windows, pois simplifica e muito a utilizao da aplicao pelo usurio final. O Delphi permite utilizar esta prtica em componentes derivados da classe TControls, atravs de alguns eventos, propriedades e mtodos especficos que auxiliam o procedimento desta ao. importante compreender que para utilizar esta ao de um formulrio at outro, as propriedades FormStyle de ambos devem estar configuradas como fsMDIChild. Entendendo o conceito do drag on drop A ao comea com o click do mouse sobre o componente de origem chamando o mtodo BeginDrag(), e o encerramento tambm controlado pelo objeto de origem a partir do evento onEndDrag onde se define qual objeto receber o objeto arrastado. No objeto de destino, configura-se o evento onDragOver que ir verificar se o parmetro Source corresponde com o objeto de origem da ao para poder aceitar com o mtodo Accept, e tambm o evento onDragDrop que ir ativar o mtodo EndDrop do objeto de origem. Pr-requisitos Para este exemplo alguns requisitos j devero estar em funcionamento, para que se possa seguir com o exemplo, so

eles:

1. Banco de dados com as tabelas PRODUTOS, PEDIDOS e ITENS, se possvel j alimentada com alguns registros para futuros testes. Tendo um relacionamento mestre / detalhe entre as tabelas PEDIDOS e ITENS, onde item o detalhe do pedido; 2. Uma conexo com a base de dados atravs de um DataModule. As providersFlags devidamente configuradas. Neste exemplo, o auto incremento dos campos chave feito pela aplicao; 3. Um formulrio principal com a propriedade FormStyle = fsMDIForm, com um menu fazendo a chamada dos demais formulrios Child; 4. O formulrio de cadastro de produtos com a propriedade FormStyle = fsMDIChild, dever conter um DataSource, um DBGrid (desabilitado para edio), um DBNavigator, um campo de busca, e os campos para o cadastro dos produtos, na figura 1 segue um layout de exemplo do formulrio de Cadastro de produtos; 5. O Formulrio de pedidos com a propriedade FormStyle = fsMDIChild, ser dividido em duas partes por ser mestre / detalhe. A parte de cima ter um DataSource configurado para a tabela de pedidos, um DBNavigator e os campos de cadastro da tabela de pedidos. Na parte de baixo, far referncia tabela de itens e ter um outro DataSource, um DBGrid (desabilitado para edio), mais trs botes para gerenciar esses itens. Na figura 2 segue um layout de exemplo do formulrio de pedidos; 6. Para editar os itens do pedidos ter tambm um formulrio com a propriedade FormStyle = fsNormal, ou seja, ele ser exibido com o mtodo ShowModal. Dever ter um DataSource configurado com a tabela de itens e os devidos campos para o preenchimento dos registros de itens. Na figura 3 segue um exemplo de layout para a tela de cadastro de itens de pedido.

Figura 1 Exemplo da tela de Cadastro de Produtos (Origem)

Figura 2 Exemplo da tela de Pedidos (Destino)

Figura 3 Exemplo da tela de cadastro de Itens de Pedidos

Codificando o objeto de origem O Objeto de origem do Drag on Drop se encontra no formulrio de cadastro de produtos, ele o DBGrid (Name = dbgPesquisa, Options/dgEditing = False). O usurio ir arrastar um campo do dbgPesquisa ao clicar em uma de suas clulas, ento o nosso drag on drop ter incio no evento onCellClick do dbgPesquisa, implemente o cdigo da listagem um neste

ento o nosso drag on drop ter incio no evento onCellClick do dbgPesquisa, implemente o cdigo da listagem um neste evento. p r o c e d u r eT f m P r o d u t o s . d b g P e s q u i s a C e l l C l i c k ( C o l u m n :T C o l u m n ) ; b e g i n { O b j e t od eO r i g e m-A od ei n i c i a l i z a rod r a g d r o p I n i c i a l i z aop r o c e s s od ed r a g d r o pa oc l i c a re mu m ac e l u l ad ag r i d } d b g P e s q u i s a . B e g i n D r a g ( T r u e ) ; e n d ; Listagem 1 Objeto Origem Inicia o Drag on Drop Como j foi dito, o prprio objeto de origem ir controlar tambm o fim da ao drag on drop, entende-se com isso que o dbgPesquisa ir descrever o que ir acontecer aps o objeto de destino aceitar a ao, ou seja, aps finalizar a ao, iremos dar um insert na tabela de itens j implementando o valor da chave do produto e o nome do mesmo para o campo virtual da tabela de itens. Veja o cdigo a ser implementado no evento onEndDrag do dbgPesquisa na listagem 2.

p r o c e d u r eT f m P r o d u t o s . d b g P e s q u i s a E n d D r a g ( S e n d e r ,T a r g e t :T O b j e c t ;X ,Y :I n t e g e r ) ; b e g i n { O b j e t od eO r i g e m-a od ef i n a l i z a roD r a gD r o p D e f i n eop r o c e d i m e n t oas e rt o m a d oa p sf i n a l i z a raa od ed r a g d r o p ( q u a n d os o l t aoc l i c kd om o u s e ) C o m oe s t a m o st r a b a l h a n d oc o mr e g i s t r o sd ab a s ed ed a d o s a t r i b u i m o so sv a l o r e sn o sd e v i d o sT f i e l d sd o sd a t a s e t s et a m b mf a z e m o sac h a m a d ad oe v e n t oo n c l i c kd ob t n I n c l u i ri t e m . } i f( T a r g e t< >n i l )t h e n i f( d m . c d s I t e n s . S t a t e=d s B r o w s e )t h e n b e g i n d m . c d s I t e n s . I n s e r t ; d m . c d s I t e n s I D _ P R O D U T O . A s I n t e g e r : =d m . c d s P r o d u t o s I D _ P R O D U T O . A s I n t e g e r ; f m P e d i d o s . b t n I n c l u i r . C l i c k ; f m P e d i d o s . S h o w ; f m P e d i d o s . d b g I t e n s P e d i d o . S e t F o c u s ; e n d ; e n d ; Listagem 2 Objeto de origem dizendo os procedimentos a ser tomado aps finalizar a ao At aqui j configuramos o nosso objeto de origem, agora o prximo passo codificarmos o destino da ao drag on drop. Vale lembrar que os dois formulrios estaro utilizando cdigos entre si, ou seja, devem estar declarados cada um na uses do outro, para fazer a utilizao desses cdigos. Codificando o objeto de destino Seguindo o conceito do exemplo, o produto dever ser arrastado at a grid de itens na tela de pedidos de clientes, ou seja, o nosso objeto de destino ser a DBGrid (Name = dbgItem, Options/dgEditing = False) que exibe os dados da tabela de itens. Importante saber que os botes de inserir, editar e excluir item j devem estar funcionando at este ponto, pois iremos usufruir do cdigo do boto inserir ao trmino da ao como visto na listagem 2. Neste objeto, sero acionados dois eventos para que a ao se realize corretamente. No evento onDragOver, verifica se o parmetro Source (indica o objeto de origem) confere com o objeto esperado, se sim, atribui-se o valor True para o mtodo Accept. No evento onDragDrop, aps ser aceito o objeto arrastado da incio a finalizao do processo chamando o mtodo EndDrag do objeto de origem e passando um parmetro True, dizendo que a partir desse ponto pode-se realizar os procedimentos contidos no evento onEndDrag do objeto de origem. Veja na listagem 3 os cdigos para implementar neste dois eventos do dgbItens.

p r o c e d u r eT f m P e d i d o s . d b g I t e n s D r a g D r o p ( S e n d e r ,S o u r c e :T O b j e c t ;X ,Y :I n t e g e r ) ;

p r o c e d u r eT f m P e d i d o s . d b g I t e n s D r a g D r o p ( S e n d e r ,S o u r c e :T O b j e c t ;X ,Y :I n t e g e r ) ; b e g i n { O b j e t oD e s t i n o-A od ec o n f i r m a op a r aoD r a g D r o p A p sa c e i t a roo b j e t oa r r a s t a d o ,c h a m a s eom t o d o E n d D r a gd oo b j e t od eo r i g e mp a r af i n a l i z a raa oD r a g D r o p } i f( S o u r c e=f m P r o d u t o s . d b g P e s q u i s a )t h e n f m P r o d u t o s . d b g P e s q u i s a . E n d D r a g ( T r u e ) ; e n d ; p r o c e d u r e T f m P e d i d o s . d b g I t e n s D r a g O v e r ( S e n d e r , S o u r c e : T O b j e c t ; X , Y : I n t e g e r ; S t a t e : T D r a g S t a t e ;v a rA c c e p t :B o o l e a n ) ; b e g i n { O b j e t od eD e s t i n o-a od ev e r i f i c a rs ea c e i t aoD r a g D r o p V e r i f i c as eoc o m p o n e n t es e n d oa r r a s t a d op o d es e rs o l t on e s t eo b j e t o-D e s t i n o } i f( S o u r c e=f m P r o d u t o s . d b g P e s q u i s a )t h e n A c c e p t : =t r u e ; e n d ; Listagem 3 Objeto de destino aceitando e finalizando a ao drag on drop Depois de realizadas estas codificaes o exemplo estar pronto para o teste, execute o projeto e abra ambas as telas de pedidos e cadastro de produtos, insira um novo pedido com seus dados, e para inserir os itens basta clicar em um produto da tela de cadastro e levar o cursor do mouse at a grid de itens na tela de pedidos, o cursor do mouse assumir uma outra forma durante esta ao, ao clicar na grid de itens, ser disparado o evento onClick do Boto Incluir e assim ser aberta a tela de cadastro de itens. Veja na imagem 4 este exemplo em tempo de execuo.

Figura 4 - Projeto finalizado

Concluso Com este artigo foi exemplificado uma das vrias formas de se trabalhar com a ao de arrastar e soltar utilizando o Delphi e seus formulrios do tipo MDI. Trabalhando com registros da base de dados, ou seja, de uma forma ilusria para o usurio ocorre o evento Arrastar e soltar, porm como podemos perceber pelos procedimentos que ocorrem ao trmino da ao, que apenas demos um insert na tabela de itens e atribuimos ao campo ID_PRODUTO da tabela de itens o valor do ID_PRODUTO da tabela de produtos. Com base neste exemplo pode-se criar outras funcionalidades para as suas aplicaes, que facilitar a vida do usurio final, sem muitas linhas de cdigos, apenas reutilizando eventos j existentes de alguns botes ou outros objetos dos forms. A nica exigncia para esta prtica entre forms no Delphi, que sejam do tipo MDIChild. Espero ter ajudado com as informaes deste artigo, at a proxima.

Sobre o Autor

Lucas Vieira de Oliveira, consultor tcnico do The Club. E-mail: suporte@theclub.com.br