FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
Herramientas | Buscar en Tema | Desplegado |
|
#1
|
|||
|
|||
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 |
#2
|
||||
|
||||
Comprueba que en el formulario principal has indicado mediante la propiedad FormStyle que FPrincipal es un fsMDIForm
__________________
Piensa siempre en positivo ! |
#3
|
|||
|
|||
ojala fuera tan faicl...pero no! eso esta bien, tengo el principal como MDIForm y el otro como MDIChild...
|
#4
|
||||
|
||||
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 :
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
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 ! |
#5
|
||||
|
||||
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. |
#6
|
||||
|
||||
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 :
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 ! |
|
|
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 |
|