Foros del Web » Programación para mayores de 30 ;) » Programación General » Visual Basic clásico »

recorrer controles

Estas en el tema de recorrer controles en el foro de Visual Basic clásico en Foros del Web. Hola tengo en un proyecto 14 labels con 3 valores cada uno de esta forma: label1(0),label1(1),label1(2) label2(0),label2(1),label2(2) label3.......... .................. label14(0),label14(1),label14(2) y dentro de una variable ...
  #1 (permalink)  
Antiguo 01/01/2010, 12:18
Avatar de A.H.H  
Fecha de Ingreso: mayo-2007
Ubicación: IRUN,(GUIPUZCOA) España
Mensajes: 178
Antigüedad: 16 años, 11 meses
Puntos: 4
recorrer controles

Hola tengo en un proyecto 14 labels con 3 valores cada uno de esta forma:

label1(0),label1(1),label1(2)
label2(0),label2(1),label2(2)
label3..........
..................
label14(0),label14(1),label14(2)

y dentro de una variable un dato que quiero contrastar con cada uno de los valores del caption de cada label y si coincide el dato de la variable ,con uno de los labels pues cambiarle la propiedad forecolor a azul al label.

necesito mirar que el valor que tengo dentro de una variable cualquiera coincida con uno de los tres valores del caption de cada label.

Hasta ahora solo logro recorrer los labeles con for each y contrastar el label1 nada mas, ¿como puedo hacer para que en el bucle for each despues de mirar los tres valoresdel label1 y contrastarlos con la variable,me cambie al label2 y asi sucesivamente hasta el label14?

o como puedo hacer para que el numero que le sigue al la palabra label sea variable?
ejemplo label1(0)<------el numero 1 variable para que pueda llamar a los 14 indistintamente?


gracias de antemano.
salu2

Última edición por A.H.H; 01/01/2010 a las 12:45
  #2 (permalink)  
Antiguo 01/01/2010, 12:56
Avatar de erbuson  
Fecha de Ingreso: noviembre-2009
Mensajes: 701
Antigüedad: 14 años, 4 meses
Puntos: 53
Respuesta: recorrer controles

Hola:

Podrias crear una rutina similar a esta:

Código:
Private Sub Comprobar(Variable As String)
  Dim Etiqueta As Object
  For Each Etiqueta In Me
    If TypeOf Etiqueta Is Label Then
      If Etiqueta.Caption = Variable Then Etiqueta.ForeColor = vbBlue
    End If
  Next
End Sub
El Problema es que te comprueba TODOS los labels del formulario por lo que deberías idear un sistema para que te comprueba sólo los labels adecuados, y para ellos tienes muchas posibilidades, por ejemplo en el bucle puedes comprobar el valor Etiqueta.Name o Etiqueta.Tag

Puedes así crear con un Inicio de nombre igual al grupo de labels por ejemplo podrían llamarse Valor1, Valor2, Valor3,,, Valor14 o poner en el Tag de cada label el texto Valor, de este manera puedes hacer lo siguiente:

Código:
Private Sub Comprobar(Variable As String)
  Dim Etiqueta As Object
  For Each Etiqueta In Me
    If TypeOf Etiqueta Is Label Then
      If Etiqueta.Tag = "Valor" And Etiqueta.Caption = Variable Then Etiqueta.ForeColor = vbBlue
    End If
  Next
End Sub
Saludos y feliz año
  #3 (permalink)  
Antiguo 01/01/2010, 17:52
Avatar de A.H.H  
Fecha de Ingreso: mayo-2007
Ubicación: IRUN,(GUIPUZCOA) España
Mensajes: 178
Antigüedad: 16 años, 11 meses
Puntos: 4
Respuesta: recorrer controles

Gracias y feliz año tambien.

mas o menos eso habia probado y esta muy bien.

lo que estoy haciendo es un programilla para sacar columnas de la quiniela de futbol al azar y luego pintar de azul solo los labels que coincidan con el resultado al azar.imagina que dentro de la variable azar meto 14 resultados al azar 1,x,2..........
y en el formulario tengo un frame y dentro del frame tengo los labels.
esta ES LA imagen PARA VERLA MEJOR GUARDAR COMO Y DESPUES DE GUARDADA ABRIR CON EL PROGRAMA PAINT.

pero necesito saber si hay alguna forma de que se pueda hacer variable el numero que hay despues del label osea label1<---- el 1 o en el label2<---el 2
para poder llamarlos desde el bucle.

yo ya recorro todos los captions de los labels label1(0),label1(1),label1(2)...........
pero el problema lo tengo al querer cambiar del label1 al label2 y asi sucesivamente

GRACIAS

Última edición por A.H.H; 01/01/2010 a las 18:10
  #4 (permalink)  
