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
Ir a la versión completa