FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Buscar | Temas de Hoy | Marcar Foros Como Leídos |
|
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 ! |
#7
|
|||
|
|||
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!!! |
#8
|
||||
|
||||
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. |
#9
|
|||
|
|||
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! |
Herramientas | Buscar en Tema |
Desplegado | |
|
|
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 |
|