Dedicado a mis proyectos en Gambas ,un lenguaje de programación parecido al Visual Basic + Java pero ampliamente mejorado y...¡¡para gnu/linux!!.La potencia del gnu/linux sumada a la facilidad del Basic



Consultas, Desarrollo de programas y petición de presupuestos:



domingo, 17 de febrero de 2013

Ejemplo de uso del contenedor ScrollView


Os traigo un ejemplo de uso del contenedor llamado scrollview, que nos permite trabajar con formulario o imágenes que tengan grandes dimensiones, y movernos atreves de ellos mediante scrollbar horizontales y verticales


 

En este ejemplo podeis crear objetos dentro del scrollview (unos muñecos de nieve o un arbol), cogerlos y moverlos a lo largo del fondo para colocarlos donde querais.


He tenido bastantes problemas para usar este contenedor, ya que los objetos, al mover la barras de scroll, no me dejaba volverlos seleccionar.

 Al final, Shordi, un compañero del foro de gambas-es.org, me dio la pista para resolverlo, usando las coordenadas absolutas de los objetos en vez de las coordenadas relativas. Gracias Shordi !!!

Os comento, los objetos tienen propiedades X, e Y, que son la posición con respecto al contendor que los contiene (son las llamadas coordenadas relativas). Ademas tienen las coordendas ScreenX, y ScreenY, que son las coordenadas respecto a nuestro escritorio (coordenadas absolutas).

El problema era que cuando se movia la vista del scrollview, las coordenadass relativas cambiaban, y el bucle que usaba para detectar los objetos cuando apretaba el boton del raton, no los encontraba.


Al final usando las coordenadas absolutas, pude resolver este problema.


Además, también tuve que añadir los eventos relacionados con la imagen de fondo y del propio scrollview, para que cuando se pulsara el boton (_MouseDown() y _MouseUp() ) , o se arrastrara ( _MouseMove() ), también se comprobara si la posición del ratón coincidía con la posición de algunos de los objetos.

Aqui os dejo parte del código que he usado, al final del articulo teneis el enlace de descarga del codigo completo.

-->

Public Sub Obs_MouseDown()
Print "Evento en Obs.....mousedoww"
capturaDown(Mouse.ScreenX, Mouse.screeny)
End

Public Sub Obs_MouseUp()
Print "Evento en Obs....up"
capturaUp()
End

Public Sub obs_MouseMove()
Print "Evento en Obs...mousemove"
capturaMoviendo(Mouse.screenx, Mouse.screeny)
End


'------------------------------------------------------------------------
' up, down, y move
'------------------------------------------------------------------------

Public Sub capturaUp()
'suelta el boton...
If Not IsNull(objetoCapturado) Then
If objetoCapturado.tipo = "Buenos" Then
objetoCapturado.Picture = imagenBuenos
Else
If objetoCapturado.tipo = "Malosfesor" Then
objetoCapturado.Picture = imagenMalos
Endif
Endif
LabelCoordenada.x = objetoCapturado.x
LabelCoordenada.y = objetoCapturado.y - 20
LabelCoordenada.text = "(" & objetoCapturado.x & "," & objetoCapturado.y & ")"
LabelTextoPersona.Visible = False
LabelCoordenada.Visible = False
objetoCapturado = Null
Endif
End

Public Sub capturaMoviendo(mousex As Integer, mousey As Integer)
If Not IsNull(objetoCapturado) Then
objetoCapturado.X += (MouseX - objetoCapturado.ScreenX) / escalafoto
objetoCapturado.y += (Mousey - objetoCapturado.ScreenY) / escalafoto
LabelTextoPersona.x = objetoCapturado.x
LabelTextoPersona.y = objetoCapturado.y + imagenMalos.h / escalafoto
LabelTextoPersona.Visible = True
LabelCoordenada.x = objetoCapturado.x
LabelCoordenada.y = objetoCapturado.y - 20
LabelCoordenada.text = "(" & objetoCapturado.x & "," & objetoCapturado.y & ")"
LabelCoordenada.Visible = True
Endif
End

Public Sub capturaDown(mouseScreenx As Integer, mouseScreeny As Integer)
Dim objtemp As ClassMejorPictureBox
'busco si algun array
For Each objtemp In arrayBox
Print " Objeto:", objtemp.screenX, objtemp.screenY
Print " scrollX:", ScrollView1.Scrollx
If (MousescreenX + 50) >= objtemp.screenX And objtemp.screenX >= (MousescreenX - 20) Then
If (MousescreenY - 20) <= objtemp.ScreenY And (MousescreenY + 50) >= objtemp.screenY Then
objetoCapturado = objtemp
If objetoCapturado.tipo = "Buenos" Then
objetoCapturado.Picture = imagenBuenosDes
LabelTextoPersona.text = objetoCapturado.Texto
LabelCoordenada.x = objetoCapturado.x
LabelCoordenada.y = objetoCapturado.y - 20
LabelCoordenada.text = "(" & objetoCapturado.x & "," & objetoCapturado.y & ")"
LabelCoordenada.Visible = True
Break
Else
If objetoCapturado.tipo = "Malosfesor" Then
objetoCapturado.Picture = imagenMalosDes
LabelTextoPersona.text = objetoCapturado.Texto
LabelCoordenada.x = objetoCapturado.x
LabelCoordenada.y = objetoCapturado.y - 20
LabelCoordenada.text = "(" & objetoCapturado.x & "," & objetoCapturado.y & ")"
LabelCoordenada.Visible = True
Break
Endif
Endif
Break
Endif
Endif
Next
End


 Enlace de descarga del ejemplo completo: https://www.box.com/s/if3jjqbom2bysvas10lx

 Nota:
La descarga es gratuita, solo teneis que ver los anuncios, esperar 5 segundos y pulsar sobre el botón superior derecho que os sale despues de la cuenta atrás.