viernes, agosto 24, 2012

Formulario MDI en Lazarus - FreePascal

Quiero iniciar una aplicación en Lazarus. Lo primero es el formulario MDI principal (Multiple Document Interface). Si abrimos el Word por ejemplo, hay un formulario principal MDI que contiene los menús, las barras de herramientas, etc. Y luego podemos abrir múltiples documentos Word, cada uno de ellos en formularios "hijos" que se pueden minimizar, maximizar, hacer un mosaico, pero dentro del formulario MDI principal.

Como el otro día, reina la confusión. En este foro de freePascal de Enero de 2010, una persona pregunta por los formularios MDI y por las respuestas, todo parece indicar que no existe la implementación.

En el Club Delphi una persona recomienda utilizar la propiedad FormStyle. Dice que pongamos el formulario principal como fsnormal y los formularios hijos como fsStayOnTop.

En los Wiki de FreePascal y de Lazarus, indican que no hay formularios MDI, pero que tenemos algo similar que denominan MultiDoc (MultiDoc en FreePascal y MultiDoc en Lazarus). Sin embargo, es un desarrollo de un tercero, y los enlaces a la descarga de la última versión (0.3.1) están rotos.

Llegados a este punto desisto de los formularios MDI. Ya me he hecho a la idea que habrá que usar el truco del FormStyle. Voy a la propiedad FormSyle de mi formulario principal y SORPRESA!!! LA PROPIEDAD ADMITE LOS SIGUIENTES VALORES:


  1. fsNormal
  2. fsSplash
  3. fsStayOnTop
  4. fsSystemStayOnTop
  5. fsMDIForm
  6. fsMDIChild
Bueno, pues salvo nuevas sorpresas parece que ya hay formularios MDI en freePascal/Lazarus.

Saludos.

8 comentarios:

Anónimo dijo...

Podrias explicar como funciona esto? es decir como hago para tener una ventana contenedora de mis forms, dentro de mi sistema? vengo de visual foxpro y estoy perdido con tantos formas flotando por el escritorio. gracias

Mikelats dijo...

Abres un proyecto nuevo (de tipo aplicación). El primer formulario va a ser el principal. Ponle la propiedad de formulario MDI. Crea otros formularios e indica que son MDIChild. Para ir llamando a los formularios desde el principal tienes dos métodos. Los he descrito en un post más reciente
Saludos.

Anónimo dijo...

Hola Mikeleats.
Realmente has probado las configuraciones MDI que mencionas de los forms en Lazarus.
A mi no me ha resultado, y tengo entendido que Lazarus no tiene soporte MDI, anque si aparecen las propiedades fsMDIChild y fsMDIForm, pero no surten efecto sobre los forms. En Delphi si funcionan desde siempre.
Saludos.

Mikelats dijo...

Tienes razón Anónimo. No llegué a ejecutar la llamada al formulario hijo. Resulta que ahora mismo, con la última versión de Lazarus y en Windows NO funciona.

En el Roadmap del proyecto comentan que está "in progress".
Indican que hay soporte completo MDI para qt, pero en el caso de Windows mejor elegir winapi y prescindir de momento de MDI.
Saludos.

DSK25 dijo...

Me funciona perfectamente, muy buen blog.
Pero al maximizarse el form hijo no se acomoda al tamaño del Form MDI si no que se ocupa la pantalla como si fuera un form normal, además al crearse mas de un form hijo los otros se quedan atras sin poderse acceder, como puedo hacer para que el crearse un nuevo form hijo los otros aun sigan visibles y no se manden atrás del form padre? Gracias.

Mikelats dijo...

Hola amigo,
Todavía no existen formularios MDI si usas la librería estándar en Windows. Tal y como pone en el enlace de mi comentario (justo el anterior al tuyo), todavía está "in progress".
Para simular formularios MDI vas a tener que utilizar el componente "MULTIDOC". Aquí tienes el enlace.
Saludos,

Lázaro VG dijo...

Otra opción es utilizar pestañas en convinación con las opciones dockmanager

Mikelats dijo...

Gracias por el aporte, Lázaro VG!