Programación General > Visual Basic 6.0 e inferiores
Manejo de los Objetos en un formulario
(1/1)
schumacher:
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:
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 --- Public Enum DondeSeaplica APLICAR_SOLO_AL_CONTENEDOR_PASADO = 1 APLICAR_EXCLUIR_EL_CONTENDEOR_PASADO = 2 APLICAR_A_TODOS = APLICAR_SOLO_AL_CONTENEDOR_PASADO + APLICAR_EXCLUIR_EL_CONTENDEOR_PASADO ' 3End Enum Private Sub Command1_Click() Call CambiarFondoControl(135790, "TextBox", APLICAR_EXCLUIR_EL_CONTENDEOR_PASADO, Picture1) MsgBox "deben haberse pintado todos los textbox EXCEPTO los contenidos en el picture1 de color rojo pardo" Call CambiarFondoControl(246802, "TextBox", APLICAR_SOLO_AL_CONTENEDOR_PASADO, Picture2) MsgBox "deben haberse pintado SOLO los textbox contenidos en el picture2 de color verde fuerte" Call CambiarFondoControl(7654321, "TextBox", APLICAR_A_TODOS) MsgBox "deben haberse pintado TODOS los textbox contenidos en el picture2 de color verde macilento" Call CambiarFondoTextBox(7654321, "Timer", APLICAR_A_TODOS) ' <------- OJO: aquí debe dar errorEnd Sub ' Nota: se da por supuesto que operamos con un formulario llamado form1...Private Sub CambiarFondoControl(ByVal nuevoColor As Long, ByVal Tipo As String, ByVal Aplicar As DondeSeaplica, Optional ByRef Contenedor As Object) Dim ct As Control If Tipo <> "" Then On Local Error GoTo NoContenedor If Contenedor Is Nothing Then Set Contenedor = Form1 ' <-------- OJO: hemos puesto Form1 Select Case Aplicar Case DondeSeaplica.APLICAR_SOLO_AL_CONTENEDOR_PASADO For Each ct In Form1.Controls ' nótese que debe ser un formulario... If TypeName(ct) = Tipo Then If ct.Container.Name = Contenedor.Name Then ct.BackColor = nuevoColor End If End If Next Case DondeSeaplica.APLICAR_EXCLUIR_EL_CONTENDEOR_PASADO For Each ct In Form1.Controls ' nótese que debe ser un formulario... If TypeName(ct) = Tipo Then If ct.Container.Name <> Contenedor.Name Then ct.BackColor = nuevoColor End If End If Next Case DondeSeaplica.APLICAR_A_TODOS For Each ct In Form1.Controls ' nótese que debe ser un formulario... If TypeName(ct) = Tipo Then ct.BackColor = nuevoColor End If Next Case Else MsgBox "No existe una correspondencia con el valor: " & CStr(Aplicar) & " para la variable 'Aplicar'" End Select End If Exit SubNoContenedor: If Err.Number = 438 Then MsgBox "Ocurrió un error. El control " & Tipo & " no tiene una propiedad 'backcolor'", vbCritical, "Error al CambiarFondoControl" Else MsgBox "Ocurrió un error." & vbCrLf & Err.Description, vbCritical, "Error al CambiarFondoControl" End IfEnd Sub
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...
schumacher:
hey gracias estaré probando el codigo, pero segun lo veo me servirá bastante! :good:
Saludos!
EDITADO: :beer: Listo! funciono! gracias por la ayuda! :good:
Navegación
Ir a la versión completa