Shell 20-02-2024, 00:22
Buenas!.

En este ejemplo. Lo que traté fue de que algo que ocurre en un formulario se informe en otro.
En este caso son sprites/dibujos que rebotan por el área de un control DrawingArea y cuando
llega a uno de los bordes del control DrawingArea se crea un evento, independiente del objeto.
Cada uno crea los suyos. Los llamo rectángulos, pero son cuadrados.

[Imagen: k8zRMG9.png]

Así en el FMain tengo:

Código:
Const NUMDECUADRADOS As Integer = 3
Const ANCHOVENTANA As Integer = 600
Const ALTOVENTANA As Integer = 600

Private figuras As Rectangulo[]

Private unrect As Rectangulo
Private unformulario As FormTestContenedores

Private obs As Observer

El número de cuadrados es definible, a más cuadrados, mas información en el formulario de seguimiento.
Cada uno de los objetos creados va a tener su observador.

Código:
For i As Integer = 0 To NUMDECUADRADOS - 1
    unrect = New Rectangulo([Pizarra.W / 2, Pizarra.h / 2], [Rand(-5, 5), Rand(-5, 5)], pizarra, i)
    figuras.Add(unrect)
    obs = New Observer(figuras) As "Vigilo"
  Next

El FMain se encarga de informar al formulario de seguimiento de lo que está ocurriendo.
En la clase rectángulo:

Código:
Event Izquierdo(mensaje As String, indice As Integer)
Event Derecho(mensaje As String, indice As Integer)
Event Superior(mensaje As String, indice As Integer)
Event Inferior(mensaje As String, indice As Integer)

Y el lanzador de eventos.

Código:
Public Sub Actualizar()

  If Me.xy[0] < 0 Then
    Raise Izquierdo("Rectángulo choca con borde izquierdo", Me.indice)
    Me.acel[0] *= -1
  Else If Me.xy[0] > Me.area.W - ANCHORECT Then
    Raise Derecho("Renctángulo choca borde derecho", Me.indice)
    Me.acel[0] *= -1
  Endif

  If Me.xy[1] > Me.area.H - ALTORECT Then
    Raise Inferior("Rectángulo choca con borde inferior", Me.indice)
    Me.acel[1] *= -1
  Else If Me.xy[1] < 0 Then
    Raise Superior("Rectángulo choca con borde superior", Me.indice)
    Me.acel[1] *= -1
  Endif

  Me.xy[0] += Me.acel[0]
  Me.xy[1] += Me.acel[1]

End

( Me estoy dando cuenta que sobra el observador que tiene la propia clase ). No es sencillo estos temas.
Nos vamos basando en ejemplos que hemos visto anteriormente.

Y en el formulario que se muestra el seguimiento de los objetos. Se encuentra el procedimiento:
MostrarMensaje(mensaje , indice)

En el formulario de monitorización se crean una serie de contenedores que se van repitiendo según
el número de sprites por el área de dibujo.

El número del tag del contenedor en el que se muestra el mensaje tiene su propiedad Tag igual a 1.
Por cada uno de los sprites se va mirando su estado y se muestra en el que contenedor que le corresponde.

Código:
Public Sub MostrarMensaje(mensaje As String, indice As Integer)

  Dim ob As Object

  For Each ob In paneles[indice].Children
    If ob.tag = 1 Then
      ob.text = mensaje
      Break
    Endif
  Next

End

Es un tema a estudiar, el generar eventos personalizados y controlarlos.

Saludos
Archivos adjuntos
Shell 19-02-2024, 01:26
Buenas!.

Y este otro ejemplo, el que mediante la pulsación del ratón se controla los segundos que tienes pulsado el ratón sobre
el área de dibujo. Luego si lo sueltas ese contador de segundos vuelve a cero. Y ademas, si quieres cerrar la ventana,
esta contará tres segundos antes de cerrarse y no dejará cerrarse sin pasar esos tres segundos.

La idea es que para que algo se ejecute "indefinidamente" necesita el apoyo de algo y un control del mismo.

[Imagen: 5d6lw2M.png]


Código:
' Gambas class file

Const VENTANA_ANCHO As Integer = 800
Const VENTANA_ALTO As Integer = 600
Private canvas As DrawingArea
Private timer1 As Timer

