ES

www.codigo-facil.com > Creacion de un formulario en tiempo de ejecucion a traves de una DLL

Formularios dinamicos


Implementaremos una DLL que nos permita la creacion de formularios en tiempo de ejecucion.

Capitulos

Delphi, creacion y utilizacion de una DLL

En este articulo veremos los pasos necesarios para crear, editar y utilizar una DLL en Delphi.

Formularios dinamicos a traves de una DLL

Veremos como crear una DLL en Delphi que nos permita la creacion de formularios en tiempo de ejecucion. Asi como la creacion de una clase base que nos facilite la gestion de los metodos utilizados en dicha DLL.

Objetivos :


En el capitulo anterior vimos los pasos necesarios para crear una DLL en Delphi. En aquella ocasion elaboramos un sencillo ejemplo en el que solo mostrabamos un mensaje por pantalla.

En esta ocasion quiero presentar un ejemplo mas elaborado en el que podemos dar una utilidad mas practica al uso de nuestra DLL, siendo nuestro objetivo implementar una DLL que me permita la creacion de formularios en tiempo de ejecucion.

Plan de trabajo :

  1. Crearemos una clase base para implementar los metodos necesarios para la creacion del formulario en tiempo de ejecucion.
  2. Creacion de la DLL que contenga la vinculacion con nuestra clase base y asi poder ejecutar los procedimentos esenciales para lograr nuestro objetivo.
  3. Elaborar nuestro programa principal vinculando nuestra DLL para tener acceso asi a los procedimientos que hemos implementado para la creacion del formulario en tiempo de ejecucion.
1. Creacion de nuestra clase base.

Empezaremos con la creacion de una nueva unidad de nombre "UnitForm" en la que incluiremos nuestra clase base, que sera la que implemente los metodos necesarios para la creacion y eliminacion del formulario dinamico.

Para la creacion de una nueva unidad seria la siguiente ruta :

File > New > Unit
El codigo de esta unidad seria el siguiente :

  1. unit UnitForm;
  2.  
  3. interface
  4. uses
  5.    Forms;
  6.  
  7. {codigo de la clase que define el tipo de objeto que voy a crear}
  8.  
  9. type TformExt = class
  10.  
  11.    public
  12.  
  13.   {atributo que me indicara si el formulario es modal o no}
  14.    modal : boolean;

  15.    constructor crear(modalFor:boolean);
  16.    destructor destroy; override;
  17.  
  18.   {procedimiento encargado de crear el formulario y hacerlo visible}
  19.    procedure crearForm;
  20.  
  21.    private
  22.  
  23. {Declaro "formulario" como propiedad y sera quien recoja el formulario cuando sea creado, tendra caracter privado para que solo sea accesible desde la misma clase}
  24.  
  25.      formulario : tform;
  26.  
  27. {"cerrar" sera un procedimiento que se vinculara al evento onClose del formulario y se encargara de liberar la memoria del parametro formulario al cerrar}
  28.  
  29.      procedure cerrar(Sender: TObject; var Action: TCloseAction);
  30.  
  31.    protected
  32.  
  33. end;

  34. implementation
  35.  
  36. constructor TformExt.crear(modalFor:boolean);
  37. begin
  38.    modal:=modalFor;
  39.    self.crearForm;
  40. end;
  41.  
  42. destructor TformExt.destroy;
  43. begin

  44. {en el destructor detecto que al liberar el objeto que instancia la clase compruebo si el formulario ha sido creado, en caso afirmativo cierro y llamo al evento close para cerrar el formulario y liberar la memoria}
  45.  
  46.    if (formulario<>nil) then
  47.      formulario.close;
  48.  
  49. {en caso de herencia llamo al destructor de la clase superior}
  50.    inherited;
  51. end;
  52.  
  53. {procedimiento encargado de crear el formulario}
  54. procedure TformExt.crearForm;
  55. begin
  56.  
  57. {compruebo que formulario aun no ha sido creado fijense que hago una distincion en el momento de crear el formulario en funcion si es modal, puesto que al ser modal debo provocar el evento onClose}
  58.  
  59.    if formulario=nil then
  60.    begin
  61.      formulario:=tform.Create(nil);
  62.  
  63.      try
  64.        if modal=true then
  65.          formulario.showmodal
  66.        else
  67.          formulario.Show;
  68.  
  69.        formulario.OnClose:=cerrar;
  70.  
  71.      finally
  72.        if modal=true then
  73.          formulario.Close;
  74.      end;
  75.  
  76.    end;
  77.  
  78. end;
  79.  
  80. {procedimiento que creo para vincular al evento onClose y que se encarga de cerrar el formulario y liberar la memoria ocupada}
  81.  
  82. procedure tformExt.cerrar(Sender: TObject; var Action: TCloseAction);
  83. begin
  84.    action:=cafree;
  85.    formulario.Release;
  86.    formulario:=nil;
  87. end;
  88. end.

2. Creacion de la DLL.

A continuacion una vez que hemos creado nuesta unidad con la clase que se encargara de la creacion y destruccion del formulario, procedemos a cear la DLL que contenga los procedimiento necesarios para poder ejecutar los de nuestra clase base.

La ruta en delphi para crear una nueva DLL es la siguiente :

