Visual Basic - ASIGNACIÓN DE OBJETOS (OBJETO DENTRO DE OBJETO)

Life is soft - evento anual de software empresarial
 
Vista:
Imágen de perfil de Javier
Val: 12
Ha aumentado su posición en 13 puestos en Visual Basic (en relación al último mes)
Gráfica de Visual Basic

ASIGNACIÓN DE OBJETOS (OBJETO DENTRO DE OBJETO)

Publicado por Javier (3 intervenciones) el 08/09/2018 01:48:06
Saludos:

Esta es una consulta, que solo explicándola previamente me dejare entender:

Tengo un proyecto con tres formularios:
• FORMULARIO1.frm
• FORMULARIO2.frm
• PRINCIPAL.frm
Y un módulo:
• Modulo1.bas
Los formularios FORMULARIO1 y FORMULARIO2, tienen cada uno un label llamado LblTitulo (en ambos con el mismo nombre)
El formulario PRINCIPAL.frm, tiene dos Command Buttom:
Command1 y Command2

Al presionar (cualquiera) llama a un procedimiento llamado pgCambiaLabel () alojado en modulo1.bas, al cual se envían dos parámetros:
pgCambiaLabel(FORMULARIO1,1) si se pulsa el botón uno y
pgCambiaLabel(FORMULARIO2,2) si se pulsa el botón dos
Y luego muestra el formulario correspondiente con el label.caption y color asignado en el procedimiento.

El resultado es correcto y es el esperado.

La consulta es:
Como puedo utilizar clases y/u objetos para optimizar esto?
Porque no se puede ver el control label en el procedimiento (poniendo una interrupción al programa y al presionar punto después del nombre del objeto formulario enviado)
Como puede ser que, si no lo reconoce, cambie efectivamente el valor del label.caption en ambos formularios y los muestre?
Si me pueden ayudar a resolver esto, les quedare muy agradecido.
Código en PRINCIPAL.frm
1
2
3
4
5
6
7
8
9
10
11
Option Explicit
 
Private Sub Command1_Click()
Call pgCambiaLabel(FORMULARIO1, 1)
FORMULARIO1.Show
End Sub
 
Private Sub Command2_Click()
Call pgCambiaLabel(FORMULARIO2, 2)
FORMULARIO2.Show
End Sub

Codigo en module1.bas
1
2
3
4
5
6
7
8
9
10
11
Option Explicit
 
Public Sub pgCambiaLabel(vFormu As VB.Form, ByVal icolor As Integer)
    If icolor = 1 Then '' poner punto de interrupcion y verificar con intellisense "vFormu."
        vFormu.LblTitulo.ForeColor = vbRed
        vFormu.LblTitulo.Caption = "EL COLOR 1: ROJO"
    Else
        vFormu.LblTitulo.ForeColor = vbGreen
        vFormu.LblTitulo.Caption = "OTRO COLOR: VERDE"
    End If
End Sub



formularios
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de gilman
Val: 594
Bronce
Ha mantenido su posición en Visual Basic (en relación al último mes)
Gráfica de Visual Basic

ASIGNACIÓN DE OBJETOS (OBJETO DENTRO DE OBJETO)

Publicado por gilman (359 intervenciones) el 08/09/2018 11:12:05
El hecho de que reconozca la sentencia:
1
vForma.LblTitulo.Caption = "EL COLOR 1: ROJO"
es debido a que la propiedad por defecto de los objetos Form es Controls
así, las tres siguentes sentencias son equivalentes:
1
2
3
vForma.LblTitulo.Caption = "EL COLOR 1: ROJO"
vForma("LblTitulo").Caption = "EL COLOR 1: ROJO"
vForma.Controls("LblTitulo").Caption = "EL COLOR 1: ROJO"

En cuanto a lo de optimizar, no tengo muy claro a que te refieres, si puedes ser un poco mas especifico.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
Imágen de perfil de Javier
Val: 12
Ha aumentado su posición en 13 puestos en Visual Basic (en relación al último mes)
Gráfica de Visual Basic

ASIGNACIÓN DE OBJETOS (OBJETO DENTRO DE OBJETO)

Publicado por Javier (3 intervenciones) el 08/09/2018 16:22:25
Gracias por tu atención:
No sabia eso de controls como propiedad. Sin embargo mi duda sigue latente: Porque no salen sus propiedades y métodos automáticamente al presionar "punto" después de LblTitulo (obviamente con interrupción)?
Creo que con clases y objetos se lograría, lo que no se es, como.
Al optimizar me refiero justamente a eso de utilizar clases.
Saludos.


interrup
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de gilman
Val: 594
Bronce
Ha mantenido su posición en Visual Basic (en relación al último mes)
Gráfica de Visual Basic

ASIGNACIÓN DE OBJETOS (OBJETO DENTRO DE OBJETO)

Publicado por gilman (359 intervenciones) el 09/09/2018 09:05:58
El problema para no poder acceder a lblTitulo es debido es que estamos ante un objeto Form genérico, no sabe que controles tendrá cuando sea una instancia concreta, y mucho menos el tipo.
Lo único que se me ocurre es que crees una clase con los métodos que quieres que expporten tus formularios, indicar que los formularios implementan a esa clase, eso te obligará a escribirlos, y cambiar eltipo del argumento de VB.Form

En el proyecto adjunto verás como hacerlo
El problema es que cuando accedas a tus formularios referenciandolos como objetos del tipo de la clase que implementan solo podrás usar los métodos definidos en la clase.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
2
Comentar
Imágen de perfil de Javier
Val: 12
Ha aumentado su posición en 13 puestos en Visual Basic (en relación al último mes)
Gráfica de Visual Basic

ASIGNACIÓN DE OBJETOS (OBJETO DENTRO DE OBJETO)

Publicado por Javier (3 intervenciones) el 09/09/2018 18:24:23
Gracias, me sirvió de mucho.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar