Ir al contenido


Foto

Mensaje de error con MDIForm


  • Por favor identifícate para responder
20 respuestas en este tema

#1 FGarcia

FGarcia

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 687 mensajes
  • LocationMéxico

Escrito 11 junio 2009 - 12:50

Hola!

Jugando un poco con los formularios se me ocurrio ver que sucedia al cambiar un Form de



delphi
  1. Form.style := fsNormal



a



delphi
  1. Form.style := fsMDIForm



y el formulario hijo (creado en tiempo de ejecucion) a



delphi
  1. Form.style := fsFormChild



: me aparece esto:



delphi
  1. ---------------------------
  2. Debugger Exception Notification
  3. ---------------------------
  4. Project mipesa.exe raised exception class EInvalidOperation with message 'Cannot make a visible window modal'.
  5. ---------------------------
  6. Break  Continue  Help 
  7. ---------------------------



Para no batallar volvi todo a fsStyle := normal y ese mensaje continua apareciendo.
He borrado los DCU de las Unidades que se usan e incluso el exe, sin embargo no logro eliminar ese error. ¿alguien sabe que paso y como corregirlo?
  • 0

#2 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 11 junio 2009 - 01:18

¿No será que el formulario está como modal?, porque los MDI no se pueden crear en Modal, por lo que hay que liberar y volver a crear para que la conversión se haga efecto, digo yo, puede que esté equivocado, en cuanto al error que no te quita pues me es extraño, espero que los expertos te ayuden :D.

Saludos.
  • 0

#3 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 11 junio 2009 - 01:27

¡Hola!

Como lo ha dicho Fernando, revisa si no hay por allí­ algún ShowModal a una ventana que tiene estilo MDI.

Saludos,
  • 0

#4 felipe

felipe

    Advanced Member

  • Administrador
  • 3.283 mensajes
  • LocationColombia

Escrito 11 junio 2009 - 01:31

Eso te pasa por jugar  :p...

Explicanos algo, ¿tu proyecto no era MDI?; de no ser asi sucede algo curioso con formularios normales, automáticamente se cambian a invisibles.

Lo que te puedo aconsejar es revisar las configuraciones de los formularios y cualquier pedazo de código que se te haya escapado, cierra Delphi un rato, relájate, tómate un cafe, reinicas tu proyecto... y nos cuentas  :D

Saludos!
  • 0

#5 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 11 junio 2009 - 01:40

Eso te pasa por jugar  :p...

Explicanos algo, ¿tu proyecto no era MDI?; de no ser asi sucede algo curioso con formularios normales, automáticamente se cambian a invisibles.

Lo que te puedo aconsejar es revisar las configuraciones de los formularios y cualquier pedazo de código que se te haya escapado, cierra Delphi un rato, relájate, tómate un cafe, reinicas tu proyecto... y nos cuentas  :D

Saludos!

Disculpa... ¿Podrí­as explicarte nuevamente? El osito Delphius inverna y está medio dormido... la "doble negación" me confunde...

Saludos,
  • 0

#6 felipe

felipe

    Advanced Member

  • Administrador
  • 3.283 mensajes
  • LocationColombia

Escrito 11 junio 2009 - 02:11


Eso te pasa por jugar  :p...

Explicanos algo, ¿tu proyecto no era MDI?; de no ser asi sucede algo curioso con formularios normales, automáticamente se cambian a invisibles.

Lo que te puedo aconsejar es revisar las configuraciones de los formularios y cualquier pedazo de código que se te haya escapado, cierra Delphi un rato, relájate, tómate un cafe, reinicas tu proyecto... y nos cuentas  :D

Saludos!

Disculpa... ¿Podrí­as explicarte nuevamente? El osito Delphius inverna y está medio dormido... la "doble negación" me confunde...

Saludos,


Bien, es fácil... como es de entender una aplicación MDI (Interfaz de Múltiples Documentos) contiene aquellas ventanas hijas dentro de la principal... hasta ahí­ todo normal.
Cuando me refiero a que los normales se ponen invisibles, es cuando en nuestro proyecto todas los formularios son normales pero solo tenemos la principal con la opción de autocrearse y las demás como disponibles... ahí­ te das cuenta que estos ultimos estan Visible = False

Saludos!
  • 0

#7 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 11 junio 2009 - 02:25

Ahora entiendo.

