Comunidad Underground Hispana  

Retroceder   Comunidad Underground Hispana > Programacion > Visual Basic y Net


Respuesta Crear Nuevo Tema
 
Compartir en twitter LinkBack Herramientas Desplegado
Antiguo 06-ago-2008, 11:18   #1
Veterano
 
Fecha de Ingreso: mayo-2006
Amigos 0
Mensajes: 751
Gracias: 0
Agradecido 5 veces en 4 mensajes.
Predeterminado Mover Controles en tiempo de ejecucion

Lo que haremos sera poder mover controles dentro de algun otro control (como puede ser un Frame) o del formulario mismo. Es decir, cuando el usuario haga clic en un control (en mi ejemplo use un List) y arrastre, sin soltal el clic, el objeto se movera junto con el cursor...

Para mover objetos dentro de otro objeto podemos usar Drag&Drop; es un metodo muy sencillo...
Primero que nada vamos a habilitar el control donde se van a mover los objetos, para, justamente, moverlos.
Esto lo vamos a hacer facil:
Seleccionamos el objeto donde vamos a mover los controles, por ejemplo el formulario... Asique en la lista de objetos, seleccionamos el Form; y en procedimientos seleccionamos DragDrop, como muestra l aimagen:


Dentro de este procedimiento vamos a indicar la funcion que movera el objeto, dicha funcion toma los valores X e Y para mover el objeto... Aqui ocurre un problema, y es que si pasamos el X e Y que toma VB, nos movera mal el objeto con respecto al cursor... La solucion es simple, debemos restarle a este X e Y, los valores X e Y que tenia el objeto antes de moverlos:
Código:
Private Sub Form_DragDrop(Source As Control, X As Single, Y As Single)
Source.Move X - X_Inicial, Y - Y_Inicial
End Sub
  
Este X_Inicial e Y_Inicial vamos a tomarlos cuando se haga clic en el contorl que se va a mover; entonces vamos a tomar un control para mover, supongamos un List... Añadimos un List al formulario y en su evento MouseDown vamos a darle los valores a X_Inicial e Y_Inicial:

Código:
Private Sub List1_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
'Los valores X e Y del control al inicio
X_Inicial = X
Y_Inicial = Y
End Sub
  
Pero para!!!, nos falto de declarar las varibles x_Inicial e Y_inicial, ¿que detalle no?... las vamos declarar de forma "modular" es decirl, las vamos a hacer de forma global para todo el codigo del form1. Para esto nos situamos en la parte superior del codigo, fuera de cualquier Sub o funcion existente en nuestro codigo, y las declaramos... Supongo que ya sabes como hacer, pero por si te surgen dudas te las pongo:
Código:
Dim X_Inicial As Long
Dim Y_Inicial As Long
  
Long: Numero entero largo

Ahora debemos indicarle a VB que inciaremos un Drag, es decir, activamos el Drag en el List; esto lo hacemos cuando se haga clic en el control (List), entonces debe ser nuevamente en MouseDown:

Código:
Private Sub List1_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
'Los valores X e Y del control al inicio
X_Inicial = X
Y_Inicial = Y
'Empezar el Drag
List1.Drag
End Sub
  
aunque no lo puedas creer esto es todo ^^

Solo por seguridad podriamos indicar que se termine el drag cuando se suelte el boton del mouse, es decir en el evento MouseUp del control (List):

Código:
Private Sub List1_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)
'Terminar Drag
List1.Drag vbEndDrag
End Sub
  
Ahora si hemos terminado...

En este caso hemos dado la propiedad a un control List llamado List1 de moverse en el Formulario (Form1)... Si pusieramos el List en Frame deveriamos indicar la funcion para mover el objeto en el evento DragDrop del Frame:

Código:
Private Sub Frame1_DragDrop(Source As Control, X As Single, Y As Single)
Source.Move X - X_Inicial, Y - Y_Inicial
End Sub
  
Es lo mismo... ¿Sencillo no?

Otra cosa es que si no le indicamos a un control que mueva dentro, en realidad es sobre él, no podremos hacerlo... Aver si me puedo explicar mejor, Si yo pusiera otro List en mi ejemplo anterior, cuando arrastro el List1 sobre el List2, y suelto el clic, el List1 vuelve a su posicion original, porque no l eindique al List2 que mueva el objeto sobre él... Entonces hagamos esto, añade otro List al ejemplo anterior y asi nomas prueba de soltar el List1 sobre le List2, veraz lo que pasa.. ¿Que pasa? Lo que ya dije ¬¬
Ahora agregemos esto al codigo:

Código:
Private Sub List2_DragDrop(Source As Control, X As Single, Y As Single)
Source.Move X - X_Inicial, Y - Y_Inicial
End Sub
  
Y ahora si podemos mover el List1 (y cualquier otro contorl) sobre le List2...
Cualquier duda ya saben, posteenla aqui ¬¬

Pues bien, eso es todo...

Salu2!
Z-MAX está desconectado   Responder Citando
Respuesta

Herramientas
Desplegado

Normas de Publicación
No puedes crear nuevos temas
No puedes responder mensajes
No puedes subir archivos adjuntos
No puedes editar tus mensajes

Los Códigos BB están Activado
Las Caritas están Activado
[IMG] está Activado
El Código HTML está Desactivado
Trackbacks están Activado
Pingbacks están Activado
Refbacks están Activado



Temas Similares
Tema Autor Foro Respuestas Último mensaje
ayuda con "tiempo de ejecucion comprimido"! ManuelM2009 Seguridad 3 11-jul-2009 15:53
TIME RESET, RESETEA EL TIEMPO Y RENUEVA IP PARA TIEMPO INFINITO EN RAPIDSHARE cervatano Software 10 17-mar-2009 03:33
Cuanto tiempo le dedican al foro? En cual subforo pasan mas tiempo? SKINHEADHACK Off-Topic 9 26-feb-2009 14:28
Icono en tiempo de ejecucion Z-MAX Visual Basic y Net 2 11-jun-2007 13:22
Error en tiempo de ejecucin? problemas con un campo NULL... :( Satine83 Visual Basic y Net 1 26-mar-2006 15:26



Portal Hacker
Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2014, Jelsoft Enterprises Ltd.
SEO by vBSEO 3.6.0