Antiguo 01/01/2010, 19:05
Avatar de erbuson  
Fecha de Ingreso: noviembre-2009
Mensajes: 701
Antigüedad: 14 años, 4 meses
Puntos: 53
Respuesta: recorrer controles

Hola:

Creo que de la manera que te indico, no deberías tener el problema ya que puedes recorrer los labels sin mayores complicaciones.

¿ Porque quieres poder cambiar el 1, 2, 3, ?

Saludos
  #5 (permalink)  
Antiguo 02/01/2010, 06:52
Avatar de A.H.H  
Fecha de Ingreso: mayo-2007
Ubicación: IRUN,(GUIPUZCOA) España
Mensajes: 178
Antigüedad: 16 años, 11 meses
Puntos: 4
Respuesta: recorrer controles

ya tienes razon pero de tantas vueltas que le he dado estoy echo un lio Y el codigo lo estoy liando.
este es el codigo que tengo.lo que pasa que en el bucle que comparo los tres valores con el primero de la variable azar para pintar de azul el label que coincida, solo pinto la primera linea, porque solo le pongo label1(n),por eso queria poder cambiar el 1 para ir bajando hasta el resultado 14.

Código:
 
Option Explicit
Dim numeros
Dim LINEA(13, 2), AZAR(13)
Public n, LI, i
Public P
Public aux


Private Sub Form_Load()
'combo que usare mas adelante para elegir el numero de columnas que se desean'
Command1.Caption = "AZAR"

Label44.Caption = "Nº COLUMNAS" & vbCrLf & "QUE DESEA" & vbCrLf & "AL AZAR"
Dim n
For n = 1 To 8
Combo1.AddItem n
Next

'AZAR' le llama a la funcion quiniela para recoger 14 resultados.'
For n = 0 To 13
AZAR(n) = Quiniela
List1.AddItem AZAR(n)
Next
'meto en la variable LINEA 1,X,2'
For LI = 0 To 13
For n = 0 To 2
LINEA(LI, n) = Label1(n).Caption
Next
Next
Private Sub Form_Unload(Cancel As Integer)
Unload Me
End Sub

Private Sub Command1_Click()
dibujar 'LLAMO AL SUB DIBUJAR'
End Sub

'FUNCION PARA SACAR EL 1,X,2 AL AZAR'
Function Quiniela() As String
Randomize
aux = Int((3 * Rnd) + 1)
Select Case aux
Case 1
Quiniela = "1"
Case 2
Quiniela = "X"
Case 3
Quiniela = "2"
End Select
End Function

Sub dibujar()

'comparo los 3 valores de cada linea de la quiniela(1X2) con'
'el primer valor sacado del azar para marcarlo de azul'

For LI = 0 To 13
For n = 0 To 2
If AZAR(LI) = LINEA(LI, n) Then
Label1(n).ForeColor = vbBlue'<--------aqui me gustaria que el label1 fuera variable'
                                              'para que fuera bajando linea por linea ya que solo '
                                              'me pinta el primer resultado'
End If
Next
Next
End Sub
salu2, Perdona por molestarte tanto, no es que tenga mucha idea pero me gusta mucho comerme la cabeza con el codigo.

Última edición por A.H.H; 02/01/2010 a las 07:07
  #6 (permalink)  
Antiguo 02/01/2010, 08:06
Avatar de pkj
pkj
 
Fecha de Ingreso: julio-2006
Ubicación: Órbita sincrónica
Mensajes: 899
Antigüedad: 17 años, 8 meses
Puntos: 29
Respuesta: recorrer controles

Que tal esto?

Código vb:
Ver original
  1. Dim f As Integer
  2.   For f = 0 To 13
  3.     Select Case Int(Rnd * 3) + 1
  4.       Case Is = 1: Label1(f).ForeColor = vbRed
  5.       Case Is = 2: Label2(f).ForeColor = vbRed
  6.       Case Is = 3: Label3(f).ForeColor = vbRed
  7.     End Select
  8.   Next f

Saludos
__________________
No hay preguntas tontas, solo gente estup..., ¡No!, ¿como era? No hay gente que pregunte a tontos... ¡Nooo!... ¡Vaya cabeza!
  #7 (permalink)  
Antiguo 02/01/2010, 08:14
Avatar de erbuson  
Fecha de Ingreso: noviembre-2009
Mensajes: 701
Antigüedad: 14 años, 4 meses
Puntos: 53
Respuesta: recorrer controles

Hola:

Creo que con esta nueva rutina, debería funcionar, aprovechando el código que tienes

