Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 19-10-2007
aliciasampe aliciasampe is offline
Registrado
 
Registrado: oct 2007
Posts: 4
Poder: 0
aliciasampe Va por buen camino
Unhappy Problemas con formularios mdi

Hola!
Estoy haciendo una aplciacion mdi y tengo un problemilla...
Tengo un formulario principal, y quiero que se abra éste y la ventana mdi a la vez. Para ello, he puesto el codigo:
procedure TFPrincipal.FormActivate(Sender: TObject);
var
FAsientos:TFAsientos;
begin
// Activamos el formulario Asientos
FAsientos:=TFAsientos.Create(Application);
FAsientos.Show;
end;

donde fasientos es el formulario hijo.
Pues bien, cuando ejecuto va y me dice el compilador: "Cannot create form. No mdi forms are currently active."
¿Por qué me pasa eso? En la configuracion del proyecto tengo puesto al principal como auto-create y al resto como availables, en el uses tengo puesta la unidad pas correspondiente...asi q no se q puede ser...
Si me pudierais ayudar...
Muchas gracias!!!
ALis
Responder Con Cita
  #2  
Antiguo 19-10-2007
Avatar de gluglu
[gluglu] gluglu is offline
Miembro Premium
 
Registrado: sep 2004
Ubicación: Málaga - España
Posts: 1.455
Poder: 21
gluglu Va por buen camino
Comprueba que en el formulario principal has indicado mediante la propiedad FormStyle que FPrincipal es un fsMDIForm
__________________
Piensa siempre en positivo !
Responder Con Cita
  #3  
Antiguo 19-10-2007
aliciasampe aliciasampe is offline
Registrado
 
Registrado: oct 2007
Posts: 4
Poder: 0
aliciasampe Va por buen camino
ojala fuera tan faicl...pero no! eso esta bien, tengo el principal como MDIForm y el otro como MDIChild...
Responder Con Cita
  #4  
Antiguo 19-10-2007
Avatar de gluglu
[gluglu] gluglu is offline
Miembro Premium
 
Registrado: sep 2004
Ubicación: Málaga - España
Posts: 1.455
Poder: 21
gluglu Va por buen camino
Pues a mi me funciona perfectamente.

En cualquier caso, cabría aclarar unos asuntos que no influyen directamente en el correcto funcionamiento de lo que planteas :

Código Delphi [-]
procedure TFPrincipal.FormActivate(Sender: TObject);
var
  FAsientos : TFAsientos;
begin
  // Activamos el formulario Asientos
  FAsientos := TFAsientos.Create(Application);
  FAsientos.Show;
end;

No tienes que declarar FAsientos como variable local al procedimiento FormActivate.

En vez de crear al MDIChils con Application como 'padre', yo preferiría utilizar 'Self' y que el padre sea FPrincipal.

Con lo cual quedaría
Código Delphi [-]
procedure TFPrincipal.FormActivate(Sender: TObject);
begin
  // Activamos el formulario Asientos
  FAsientos := TFAsientos.Create(Self);
  FAsientos.Show;
end;

Pero insisto, he probado tal y como lo ponías en primer lugar, y a mi me funciona al menos con BDS 2006.
__________________
Piensa siempre en positivo !
Responder Con Cita
  #5  
Antiguo 20-10-2007
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 28
Lepe Va por buen camino
No creo sea buena idea usar el OnActivate.

Si estas en tu ventana MDI, cambias a otra aplicación (bloc de notas por ejemplo) y vuelves a tu MDI, se volvería a crear otra ventana de tipo TFAsientos. Supongo que no es lo que quieres, así que olvidamos el evento OnActivate.

¿Qué versión de delphi usas?, ya por ahí puede venir el problema.

La solución que se ha usado en circunstancias parecidas, es lo propuesto por roman: crear un mensaje AFTERSHOW (busca en el foro).

La razón es que deberías usar el evento OnShow del fsMDIForm para mostrar la ventana TFAsientos, pero Delphi no te deja mostrar u ocultar ventanas en el evento OnShow, de ahí que se use un nuevo mensaje.



Por otro lado están el tema de dueños (AOwner). Si tus ventanas MDIChild van a crearse y destruirse, debes tener especial cuidado con establecer el dueño, o quizás no asignarle ninguno (pasando al parámetro un nil).

Ejemplo: Creas una ventana mdiChild asignando el dueño a Application y después en el evento OnClose le asignas Action := cafree, es decir, le dices que se destruya de memoria la ventana mdiChild cuando se pulse en la X.

A continuación ejecutas tu aplicación, abres y cierras tu ventana mdiChild y después, cierras tu ventana principal, por ende, el objeto Application es destruido, y como es dueño de la ventana mdiChild, intentará destruirla de nuevo, obtiniendo una Violación de Acceso a memoria.

guglu: ¿Puedes probar este supuesto en BDS2006? Gracias.

Saludos
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.

Última edición por Lepe fecha: 20-10-2007 a las 11:30:53.
Responder Con Cita
  #6  