File > New > Other
A continuacion escribire el codigo de la DLL y despues explicare un poco su contenido.

  1. library dllPrueba;
  2.  
  3. uses
  4.    Windows,SysUtils,unitform;
  5.  
  6. procedure creaForm(var tmpF : tformExt; moda l :boolean); stdcall;
  7. begin
  8.    if tmpF=nil then
  9.      tmpF:=tformExt.crear(modal)
  10.    else
  11.      tmpF.crearForm;
  12. end;
  13.  
  14. procedure eliminaForm(var tmpF:tformExt); stdcall;
  15. begin
  16.    tmpF.Free;
  17.    tmpF:=nil;
  18. end;
  19.  
  20.  
  21. procedure liberaMemoria; stdcall;
  22. begin
  23.    if Win32Platform = VER_PLATFORM_WIN32_NT then
  24.      SetProcessWorkingSetSize(GetCurrentProcess, $FFFFFFFF, $FFFFFFFF);
  25. end;
  26.  
  27. exports creaForm;
  28. exports eliminaForm;
  29. exports liberaMemoria;
  30.  
  31. begin
  32. end.

A destacar :

Como es obvio he incluido en la clausula uses la unidad "unitform", para poder utilizar la clase que he creado.

Despues en el codigo nos encontramos con 3 procedimientos, los 2 primeros son los necesarios para nuestro cometido, y el ultimo es un añadido para poder llamarlo en el programa principal segun nos convenga y su funcion es la de liberar la memoria residual que nuestra aplicacion va generando.

Asi nos encontramos con los siguientes procedimientos en lo referente a la creacion / elminacion de formularios :
  • creaForm, es el que se encarga, en caso que aun no se haya realizado, de instanciar la clase que hemos creado o de llamar al metodo "crearForm" del objeto, para crear el formulario. Destacar que al procedimiento se le pasan 2 parametros uno por referencia (el objeto declarado en el programa principal, y que instancia la clase) y otro por valor (indica si el formulario es modal o no).
  • eliminaForm, este procedimiento se encarga de liberar el objeto declarado en nuestro programa principal y el cual obviamente se pasa como parametro por referencia en el procedimiento.
Una vez que tenemos listo el codigo de la DLL solo nos faltaria compilarla y crear el archivo ".dll" para su utilizacion en el programa principal.
La ruta para construir el archivo seria la siguiente :

Project > Build (nombre unit)
3. Creacion del programa principal.

Ha llegado el momento de poner en marcha todo el trabajo que hemos realizado. Para no extenderme demasiado comentare las partes importantes a incorporar en nuestro programa principal para que todo funcione correctamente.

1. La clausula uses :

  1. uses
  2.   Windows, Messages, SysUtils, Classes, Controls,
  3.   Forms, StdCtrls,UnitForm;

En esta caso, solo destacar la inclusion de "UnitForm", ya que la necesito para poder definir el tipo de dato del objeto que voy a declarar.

2. Definicion de variables :

  1. var
  2. Form1: TForm1;
  3. formTmp: TformExt;
  4.  
  5. procedure creaForm(var tmpF:TformExt;modal:boolean); stdcall external 'dllPrueba.dll';

  6. procedure eliminaForm(var tmpF:TformExt); stdcall external 'dllPrueba.dll';

  7. procedure liberaMemoria; stdcall external 'dllPrueba.dll';

Destacar unicamente la decaracion de la variable del "formTmp" del tipo "TformExt", que es la clase que hemos creado expresamente para el ejemplo.

Aunque quizas lo mas importante es lo que vemos mas abajo, y es la inclusion de los procedimientos que hemos creado en la dll, para que se carguen en memoria y asi tenerlos disponibles para su utiliacion. Detalle que ya habia comentado anteriormente y es el paso por referencia de la variable "tmpF", ya que es lo que me permite instanciar el objeto que habia definido anteriormente.

LLegado a este punto ya tenemos todo listo para poder crear nuestro formulario, bastaria con incluir el siguiente codigo en el evento "onClick" de cualquier boton :

  1. creaForm(formTmp,true);

Nota : No olvidar que al llamar al procedimiento, el segundo parametro me sirve para decir si el formulario es modal o no, en este caso indico que es modal.

Y para terminar solo nos faltaria incluir el procedimiento para liberar el objeto, que lo podriamos incluir en el evento onClose del programa principal, o en el onClick de cualquier boton, la llamada seria la siguiente :

  1. eliminaForm(formTmp);
Y aqui termina esta serie de mini capitulos sobre las DLL en Delphi, espero que os haya resultado interesantes, Solo me queda invitaros a que dejeis vuestro comentario para saber vuestra opinion.

Un saludo a tod@s y nos vemos en futuras publicaciones.

Ultimas noticias

Crea tu propio framework en javascript

Recopilacion de articulos donde mostrare paso a paso como podemos crear nuestro propio framework en javascript, totalmente funcional y listo para ser utilizado en nuestros futuros proyectos.

Para mas informacion :

Tutorial para crear tu propio FrameWork en JavaSript

Más información
13/12/2013 11:42:57

Como crear una DLL en delphi?

En esta serie de 2 capitulos veremos como crear y utilizar una DLL en Delphi.

Abajo os dejo los enlaces a estos 2 capitulos que componen este mini tutorial, espero que sea de vuestro agrado :

Capitulo 1 : Creacion y utilizacion de una DLL

Capitulo 2 : Creacion de un formulario dinamico utilizando una DLL
Más información
19/09/2013 17:35:59

Ya puedes publicar tu opinion

A partir de ahora ya puedes comentar todas las publicaciones que encuentres en el portal.

Podras opinar tanto si algo te gusta como si no, o si crees que es conveniente completar alguna publicacion, ya que la encuentras incompleta o erronea.

O simplemente por si nos quieres felictar por algo bien hecho :-).

Valoraremos cualquier critica que nos puedas hacer.
Más información
20/05/2013 15:30:10

Tutorial PHP5

Fundamentos de la programacion orientada a objetos
Un interesante tutorial repartido en una serie de capitulos donde se tratan los conocimientos basicos de la programacion orientada a objetos (POO) en PHP5.

Para mayor informacion siga el siguiente enlace :

Tutorial POO en PHP

Más información
04/09/2013 15:44:29
2