Modificar forms Padres desde sus Hijos creados de forma dinámica

Fecha: 31/05/2003 (14/Jul/2003)
Autor: Germán Perrone - [email protected]


Muchas veces se necesitan crear instancias de form dinámicamente (de la forma dim f as new Form1) y a su vez, crear instancias hijas del mismo. En el siguiente ejemplo voy a mostrar cómo desde cualquier instancia hija creada se pueden modificar los valores de su form padre y no de cualquier otra instancia del mismo form padre. Básicamente se utiliza la colección Forms para detectar el form padre (ésto lo realiza él mismo antes de llamar al hijo). En esta colección solo detectaremos su índice que pasará como parámetro a una función preestablecida del form hijo. Una vez que el form hijo detectó el índice, asigna con el mismo la dirección del form padre a una variable Form local para su futura modificación. En nuestro ejemplo existen 3 forms. Form1 contendrá un Command1 que llamará a una instancia de Form2. Form2 contendrá un Command1 que llamará a la instancia del Form3 y un Text1 que será modificado por este último. Form3 contendrá un Command1 que llamará a un InputBox que modificará el Text1 de Form2.

Veamos cómo funciona el reconocimiento del índice en Form2:

Private Sub Command1_Click()
    ' Botón que llama al form hijo
    Dim i As Integer
    Dim a As Boolean
    Dim f As New Form3
    a = False
    i = 0
    '
    While i < Forms.Count And a = False ' Recorre la colección Forms 
        If Forms(i) Is Me Then          ' para ubicar el índice de la instancia
            f.Asignacion(i)             ' de Form2 actual y llama a función de Form3
            a = True
        End If
    Wend
    f.Show
End Sub

Ahora detallaremos la función Asignacion en el Form3:


Dim frmPadre As Form ' Enlace a su único form padre y va como variable local del Form3
Function Asignacion (i  As Integer)
    Set frmPadre = Forms(i) ' Hace la asignación
End Function

Hay un margen de error muy pequeño pero que debe tenerse en cuenta: cuando Form2 llama a la función de Form3 y pasa su índice, Form3 debe procesar esta información antes de que se cierre algún form, ya que varían todos los índices de la colección Forms y puede asignar cualquier form a la variable local.

Este código es optimizable. Con esto quiero decir que aquí sólo se muestra cómo modificar a un form padre creado en base a una instancia, pero pueden existir errores en la ejecución como el antes mencionado. VB no permite pasar como parametro a "Me", es decir Asignacion(Me), pasando directamente el form, por eso se trabaja con la colección Forms.


ir al índice

Fichero con el código de ejemplo (PadreHijo.zip - Tamaño: 2.05 KB)