Accion sobre un array de controles (labels)

Iniciado por Güan, 24 Diciembre 2006, 18:01 PM

0 Miembros y 2 Visitantes están viendo este tema.

Güan

   Wenas a todos, vereis, eske estaba haciendo un juegecillo, donde un shape qe se mueve, y al tocar un label, "label1" (hay 20, index del 0 al 19) te salte un msgbox. Esto lo comprueba un timer con un interval de 1, y no me apetece escribir 20 codes iguales. Sin matriz, el code (para 1 label) sería:
Código:

Private Sub Timer1_Timer()
If Shape1.Top >= Label1.Top And Shape1.Top + Shape1.Height <= Label1.Top + Label1.Height Then
If Shape1.Left >= Label1.Left And Shape1.Left + Shape1.Width <= Label1.Left + Label1.Width Then
  MsgBox "OK"
End If
End If
End Sub

Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
Shape1.Move X - 495 / 2, Y - 495 / 2
End Sub


Pero no tengo mucha idea sobre matrices de controles, y nose qe hay qe poner junto con label1 para qe funcione con todos por igual...
Sabeis como se haría?
Gracias

DrakoX

podrias hacerlo con un For,
prueba de la siguiente manera

Private Sub Timer1_Timer()
For i = 0 To 19
    If Shape1.Top >= Label(i).Top And Shape1.Top + Shape1.Height <= Label(i).Top + Label(i).Height Then
        If Shape1.Left >= Label(i).Left And Shape1.Left + Shape1.Width <= Label(i).Left + Label(i).Width Then
            MsgBox "OK"
        End If
    End If
Next i
End Sub


salu2 y suerte

salu2

Güan

mmm.... no, no me sirve, no me da error, pero ignora cuando pasa por encima...
el problema del codigo qe me has dado creo qe es qe el timer es unicamente de una milésima de segundo, y en cada milésima tiene qe comprobar los 10 uno a uno, por tanto aparte de qe senota qe se relentiza un poco, cada vex qe pasa una milésima, i pasa a ser 0 otra vez, por tanto no llega a comprobar las 20.

no se puede poner, por ejemplo label1(0 to 19).top , o algo asi?
tiene qe haber una forma mas facil, sin chapuzas... :rolleyes:

DrakoX

t animas a pasarme el code,
así veo bien como tienes
el tema de los arrays

salu2

Güan

Lo he vuelto a revisar, tenia un problema en la ecuación, para qe salte el mensaje cuando se toqen, tu codigo ya me funciona, qeda así:
Private Sub Timer1_Timer()
For i = 0 To 15
If Shape1.Top > Label1(i).Top - Shape1.Height + 1 And Label1(i).Top + Label1(i).Height - 1 > Shape1.Top Then
  If Shape1.Left > Label1(i).Left - Shape1.Width + 1 And Label1(i).Left + Label1(i).Width - 1 > Shape1.Left Then
  MsgBox "OK"
  End If
End If
Next
End Sub

Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
Shape1.Move X - 495 / 2, Y - 495 / 2
End Sub

   Pero vamos, qe yo veo un poco chapuza tener qe ir contando todo el numero de labels hasta llegar al qe se toca cada 10 milesima de segundo (le he cambiado el intervalo de tiempo a 10, porqe sino en la 9 ya no saltaba nunca, y en la 8, solo a veces...
De todas formas tiene qe aver algo mas sencillo para hacerlo, pero de todos modos gracias por las respuestas

DrakoX

yo no revise tu code ni nada,
simplemente te di una forma de hacerlo,

seguramente alla una forma mejor de hacerlo,
pero esto es lo que s eme viene a la kabeza

salu2

Güan

   ei gentes, me ha surgido otro problemilla qe tiene qe ver con el codigo anterior.
   aver, yo qiero qe cuando el shape toqe un label cualqiera por la parte de arriba, el interruptor Xarr se encienda, y cuando no lo toqe, se apague. El codigo qe uso, aunqe para esto no me sirve es:
Private Sub Timer1_Timer()
Dim i As Integer
For i = 0 To 19
If Shape1.Top <= Label1(i).Top + Label1(i).Height And Label1(i).Top <= Shape1.Top Then
  If Label1(i).Left <= Shape1.Left And Label1(i).Left + Label1(i).Width >= Shape1.Left + Shape1.Width Then
  Xarr = True
  else
  Xarr = False
  End If
End If
Next
End Sub

   Esta vez la ecuación qe uso para qe avise cuando se tocan si qe esta bien (xDD, comprovada). El problema de este código es qe el interruptor solo se enciende cuando coinciden el shape el label de index, llamemoslo x. Como los labels estan esparcidos, no puede coincidir el shape con todos a la vez, por tanto el interruptor esta siempre apagado, nose si me explico. Bueno, aver si alguien me puede ayudar un pokillo con esto, porqe me faltan ideas.  :-X