Antiguo 20-10-2007
Avatar de gluglu
[gluglu] gluglu is offline
Miembro Premium
 
Registrado: sep 2004
Ubicación: Málaga - España
Posts: 1.455
Poder: 21
gluglu Va por buen camino
He probado en BDS 2006 lo que dice Lepe, y NO me dá error de memoria ninguno. En el evento OnClose del Form2 he puesto Action := caFree y he definido Application como dueño de Form2 al crearlo en Form1. Funciona correctamente y no me da ningún error.

Volviendo al tema de utilizar el evento OnActivate para la utilidad que venimos discutiendo.

Yo utilizo bastante el evento OnActivate para muchas cosas que no puedo hacer en eventos como el OnCreate u OnShow. Si tengo claro que sólo tengo que ejecutar el código necesario una única vez, lo pongo en el evento OnActivate y además le añado :

Código Delphi [-]
procedure TForm1.FormActivate(Sender: TObject);
begin
  ...
  Self.OnActivate := nil;
end;

De esta manera no habría inconveniente alguno en crear al MDIChild en el evento OnActivate del Form1.

También tengos varias ocasiones en las que no puedo actuar de esta manera y hago uso del método AfterShow que explicó Roman en su momento y que también funciona perfectamente y recomiendo conocerlo.

Saludos a tod@s !
__________________
Piensa siempre en positivo !
Responder Con Cita
  #7  
Antiguo 20-10-2007
aliciasampe aliciasampe is offline
Registrado
 
Registrado: oct 2007
Posts: 4
Poder: 0
aliciasampe Va por buen camino
Pues no se, he probado con lo del self.onactivate:=Nil y nada, entre otras cosas, porque el error me da en la primera linea, en cuanto hago el create...
Uso delphi 7, y estoy por desisntalarlo y volverlo a instalar, porque esto no tiene explicacion ninguna... he ehcho mas aplicaciones mdi y nunca he tenido ningun problema!!!
Responder Con Cita
  #8  
Antiguo 20-10-2007
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 28
Lepe Va por buen camino
Acabo de probarlo en Delphi 7 y no da errores de memoria, de hecho se crean las dos ventanas, tanto la fsMDIFORM como la fsMDIChild.

aliciasampe: Por casualidad no tendrás visible := false en la ventana principal ¿no?. Lo digo, porque al ser una aplicación MDI se comporta de modo distinto a una aplicación SDI, y quizás haya incongruencias.

Aunque si tiene un efecto extraño el uso del evento OnActivate en el fsMDIFORM.

Pongamos el caso: en el evento Onactivate tenemos el código de crear las fsmdichild. Ejecutamos la aplicacion y se abre el fsmdiFORM y el fsmdichild. Nos vamos al bloc de notas y volvemos a nuestra aplicación, "el efecto raro", es que el fsmdiFORM no recibe el evento OnActivate, deduzco que lo recibe la ventana mdiChild que está abierta, por tanto, no se crea una nueva ventana mdiChild.

Cierro el mdichild, vuelvo al bloc de notas y después a nuestra aplicación, y se abre un nuevo mdichild. Ahora si recibe el evento OnActivate.

Para más efectos extraños, colocamos ahora un panel en el fsMdiFORM y volvemos a correr la aplicación, cuando demos un clic al panel (sin tener eventos programados en dicho panel) aparecerá una nueva ventana mdiChild.

Puesto que al abrirse una nueva ventana mdichild ésta recibe el foco, siempre que hagamos clic en el panel estamos dando el foco al MDIFORM de nuevo, por lo siempre hará saltar el evento.

Este comportamiento, aunque parezca extraño es normal en las ventanas MDIFORM, ya que internamente manejan 2 ventanas.

guglu: Lo de poner a nil el evento OnActivate, buena idea .

Saludos
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
  #9  
Antiguo 21-10-2007
aliciasampe aliciasampe is offline
Registrado
 
Registrado: oct 2007
Posts: 4
Poder: 0
aliciasampe Va por buen camino
Pues no, tengo puesto visible = true en los dos, en el principal y en el hijo...
Voy a desinstalarlo y a instalarlo otra vez, a ver si el problema esta en q se ha vuelto loco...
Por cierto, q cree las ventanas en el evento onActivate porque en el onCreate no me funcionaba tampoco...y decidi cambiar a ver si asi funcionaba!
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Problemas Formularios para reportes magnu9 Conexión con bases de datos 0 13-07-2007 16:04:34
Problemas con formularios (VIH)Lestat Conexión con bases de datos 6 22-06-2005 00:25:49
Problemas con formularios MDI, AYUDAAA!!! Repelus Varios 18 22-02-2004 19:13:17
problemas con formularios 2 santiago14 Varios 6 27-09-2003 05:59:03
Problemas con formularios santiago14 Varios 1 25-09-2003 16:20:16


La franja horaria es GMT +2. Ahora son las 07:30:53.


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
Copyright 1996-2007 Club Delphi