Private terminar As Boolean
Private pulsado As Boolean
Private cuenta As Integer

Private vigilante As Observer

Public Sub Form_Open()

  vigilante = New Observer(Me) As "Vigilante"

  With Me
    .Background = Color.Black
    .Title = "Evento MouseDown y MouseUP"
    .Arrangement = Arrange.Horizontal
    .Resizable = False
    .AutoResize = True
  End With

  canvas = New DrawingArea(Me) As "Canvas"
  With canvas
    .W = VENTANA_ANCHO
    .H = VENTANA_ALTO
    .Background = Color.Black
  End With

  timer1 = New Timer As "Timer1"
  Timer1.Delay = 1000

End

Public Sub Canvas_MouseDown()

  If Not terminar Then
    If Mouse.Left Then
      pulsado = True
      Timer1.Start
    Endif
  Endif

End

Public Sub Canvas_MouseUp()

  If Not terminar Then
    pulsado = False
    cuenta = 0
    Timer1.Stop
  Endif
  canvas.Refresh

End

Public Sub Canvas_Draw()

  Dibujar

End

Public Sub Dibujar()

  Dim RC As RectF
  Dim mensaje As String

  Paint.Font = Font["MonoSpace, 14"]
  If pulsado And Not terminar Then
    mensaje = "Se ha pulsado el boton izquierdo del ratón durante: " & Str(cuenta) & " segundos"
    RC = Paint.TextSize(mensaje)
  Else If Not pulsado And Not terminar Then
    mensaje = "Se ha levantado el dedo del botón izquierdo del ratón"
    RC = Paint.TextSize(mensaje)
  Else If Not pulsado And terminar Then
    mensaje = "Este programa se cerrará en " & Str(cuenta) & " segundos"
    RC = Paint.TextSize(mensaje)
  Endif
  Paint.Text(mensaje, (canvas.w - RC.Width) / 2, (canvas.Height - RC.Height) / 2, RC.Width, RC.Height)
  Paint.Brush = Paint.Color(Color.Green)
  Paint.Fill

End

Public Sub Timer1_Timer()

  If Not terminar Then
    cuenta += 1
    canvas.Refresh
  Else If terminar And cuenta > 0 Then
    cuenta -= 1
    canvas.Refresh
  Else If terminar And cuenta = 0 Then
    Timer1.Stop
    Me.Close
  Endif

End

Public Sub Vigilante_Close()

  If Not terminar Then
    pulsado = False
    terminar = True
    cuenta = 4
    Timer1.Start
  Endif

End

Public Sub Form_Close()

  If cuenta = 0 And terminar Then
    Quit
  Else
    'Evitar el cierre del programa si no se cumplen las condiciones
    Stop Event
  Endif

End

Saludos
Shell 19-02-2024, 01:20
Buenas!.

¿ Se acuerdan que es un bucle ?. Big Grin

- Mediante el ratón y la pulsación del botón izquierdo de este voy creando sprites/imágenes por un control DrawingArea.

Encontré dos formas de hacerlo:

- Mediante un bucle While que comprueba constantemente si se ha pulsado el botón izquierdo del ratón

Pero eso tiene un problema. Un bucle While que está constantemente comprobando y comprobando parece
algo como un bucle sin fin. Tiene que haber algo que lo frene un poco..

Primera versión, con el bucle While.

Código:
Public Sub CrearSprites(ix As Integer, iy As Integer)

  Dim asprite As Sprite
  Dim aimage As Image

  While botonpulsado
    aimage = Image.Load("Imagenes/" & anomimagenes[Rand(0, anomimagenes.max)])
    asprite = New Sprite([ix, iy], [Rnd(-1, 1), Rnd(-1, 1)], Rand(0, 360), Deg(Rnd(-0.1, 0.1)), aimage)
    asprites.Add(asprite)
    Wait 0.01 'Obligatorio dentro del bucle. Cada Sprite se crea según este tiempo, no lo que diga el reloj
  Wend

End

Ese bucle recibe la coordenada del ratón y en la zona de dibujar del control DrawingArea no se controla si se ha pulsado o no
el botón izquierdo del ratón. Ese DrawingArea es refrescado por un Timer.

