Programación General > Visual Basic para principiantes

 Proceso autoreiniciable

(1/1)

SamRico:
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 --- Option Explicit Private Sub Command1_Click()    EndEnd Sub Private Sub Form_Load()    Randomize (Timer)    Timer1.Interval = 1    Timer1.Enabled = TrueEnd Sub Private Sub Form_Resize()    Command1.Top = Me.ScaleHeight - Command1.Height - 120    Command1.Left = Me.ScaleWidth - Command1.Width - 120End Sub Private Sub Timer1_Timer()    Dim CorX As Integer, CorY As Integer    Dim VRojo As Integer, VVerde As Integer, VAzul As Integer    'Obtenemos las coordenadas aleatorias de los puntos a dibujar.    CorX = Int(Rnd * Me.ScaleWidth)    CorY = Int(Rnd * Me.ScaleHeight)    'Obtenemos valores aleatorios para dar color al punto a dibujar.    VRojo = Int(Rnd * 255)    VVerde = Int(Rnd * 255)    VAzul = Int(Rnd * 255)    'Dibujamos el punto en el lugar y con el color obtenido anteriormente.    PSet (CorX, CorY), RGB(VRojo, VVerde, VAzul)End Sub  
¿Tenéis alguna idea de cómo solventar este pequeño problema?

Nebire:
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.

SamRico:
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 ---Option Explicit    Dim Movimiento As Byte Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)    If (KeyCode = 37) Then FrmControl.Left = FrmControl.Left - Movimiento    If (KeyCode = 38) Then FrmControl.Top = FrmControl.Top - Movimiento    If (KeyCode = 39) Then FrmControl.Left = FrmControl.Left + Movimiento    If (KeyCode = 40) Then FrmControl.Top = FrmControl.Top + MovimientoEnd Sub Private Sub Form_Load()    lblTiempo = Time    Timer2.Enabled = True    Timer2.Interval = 1000    FrmControl.Width = lblTiempo.Width    FrmControl.Height = lblTiempo.Height    lblTiempo.Top = 0    lblTiempo.Left = 0    Movimiento = 150End Sub 
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:
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 --- Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)    With Me  ' ó FrmControl si el formulario a mover es otro que éste en el que se pulsan las teclas...        Select Case KeyCode            Case 37, 100 ' izquierda - oeste                .Left = .Left - movimiento            Case 38, 104 ' arriba - norte                .Top = .Top - movimiento            Case 39, 102  ' derecha - este                .Left = .Left + movimiento            Case 40, 98 ' abajo - sur                .Top = .Top + movimiento            Case 35,97  ' suroeste                Call .Move(.Left - movimiento, .Top + movimiento)            Case 36,103  ' noroeste                Call .Move(.Left - movimiento, .Top - movimiento)            Case 34,99  ' noreste                Call .Move(.Left + movimiento, .Top + movimiento)            Case 33 ,105 ' suoreste                Call .Move(.Left + movimiento, .Top - movimiento)       End Select   End WithEnd Sub 
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...

Navegación

[0] Índice de Mensajes

Ir a la versión completa