Código:
Sub Colorear()
Dim Etiqueta As Object, Grupo As Integer
' Recorremos cada Objeto del formulario
For Each Etiqueta In Me
  ' Si el objeto es un Label ..
  If TypeOf Etiqueta Is Label Then
    ' Separaramos del nombre el número del mismo
    Grupo = Val(Mid$(Etiqueta.Name, 6))
    ' Comprobamos si es número es 1,2,3,4,5,6,7,8,9,10,11,12,13,14 que son los que utilizas Label1, Label2, ... Label14
    If Grupo > 0 And Grupo < 15 Then
      LI = Grupo - 1       ' Para conseguir el valor que utilizas descontamos tenemos de 1 a 14 y tendremos de 0 a 13
      n = Etiqueta.Index   ' Numero de Indice de la etiqueta 0,1,2
      If AZAR(LI) = LINEA(LI, n) Then
        Etiqueta.ForeColor = vbBlue    ' Dibujamos en Azul
      Else
        Etiqueta.ForeColor = vbBlack   ' Restauramos a Negro
      End If
    End If
  End If
Next
End Sub
Pruébalo y comenta, ya que tal vez tenga algun error que deberíamos corregir.

Saludos
  #8 (permalink)  
Antiguo 02/01/2010, 09:52
Avatar de A.H.H  
Fecha de Ingreso: mayo-2007
Ubicación: IRUN,(GUIPUZCOA) España
Mensajes: 178
Antigüedad: 16 años, 11 meses
Puntos: 4
Respuesta: recorrer controles

MUCHISIMAS GRACIAS ERBUSON!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!

MEDALLA DE ORO PARA TI!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!

CON TU CODIGO JUSTO ME PINTA EL RESULTADO EN LA COLUMNA DE LA QUINIELA COMO YO QUERIA!!!!!!!!!

GRACIAS DE NUEVO.ESTA PERFECTOOOOOOOOO!!!!!



SALU2
  #9 (permalink)  
Antiguo 02/01/2010, 10:43
Avatar de erbuson  
Fecha de Ingreso: noviembre-2009
Mensajes: 701
Antigüedad: 14 años, 4 meses
Puntos: 53
Respuesta: recorrer controles

Me alegro, por lo tanto tema cerrado. Cualquier otra duda ya sabes donde encontrarnos.

Saludos y feliz año.
  #10 (permalink)  
Antiguo 05/01/2010, 09:22
Avatar de erbuson  
Fecha de Ingreso: noviembre-2009
Mensajes: 701
Antigüedad: 14 años, 4 meses
Puntos: 53
Respuesta: recorrer controles

Bueno, aqui estoy de nuevo, no para reactivar el tema sino porque si en un futuro a alguien le sirve de ayuda, la encuentre aqui.

Por lo visto, SI SE PUEDE acceder a controles por su nombre indicado en un String a traves de la propiedad Controls del formulario

Por Ejemplo, supongamos que tenemos unos controles como en el presente caso etiquetados con los nombres Label1, Label2, Label3

Pues bién, se podrían acceder a sus propiedades de la siguiente manera:

Código:
DIM MiNombre As String, Numero as Integer

For Numero = 1 to 3
  MiNombre = "Label" & Numero 
  Me.Controls(MiNombre).ForeColor = vbRed
Next
Esta opción pondría en rojo las tres etiquetas.

Aunque por supuesto es mucho mas práctico el Array de controles, aqui os lo dejo por si acaso.

Saludos
  #11 (permalink)  
Antiguo 09/01/2010, 05:08
Avatar de pkj
pkj
 
Fecha de Ingreso: julio-2006
Ubicación: Órbita sincrónica
Mensajes: 899
Antigüedad: 17 años, 8 meses
Puntos: 29
Respuesta: recorrer controles

Gran aporte, erbuson. Este tema lo he visto varias veces pero nunca con esta solución.

Para aumentar el valor de este aporte comentaré que funciona perfectamente con matrices de objetos:

Ejm: Comenzando con 4 matrices de labels, (de Label1 a Label4), independientemente del número de elementos de cada matriz, así numeraríamos sus captions:

Código vb:
Ver original
  1. Private Sub Command1_Click()
  2.   Dim F1 As Integer
  3.   Dim F2 As Integer
  4.   Dim Labels As Integer
  5.   Labels = 4
  6.   For F1 = 1 To Labels
  7.     For F2 = 0 To Controls("label" & F1).ubound
  8.       Controls("label" & F1)(F2).Caption = F2 + 1
  9.     Next F2
  10.   Next F1
  11. End Sub

Saludos
__________________
No hay preguntas tontas, solo gente estup..., ¡No!, ¿como era? No hay gente que pregunte a tontos... ¡Nooo!... ¡Vaya cabeza!

Etiquetas: controles, recorrer
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 14:26.