Yo quise simular el error de FGarcia y lo conseguí­. Deshice los cambios y se fue el error... lo único que conseguí­ es que al "form hijo" no le respetara el tamaño establecido, dándole el tamaño al form hijo el mismo que al "padre" (inicialmente yo establecí­ en tiempo de diseño un form hijo de menor tamaño que el padre). Me fijé en las propiedades más usuales (no he chequeado todas) y no vi nada raro que explicase dicho comportamiento. Lo que si he comprobado es que el cambio de SDI a MDI hace que la propiedad Position cambie de poDesigned a poDefault. Cuando uno vuelve de MDI a SDI este valor no es alterado.

Habrí­a que ver que otros posibles cambios hizo FGarcia...

Saludos,
  • 0

#8 JoAnCa

JoAnCa

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 775 mensajes
  • LocationPinar del Río, Cuba

Escrito 11 junio 2009 - 03:20

Pues revisa en las opciones del Proyecto, que el formulario Child no este en la lista de los que se crean automaticamente
y que el Main form seleccionado sea el principal

Tambien puedes ejecutar el proyecto paso a paso, para que te des cuenta donde es que ocurre el error, y nos des una idea mejor del cambio que hiciste mal
  • 0

#9 FGarcia

FGarcia

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 687 mensajes
  • LocationMéxico

Escrito 11 junio 2009 - 03:36

Eso te pasa por jugar  :p...

Explicanos algo, ¿tu proyecto no era MDI?; de no ser asi sucede algo curioso con formularios normales, automáticamente se cambian a invisibles.

Lo que te puedo aconsejar es revisar las configuraciones de los formularios y cualquier pedazo de código que se te haya escapado, cierra Delphi un rato, relájate, tómate un cafe, reinicas tu proyecto... y nos cuentas  :D

Saludos!



Pues.......Antes de que me lo aconsejaras ya me habia ido a una siesta, a comer y algo mas...  :D

Bueno si,

1: No era MDI solo jugue con esos estilos de form.
2. Si estoy creandolo como Modal



delphi
  1. with TfmEntradas.Create(Application) do
  2.     try
  3.       ShowModal;
  4.     finally
  5.       Free;
  6.     end;



corregi a :



delphi
  1. with TfmEntradas.Create(Application) do
  2.     Show;



y en el formulario hijo coloque un boton de "Cerrar"

con el codigo en el evento OnClik:
Free
  • 0

#10 FGarcia

FGarcia

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 687 mensajes
  • LocationMéxico

Escrito 11 junio 2009 - 03:41

Bueno respuesta en dos hilos. No se que pasa que despues de ciertas lineas me empieza a dar guerra el editor del foro, con un ENTER se regresa al principio del mensaje y es una lata.

Les comentaba que libero el form con un Free pero observe que si creo y cierro el form hijo varias veces, cada vez que se crea se crea en una posicion distinta, yo necesitaria que solo se pudiese crear una vez y siempre en una posicion fija.

Agradezco la ayuda!
  • 0

#11 felipe

felipe

    Advanced Member

  • Administrador
  • 3.283 mensajes
  • LocationColombia

Escrito 11 junio 2009 - 05:09

Bueno respuesta en dos hilos. No se que pasa que despues de ciertas lineas me empieza a dar guerra el editor del foro, con un ENTER se regresa al principio del mensaje y es una lata.

Les comentaba que libero el form con un Free pero observe que si creo y cierro el form hijo varias veces, cada vez que se crea se crea en una posicion distinta, yo necesitaria que solo se pudiese crear una vez y siempre en una posicion fija.

Agradezco la ayuda!


