martes, agosto 28, 2012

Abrir formularios en Lazarus-FreePascal



Como en un lenguaje de programación moderno (con extensión para orientación a objetos), en Lazarus - FreePascal tenemos dos formas de abrir formularios:



  1. De forma estática. Diseñas los formularios. Luego, al iniciar la aplicación se crean todos los formularios, aunque están ocultos. Cuando quieras lo haces visible en tiempo de ejecución.
  2. De forma dinámica. Cuando abres una aplicación como el Microsoft Word, tú no sabes cuantos formularios "de documento" vas a tener que abrir. El usuario puede abrir 1 documento o 20. Cada vez que haga clic en "Nuevo documento" hay que abrir un formulario.
1.-FORMA ESTÁTICA DE CREAR FORMULARIOS.

Diseñamos los formularios que necesitemos con Lazarus. Para crear un nuevo formulario vamos al MENÚ ARCHIVO, Opción NUEVO FORMULARIO.

Hay que tener en cuenta que cada formulario gráfico que hemos creado está descrito en una unidad (UNIT). Para verlo seleccionamos el formulario y vamos al MENÚ VER, Opción "EDITOR DE CÓDIGO FUENTE". El nombre de la unidad se encuentra en la primera línea del código fuente del formulario. Por ejemplo:

unit Unit1;

Si desde este form1 que está definido en Unit1, queremos llamar al form2, tenemos que incluir la definición de form2 dentró de la sección uses:

uses: 
xxxxx, xxxxxx, xxxxxx, xxxxxx, unit2;

Ahora ya podemos "llamar" al form2 desde form1. Realmente la invocación sólo consiste en hacer visible el formulario. Eso es así porque al arrancar se crean todos los formularios que hemos diseñado.

form2.show;

2.-FORMA DINÁMICA DE CREAR FORMULARIOS.

Tenemos que pensar que cada formulario es un objeto. Nuestro programa puede necesitar abrir varios objetos de ese tipo (formularios de entrada, informes, etc.), aunque cada uno tenga datos diferentes.

Vamos al MENÚ PROYECTO, Opción OPCIONES DEL PROYECTO, y elegimos FORMULARIO. Saldrá esta ventana:


Pasamos los formularios que haya que abrir dinámicamente, de la columna "CREAR FORMULARIOS AUTOMÁTICAMENTE" a la de "FORMULARIOS DISPONIBLES".

En los eventos OnClose de los formularios tenemos que añandir lo siguiente para que libere la memoria:
CloseAction:= caFree;

Lo único que hay que hacer ahora para abrir el form2 desde el form1 es instanciar el objeto form2:

procedure Tform1.Button1Click(Sender: TObject);
var
   frmDocumento: Tform2;
begin
   frmDocumento:= Tform2.Create(Application);
   frmDocumento.Show;
end;  

Saludos.

6 comentarios:

Anónimo dijo...

Hola,
La primera opción me falla de varias maneras.

Dónde exactamente debo incluir la línea
Form2.Show;
?

Muchas gracias de antemano,
A

Aitor Iriarte dijo...

Hola,
Voy a describirlo paso a paso:
1.-Voy a "Menú Proyecto", "Nuevo proyecto". Elijo "Aplicación gráfica LCL/FreePascal". Vemos que automáticamente se ha abierto el primer formulario que se llama Form1.
2.-Voy a "Menú Archivo", "Nuevo formulario". Se crea un segundo formulario llamado Form2.
3.-Voy a "Menú Ver", "Editor de código fuente". Vemos dos pestañas. La que se llama Unit1 corresponde al Form1 y Unit2 al Form2.
4.-Dentro de Unit1, vamos a la línea donde pone "uses Classes, SysUtils,...". Al final de esa línea añadimos Unit2;
5.-Añadimos un botón dentro de Form1. El nombre es Button1. Hacemos doble clic en el botón. Entonces se abrirá una sección que se corresponde al evento Button1Click. Es decir que cuando alguien haga click ahí, se ejecutará lo que metamos en esa sección.
6.-En la sección de Button1Click ponemos:
begin
form2.show;
end;

Le damos al botón verde con la flechita para que se compile, haga el linkado, y se genere el fichero .exe

Lo primero que se abre es Form1. Si le damos al botón abre Form2.

Saludos,

Anónimo dijo...

Hola,

Pues vaya, eso es (o eso creía) lo que hacía yo y no me funcionaba...

Ahora sí, siguiendo las indicaciones que dices, funciona de las dos formas.

Muchas gracias de nuevo :)

A

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.

Ericksystem dijo...

En el inspector de objetos del form1 busca la opción:

formStyle y elije "fsStayOnTop"

Saludos.

maria dijo...

Hola, Como puedo desde el formulario 2 devolverme al formulario 1. Gracias