Ver Mensaje Individual
  #9  
Antiguo 16-01-2004
Avatar de guillotmarc
guillotmarc guillotmarc is offline
Miembro
 
Registrado: may 2003
Ubicación: Huelva
Posts: 2.638
Reputación: 23
guillotmarc Va por buen camino
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.
__________________
Marc Guillot (Hi ha 10 tipus de persones, els que saben binari i els que no).
Responder Con Cita