Creo saber la causa del error... me ha sucedido pero hasta ahora no he logrado solucionarlo  :(
La causa es la no liberación en la memoria de nuestro formulario, en mi caso (Y no habia notado que es el mismo error) me sucede al intentar validad que una ventana ya creada no se cree de nuevo, sin embargo, si la "libero" aún queda su instancia en memoria, por lo que al intentar crearla de nuevo...  8o| Salta el error!!

¿Alguna idea?

Saludos!
  • 0

#12 eduarcol

eduarcol

    Advanced Member

  • Administrador
  • 4.483 mensajes
  • LocationVenezuela

Escrito 12 junio 2009 - 07:05

un formulario MDIChild para liberarlo hay que colocar en su Evento OnClose



delphi
  1.   Action := caFree;



si quieres evitar el efecto cascada cada vez que abres una ventana(el cual es el predeterminado de windows para MDI), debes cambiar la propiedad position.

Cambia el show por ActiveMdiChild.  y el error al principio se debe a que el mdiChild por defecto es Visible = False, y un ShowModal no puede mostrar un formulario asi.
  • 0

#13 felipe

felipe

    Advanced Member

  • Administrador
  • 3.283 mensajes
  • LocationColombia

Escrito 12 junio 2009 - 08:04

Una cosa Eduardo, a mi me pasa el error aún usando Action := caFree
  • 0

#14 eduarcol

eduarcol

    Advanced Member

  • Administrador
  • 4.483 mensajes
  • LocationVenezuela

Escrito 12 junio 2009 - 08:41

cual error??
  • 0

#15 felipe

felipe

    Advanced Member

  • Administrador
  • 3.283 mensajes
  • LocationColombia

Escrito 12 junio 2009 - 10:23

cual error??


Ok, pero advierto que se sale un poco del tema inicial  :D

Probemos lo siguiente, dos formularios, uno MDIForm y el otro MDIChild, el segundo como disponible y no auto-creado. Un botón que llamará desde el formulario principal al segundo y en este el siguiente código:



delphi
  1. if Form2 = Nil then
  2.     begin
  3.       Form2 := TForm2.Create(Self);
  4.     end
  5.   else
  6.     begin
  7.       Form2.Show;
  8.     end;



El segundo formulario en su evento OnClose tendrá:



delphi
  1. Action := caFree;



Probandolo en su primer intento debe funcionar, es más, se puede comprobar con un Breakpoint en dichas lineas... pero para el segundo intento tendremos el error al que me refiero.

Quizá el problema mismo ocurra con dicho código, ya que tal vez no sea el más apropiado para esta tarea, ¿sugerencias? :D

Saludos!
  • 0

#16 eduarcol

eduarcol

    Advanced Member

  • Administrador
  • 4.483 mensajes
  • LocationVenezuela

Escrito 12 junio 2009 - 10:39



delphi
  1.   if not Assigned(Form2) then
  2.     begin
  3.       Form2 := TForm2.Create(Self);
  4.     end;
  5.  
  6.     Form2.ActiveMDIChild;



Mi Razonamiento:  Por alguna razón que aun no logro entender, cuando lo haga te la explico no es lo mismo preguntar si esta asignado a que este nulo(a lo mejor si pero ni idea)

Luego tu decias que si era nulo lo creara de lo contrario lo abriera, pero si y alo habia destruido como lo iba a abrir tendrias que darle dos veces al boton uno para que lo creara y otro para que lo abriera.

En resumen, prueba y avisa si te funciona
  • 0

#17 felipe

felipe

    Advanced Member

  • Administrador
  • 3.283 mensajes
  • LocationColombia

Escrito 12 junio 2009 - 10:46

Ok, lo probaré... de igual manera, prueba el código que te pase antes, verás que realmente el form2 no se destruye.

Saludos!
  • 0

#18 felipe

felipe

    Advanced Member

  • Administrador
  • 3.283 mensajes
  • LocationColombia

Escrito 12 junio 2009 - 01:33

Pues nada amigo... el error continua, mira lo siguiente:

En esta primera imagen el form2 aún no se ha creado, por lo que aparece como nulo

Imagen Enviada

Por el contrario, y despues de "liberado" el form2 al intentar hacer la validación nuevamente, aún se conserva en memoria. En este caso al pasar ActiveMDIChild, no muestra nada, cuando lo intentaba con el Show en mi código anterior me daba error.

Imagen Enviada
  • 0

#19 eduarcol

eduarcol

    Advanced Member

  • Administrador
  • 4.483 mensajes
  • LocationVenezuela

Escrito 12 junio 2009 - 02:03

el form2 = fsMdiChild y el form1 = fsMdiForm??? 
  • 0

#20 felipe

felipe

    Advanced Member

  • Administrador
  • 3.283 mensajes
  • LocationColombia

Escrito 12 junio 2009 - 02:17

el form2 = fsMdiChild y el form1 = fsMdiForm???


Si, pero aclaro que tu código no es el del error, es el mio; en el que me pasaste no se muestra nada la segunda vez  :D
  • 0




IP.Board spam blocked by CleanTalk.