Código:
Public Sub Ventana_Draw()

  Dim asprite As Sprite

  For Each asprite In asprites
    asprite.Dibujar()
    asprite.Update()
    asprite.vel = colisionBordes([VENTANA_ANCHO, VENTANA_ALTO], asprite)
  Next

End

Segunda versión. Se evita el uso del bucle while.

Código:
Public Sub CrearSprites(ix As Integer, iy As Integer)

  Dim asprite As Sprite
  Dim aimage As Image

  aimage = Image.Load("Imagenes/" & anomimagenes[Rand(0, anomimagenes.max)])
  asprite = New Sprite([ix, iy], [Rnd(-1, 1), Rnd(-1, 1)], Rand(0, 360), Deg(Rnd(-0.1, 0.1)), aimage)
  asprites.Add(asprite)

End

Tuve que añadir dos variables comunes a todo el formulario para saber en "todo" momento donde se ha hecho clic
con el ratón.

Código:
Public Sub Ventana_Draw()

  Dim asprite As Sprite

  If botonpulsado Then CrearSprites(mx, my)
  For Each asprite In asprites
    asprite.Dibujar()
    asprite.Update()
    asprite.vel = colisionBordes([VENTANA_ANCHO, VENTANA_ALTO], asprite)
  Next

End

botonpulsado se produce naturalmente cuando hacemos click con el ratón en algún lugar de la ventana de dibujo.
Al usar esas variables globales (por llamarlas de alguna forma, común a toda la clase). Carece de importancia
llamar a crear el sprite en los eventos del ratón.

Uso dos:

- Uno para dibujar en el mismo lugar. MouseDown
- Para crear una estela de sprites por la zona de dibujo. MouseMove.

Código:
Public Sub Ventana_MouseDown()

  If Mouse.Left Then
    botonpulsado = True
    mx = Mouse.X
    my = Mouse.Y
    'CrearSprites(mx, my)
  Endif

End

Public Sub Ventana_MouseMove()

  mx = Mouse.X
  my = Mouse.Y
  'If Mouse.Left Then CrearSprites(mx, my)

End

Voy a subiros el proyecto ejemplo. FormEjemplo1 usa el bucle While y FormEjemplo2, no.
El área de dibujo es de 1600x900. No creo que haya problema en reducirla, podéis hacerlo en las dos constantes del principio
del código.

No subo la imagen de la demo entero ya que es un poco grande. Subo una parte. Solo objetos por todos lados
creados con el ratón.

[Imagen: nmntXnn.png]

Recordar , debéis dejar pulsado el botón izquierdo. También podéis dejado pulsado el botón y mover el ratón.
Ejecutar un form u otro. Y ojo, a más imágenes , mas se calienta la computadora. Rolleyes

Llevo unos días con esto que puede parecer una tontería. En realidad, queriendo controlar otras cosas.

Saludos
Archivos adjuntos
.gz
DemoTest-0.0.1.tar.gz (Tamaño: 73.08 KB Descargas: 3)
Páginas (557):    1 98 99 100 101 102 557   
Bienvenido, Invitado
Tienes que registrarte para poder participar en nuestro foro.
Recordarme?
Miembros: 284
Último miembro: VALENTIN KORONADO
Temas del foro: 1,719
Mensajes del foro: 8,922
Últimos temas
Un sistema de ayudas cont...
Foro: Videotutoriales
Último mensaje por: Shordi, Hace 4 horas
Respuestas: 2 - Vistas: 171
Publicidad
Foro: Sobre gambas-es.org
Último mensaje por: Shordi, 18-06-2025, 07:35
Respuestas: 5 - Vistas: 127
Web con gambas, a ver si ...
Foro: WebApp/WebForms
Último mensaje por: jackrobot, 16-06-2025, 17:11
Respuestas: 40 - Vistas: 31,699
Crear una aplicación para...
Foro: Bases de Datos
Último mensaje por: Shell, 29-05-2025, 20:11
Respuestas: 11 - Vistas: 1,198
Paso de parámetros a una ...
Foro: General
Último mensaje por: guizans, 29-05-2025, 19:27
Respuestas: 9 - Vistas: 732
Powered By MyBB, © 2002-2025 MyBB Group.
Made with by Curves UI.