Hola.
Estás utilizando las variables globales que se crean por defecto con los formularios. Pero por la forma en que creas dinamicamente los formularios MDI hijos, no debes inicializar esas variables.
Cuando creas un formulario :
TVentana_Hija.Create(Application); // Supongo que harás esto o algo parecido
Cámbialo para asignar también la variable global :
Ventana_Hija := TVentana_Hija.Create(Application);
Aunque te puedes encontrar con varios problemas.
- Puede ser el formulario Ventana_Hija aún no se haya creado, o bien que si se haya creado en su momento pero ya ha sido cerrado. En ambos casos la variable Ventana_Hija no puede apuntar a ninguna parte, y obtendrás un error.
Solución : Antes de usar la variable Ventana_Hija, comprueba que tiene algún valor.
if Assigned(Ventana_Hija) then Ventana_Hija.Componente.Caption := 'Hola';
Aunque esto solo sirve, para detectar que un formulario aún no ha sido creado. Para detectar si un formulario creado anteriormente ha sido cerrado, cuando cierras el formulario (por el ejemplo en el evento OnDestroy) debes poner asignar la variable a Nil. (Sinó lo haces, sigue teniendo la dirección del formulario anterior, que ya no es válida)
- Puedes tener dos formularios de la clase TVentana_Hija, de forma que la variable Ventana_Hija siempre apuntará al último creado (el último que ha puesto su dirección en la variable global).
Solución : No utilizes esas variables globales (yo es lo primero que borro al crear un formulario). En lugar de ello, intenta utilizar variables locales que apunten siempre al formulario que quieres modificar :
Ejplo. :
Código:
proc LoQueSea;
var Ventana_Hija: TVentana_Hija;
begin
Ventana_Hija := TVentana_Hija.Create(Application);
// Hacemos otras cosas
Ventana_Hija.MiComponente.Caption := Hola;
end;
O bien utiliza la colección MDIChildren del formulario principal.
Código:
for i := 1 to Application.MainForm.MDIChildCount do begin
if Application.MainForm.MDIChildren[i] is TVentana_Hija then begin
(Application.MainForm.MDIChildren[i] As TVentana_Hija).Componente.Caption := Hola;
end;
end;
Por cierto, no te recomiendo acceder directamente a los componentes de un formulario, desde otro. Soy de la opinión que los componentes del formulario deberían ser
protected es decir, no verse desde otros formularios. De esta forma ganas modularidad.
Seria mejor declarar un método
public en el formulario, que sea el que accede al componente, y desde los otros formularios unicamente llamamos al método.
O sea, en la sección
public del formulario declaras :
procedure CambiarTitulo(Mensaje: String);
y en la sección implementation, lo defines como :
Código:
procedure TVentana_Hija.CambiarTitulo(Mensaje: String);
begin
Componente.Caption := Mensaje;
end;
Ahora cuando desde otro formulario, quieres cambiar el Caption de ese formulario, lo que haces es llamar al método correspondiente :
Ventana_Hija.CambiarTitulo('Hola');
Espero que te sea de utilidad.
Saludos.