Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   ¿Quien es mi Form Padre? (https://www.clubdelphi.com/foros/showthread.php?t=49228)

gabrio 16-10-2007 18:08:05

¿Quien es mi Form Padre?
 
Hola amigos de la Comunidad:

Tengo un formulario principal que es normal no MDI. En este formulario tengo un menú y cuando llamo a alguna opción de éste, quiero abrir una ventana MDI con sus respectivas hijas

Esto lo hago sin problemas, pero cuando llamo a las hijas de este MDI, me da el error de 'No MDI Form are Currently active'.

Mi pregunta es:

¿Como le especifico al formulario hijo que se abra en un MDI específico?, algo así como: 'Tu padre es este...'

Desde ya, muchas gracias

jhonny 16-10-2007 18:23:26

Pues si la cosa esta como dices deberia funcionarte correctamente, de todas formas ¿Te funciona asi al crear el formulario en ejecución?

Código Delphi [-]
FormHijo := TFormHijo.Create(ForumularioPadre);

gabrio 16-10-2007 18:58:39

¿Quen es mi Padre?
 
Asi es, mira, en el Menú principal tengo:

Código Delphi [-]
procedure TPrincipal.AbrePadreClick(Sender: TObject);
begin
 Padre := TPadre.Create(Application);
 Padre.Show;
end;

'Padre' es MDI y se crea perfectamente y dentro de éste:

Código Delphi [-]
procedure TPadre.AbreHijoClick(Sender: TObject);
begin
 Hijo := THijo.Create(Padre);
 Hijo.Show;
end;

Y me manda el error de 'No MDI are currently active'

¿Estoy haciendo algo mal?

gatosoft 16-10-2007 19:15:43

Hola Gabrio,

Todos los formularios tienen un array que almacena los Formularios hijos que pueda tener: MainForm.MDIChildCount

Puedes recorrerlo asi:

Código:

 

var
 
VariableTipoTFORM: Tform;

for i:= 0 to MainForm.MDIChildCount-1 do
  begin
    VariableTipoTFORM:=  MainForm.MDIChildren[i];     
  end;//For

Una vez tienes un objeto instanciado en la variable (VariableTipoTFORM), puedes trabajar con ella, por ejemplo, preguntando su nombre, tipo, caption, color, etc.

Quiero aclararte que en el codigo de ejemplo que pones el parametro que se pasa en el método create, no es precisamente el padre del objeto.

Código:

Hijo := THijo.Create(Padre);
Es el OWNER o propietario... el Propietario se define para saber quien es el que se encarga de liberarlo de memoria...

La moyoria de lso objetos tienen una propiedad llamada Parent (este si es el padre)...

Lo normal sería que pudieras hacer esto:

Código:

FormHijo.parent:=FormPadre
Pero los ObjetostForm no tienenn un Parent y por eso se utiliza el array que te mencioné....

Por Otro lado una aplicación solo puede tener un Formulario tipo MDI Y al crear un Formulario tipo MDIChild, el compilador lo asigna automáticamente al unico MDI que debe haber...

No tengo un Delphi a la mano para reproducir tu error, pero deberia funcionarte, a menos que al crearse el formulario no lo este haciendo como tipo MDI, o que exista una restricción adicional en Delphi que Obligue a que el MDI sea siempre el Form Principal... Entiendo que tu Form MDI no es el principal....


Bueno, son solo ideas, revisa y nos cuentas...

gabrio 16-10-2007 20:33:06

¿Quien es mi padre?
 
Ok, desde el Padre, hago lo siguiente:

Código Delphi [-]
procedure TPadre.LlamarClick(Sender: TObject);
begin
 Hijo:= THijo.Create(Application);
 Hijo.Parent := Padre;
end;

Funciona, pero el efecto visible no es lo mejor, esto debido a que cuando el formulario se crea, se muestra al centro, luego, al cambiar el Parent, se visualiza dentro del Padre, dando un efecto como de aparición - desaparición.

Intenté esto:

Código Delphi [-]
Hijo := THijo.CreateParented(Padre.Handle)

Pero al cerrar el Formulario Principal, lanza un error que dice más o menos: 'El Identificador de la Ventana no es válido'. Y estoy casi seguro que esto es porque no se libera de memoria al hijo desde el padre.

¿Otra Idea?

Gracias por tu excelente explicación y consejos gatosoft


La franja horaria es GMT +2. Ahora son las 09:53:35.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi