• Viernes 8 de Noviembre de 2024, 10:34

Autor Tema:  Proceso autoreiniciable  (Leído 2205 veces)

SamRico

  • Nuevo Miembro
  • *
  • Mensajes: 4
    • Ver Perfil
Proceso autoreiniciable
« en: Miércoles 6 de Octubre de 2010, 13:14 »
0
Buenas tardes, estoy empezando a estudiar todos los mecanismos de Visual Basic y ahora estoy atascado con un pequeño problema que divisé en uno de los mismos. El programa consiste en un formulario negro donde cada milisegundo aparece un puntito de color aleatorio en una posición aleatoria del formulario. Ahora bien, cuando minimizo, o pongo otra ventana (una página web por ejemplo y vuelvo a maximizar o a focalizar en el formulario, todos los puntos que se habian ido generando desaparecen, y empieza desde cero.

Este es el código:
Código: Visual Basic
  1.  
  2. Option Explicit
  3.  
  4. Private Sub Command1_Click()
  5.     End
  6. End Sub
  7.  
  8. Private Sub Form_Load()
  9.     Randomize (Timer)
  10.     Timer1.Interval = 1
  11.     Timer1.Enabled = True
  12. End Sub
  13.  
  14. Private Sub Form_Resize()
  15.     Command1.Top = Me.ScaleHeight - Command1.Height - 120
  16.     Command1.Left = Me.ScaleWidth - Command1.Width - 120
  17. End Sub
  18.  
  19. Private Sub Timer1_Timer()
  20.     Dim CorX As Integer, CorY As Integer
  21.     Dim VRojo As Integer, VVerde As Integer, VAzul As Integer
  22.     'Obtenemos las coordenadas aleatorias de los puntos a dibujar.
  23.    CorX = Int(Rnd * Me.ScaleWidth)
  24.     CorY = Int(Rnd * Me.ScaleHeight)
  25.     'Obtenemos valores aleatorios para dar color al punto a dibujar.
  26.    VRojo = Int(Rnd * 255)
  27.     VVerde = Int(Rnd * 255)
  28.     VAzul = Int(Rnd * 255)
  29.     'Dibujamos el punto en el lugar y con el color obtenido anteriormente.
  30.    PSet (CorX, CorY), RGB(VRojo, VVerde, VAzul)
  31. End Sub
  32.  
  33.  

¿Tenéis alguna idea de cómo solventar este pequeño problema?

Nebire

  • Miembro HIPER activo
  • ****
  • Mensajes: 670
    • Ver Perfil
Re: Proceso autoreiniciable
« Respuesta #1 en: Miércoles 6 de Octubre de 2010, 14:10 »
0
Activa la propiedad autoredraw =true (del formulario si dibujas en él o del picture si dibujas en un picturebox).

Esto hará que seaun gráfico 'persistente'... y el contenido sea 'memorizado' gráficamente.
«Ma non troppo»
----> ModoVacaciones = False<----

SamRico

  • Nuevo Miembro
  • *
  • Mensajes: 4
    • Ver Perfil
Re: Proceso autoreiniciable
« Respuesta #2 en: Jueves 7 de Octubre de 2010, 08:29 »
0
Gracias, funciona perfectamente maestro.

Otra pequeña duda que tengo.

Verás, cuando le doy doble click al formulario se me carga otro formulario con una etiqueta que muestra la hora en tiempo real (esto no viene al caso de mi pregunta).

La cosa es que quiero mover ese formulario con las teclas de movimiento del teclado y lo he hecho del siguiente modo.
Código: Visual Basic
  1. Option Explicit
  2.     Dim Movimiento As Byte
  3.  
  4. Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
  5.     If (KeyCode = 37) Then FrmControl.Left = FrmControl.Left - Movimiento
  6.     If (KeyCode = 38) Then FrmControl.Top = FrmControl.Top - Movimiento
  7.     If (KeyCode = 39) Then FrmControl.Left = FrmControl.Left + Movimiento
  8.     If (KeyCode = 40) Then FrmControl.Top = FrmControl.Top + Movimiento
  9. End Sub
  10.  
  11. Private Sub Form_Load()
  12.     lblTiempo = Time
  13.     Timer2.Enabled = True
  14.     Timer2.Interval = 1000
  15.     FrmControl.Width = lblTiempo.Width
  16.     FrmControl.Height = lblTiempo.Height
  17.     lblTiempo.Top = 0
  18.     lblTiempo.Left = 0
  19.     Movimiento = 150
  20. End Sub
  21.  

Ahora bien, cuando le doy a dos teclas a la vez, solo funciona una. ¿Existiría alguna forma de decirle que cuando presione, por ejemplo la tecla 37 y 38 (izquierda y arriba), se vaya hacia arriba y hacia la izquierda a la vez?, es decir en diagonal.

Gracias.

Nebire

  • Miembro HIPER activo
  • ****
  • Mensajes: 670
    • Ver Perfil
Re: Proceso autoreiniciable
« Respuesta #3 en: Jueves 7 de Octubre de 2010, 14:19 »
0
claro que hay forma de decirle que realice 2 movimientos a la vez, lo que no hay es forma de recibir a la vez info sobre 2 teclas pulsadas de forma directa a la vez... porque lo que en tiempo nuestro 'es a la vez', para el ordenador es un 'tiempo eterno'... Sólo puede procesarse 2 teclas a la vez de forma directa cuando una de estas es de tipo 'optionButton' (como ALT,  CTRL y SHIFT) o de tipo 'Chechbox' (como BloqMayus, BloqNum,etc...)

Hay 2 formas de procesar 2 teclas a la vez, 1 sería crearte un minibuffer (una matriz de 2-5 elementos) que se rellena cuando cuando una tecla se pulsa (sería funcionaría como una cola circular, pero obviando el espacio ocupado) y un temporizador que chequea dicho buffer cada cierto tiempo, digamos más humano si 2 teclas distintas se pulsan dentro de un intérvalo pongamos de 150ms. se procesan como 1 unidad de movimiento en la dirección deseada, si las 2 teclas distintas han sucedido en un intérvalo mayor, se procesa sólo la primera de ellas y se deja la siguiente para ver si existe una ocurriencia en el sigiente intérvalo.

No es difícil pero siendo principiante diseñar un búffer temporizado de las características susodichas podría darte ciertos problemas debido a algunas complejidades resultantes más debido posiblemente a las carencias de conocimiento del lenguaje que a otra cosa.

Por elllo yo te propongo otra solución mucho más sencilla que la anterior...
Mira el teclado numérico, si te fijas en las teclas 2,4,8,6 tienen una flecha, tienen idéntico significado a las teclas de cursor que utilizas, con las alvedad, de que sólo se comportan como teclas de cursor cuando está desactivada la tecla 'BloqNum', entonces puedes emplear la tecla '1' para una dirección sur-oeste, la tecla '7' para una dirección noroeste, la tecla '9' para una dirección noreste y la tecla 3 para una dirección sureste. los códigos de estas teclas son: 35,36,34 y 33 respectivamente...
Ahora bien supongamos que quieres usar estas teclas como cursor independientemente del estado de la tecla BloqNum, entonces debes tratar también los códigos de estas teclas que cambian de valor en esta situación (sólo deberías hacerlo si no tienes programado el uso de teclas numéricas para alguna otra acción).. te pongo tecla y valor:  t1=97; t2=98 ; t3=99 ; t4=100 ; t6=102 ; t7=102 ; t8=104 y t9=105.
Entonces tu código quedaría algo así como:
Código: Visual Basic
  1.  
  2. Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
  3.     With Me  ' ó FrmControl si el formulario a mover es otro que éste en el que se pulsan las teclas...
  4.         Select Case KeyCode
  5.             Case 37, 100 ' izquierda - oeste
  6.                 .Left = .Left - movimiento
  7.             Case 38, 104 ' arriba - norte
  8.                 .Top = .Top - movimiento
  9.             Case 39, 102  ' derecha - este
  10.                 .Left = .Left + movimiento
  11.             Case 40, 98 ' abajo - sur
  12.                 .Top = .Top + movimiento
  13.             Case 35,97  ' suroeste
  14.                 Call .Move(.Left - movimiento, .Top + movimiento)
  15.             Case 36,103  ' noroeste
  16.                 Call .Move(.Left - movimiento, .Top - movimiento)
  17.             Case 34,99  ' noreste
  18.                 Call .Move(.Left + movimiento, .Top + movimiento)
  19.             Case 33 ,105 ' suoreste
  20.                 Call .Move(.Left + movimiento, .Top - movimiento)
  21.        End Select
  22.    End With
  23. End Sub
  24.  

Como puedes ver esta solución es muy fácil de aplicar y de entender...
Adicionalmente podrías programar la tecla 5, para centrar el formulario en la pantalla...
«Ma non troppo»
----> ModoVacaciones = False<----