• Sábado 21 de Diciembre de 2024, 19:22

Autor Tema:  Manejo de los Objetos en un formulario  (Leído 2202 veces)

schumacher

  • Nuevo Miembro
  • *
  • Mensajes: 6
    • Ver Perfil
Manejo de los Objetos en un formulario
« en: Martes 7 de Diciembre de 2010, 14:49 »
0
Hola, se me presento la siguiente interrogante
como haría para seleccionar todos los objetos de un determinado tipo, y cambiarles alguna propiedad (tamaño, ubicación,...)
se que es algo no tan complicado pero no se con que palabra buscarlo

Saludos!  B)
Gracias por adelantado

Nebire

  • Miembro HIPER activo
  • ****
  • Mensajes: 670
    • Ver Perfil
Re: Manejo de los Objetos en un formulario
« Respuesta #1 en: Sábado 11 de Diciembre de 2010, 03:10 »
0
Cada formulario mantiene una colección de los controles que en él contiene, esto es accesible a través de la propiedad 'controls'.
Adicionalmente podemos filtrar para operar sólo sobre determinados contenedores. Te incluyo en el código de ejmplo una forma de operar de esta manera....


En un nuevo proyecto:
1 Coloca varios textbox en un formulario,
2  coloca 2 picturebox en el formulario y mete en ellos también algunos textbox
3 coloca 1 botón
4 añade otros diferentes controles entre ellos un  Timer... (lo usamos en el ejemplo).
5 cambia a los textbox, el fondo de diferentes colores
6 luego copia y pega esté código y ejecútalo...
Código: Visual Basic
  1.  
  2. Public Enum DondeSeaplica
  3.     APLICAR_SOLO_AL_CONTENEDOR_PASADO = 1
  4.     APLICAR_EXCLUIR_EL_CONTENDEOR_PASADO = 2
  5.     APLICAR_A_TODOS = APLICAR_SOLO_AL_CONTENEDOR_PASADO + APLICAR_EXCLUIR_EL_CONTENDEOR_PASADO ' 3
  6. End Enum
  7.  
  8. Private Sub Command1_Click()
  9.     Call CambiarFondoControl(135790, "TextBox", APLICAR_EXCLUIR_EL_CONTENDEOR_PASADO, Picture1)
  10.     MsgBox "deben haberse pintado todos los textbox EXCEPTO los contenidos en el picture1 de color rojo pardo"
  11.    
  12.     Call CambiarFondoControl(246802, "TextBox", APLICAR_SOLO_AL_CONTENEDOR_PASADO, Picture2)
  13.     MsgBox "deben haberse pintado SOLO los textbox contenidos en el picture2 de color verde fuerte"
  14.  
  15.     Call CambiarFondoControl(7654321, "TextBox", APLICAR_A_TODOS)
  16.     MsgBox "deben haberse pintado TODOS los textbox contenidos en el picture2 de color verde macilento"
  17.  
  18.    Call CambiarFondoTextBox(7654321, "Timer", APLICAR_A_TODOS) ' <------- OJO: aquí debe dar error
  19. End Sub
  20.  
  21. ' Nota: se da por supuesto que operamos con un formulario llamado  form1...
  22. Private Sub CambiarFondoControl(ByVal nuevoColor As Long, ByVal Tipo As String, ByVal Aplicar As DondeSeaplica, Optional ByRef Contenedor As Object)
  23.     Dim ct As Control
  24.  
  25.     If Tipo <> "" Then
  26.         On Local Error GoTo NoContenedor
  27.        
  28.         If Contenedor Is Nothing Then Set Contenedor = Form1  ' <-------- OJO: hemos puesto Form1
  29.        
  30.         Select Case Aplicar
  31.             Case DondeSeaplica.APLICAR_SOLO_AL_CONTENEDOR_PASADO
  32.                 For Each ct In Form1.Controls  ' nótese que debe ser un formulario...
  33.                     If TypeName(ct) = Tipo Then
  34.                         If ct.Container.Name = Contenedor.Name Then
  35.                             ct.BackColor = nuevoColor
  36.                         End If
  37.                     End If
  38.                 Next
  39.             Case DondeSeaplica.APLICAR_EXCLUIR_EL_CONTENDEOR_PASADO
  40.                 For Each ct In Form1.Controls  ' nótese que debe ser un formulario...
  41.                     If TypeName(ct) = Tipo Then
  42.                         If ct.Container.Name <> Contenedor.Name Then
  43.                             ct.BackColor = nuevoColor
  44.                         End If
  45.                     End If
  46.                 Next
  47.             Case DondeSeaplica.APLICAR_A_TODOS
  48.                 For Each ct In Form1.Controls  ' nótese que debe ser un formulario...
  49.                     If TypeName(ct) = Tipo Then
  50.                         ct.BackColor = nuevoColor
  51.                     End If
  52.                 Next
  53.             Case Else
  54.                 MsgBox "No existe una correspondencia con el valor: " & CStr(Aplicar) & " para la variable 'Aplicar'"
  55.         End Select
  56.     End If
  57.     Exit Sub
  58. NoContenedor:
  59.    If Err.Number = 438 Then
  60.         MsgBox "Ocurrió un error. El control " & Tipo & " no tiene una propiedad 'backcolor'", vbCritical, "Error al CambiarFondoControl"
  61.     Else
  62.         MsgBox "Ocurrió un error." & vbCrLf & Err.Description, vbCritical, "Error al CambiarFondoControl"
  63.     End If
  64. End Sub
  65.  
  66.  

Recuerda meter correctamente el nombre del tipo de control y para el caso de mayúsuclas minúsculas...
Si un control no tiene la propiedad del ejemplo (backcolor) se indica expresamente, por ejemplo la última llamada trata de cambiar el backcolor a un timer, pero este no tiene tal propiedad.

El ejemplo sirve tanto para seleccionar todos los controles de un determinado tipo como para seleccionar todos los controles que pertenecen/no pertenecen a un mismo  contenedor...
«Ma non troppo»
----> ModoVacaciones = False<----

schumacher

  • Nuevo Miembro
  • *
  • Mensajes: 6
    • Ver Perfil
Re: Manejo de los Objetos en un formulario
« Respuesta #2 en: Lunes 13 de Diciembre de 2010, 16:05 »
0
hey gracias estaré probando el codigo, pero segun lo veo me servirá bastante!  :good:

Saludos!

EDITADO:  :beer: Listo! funciono! gracias por la ayuda!  :good: