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 5 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: 437
Bronce
Ha aumentado 1 puesto 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 (254 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 5 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: 437
Bronce
Ha aumentado 1 puesto 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 (254 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 5 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