Un vistazo al .dpr

Introducción

Cuando creamos un projecto nuevo en Delphi el IDE automáticamente crea un archivo con extensión dpr (delphi project) y, si el proyecto contiene forms, un archivo dfm (delphi form) por cada form del proyecto (y también una unidad .pas por cada uno).

El archivo con extensión dpr constituye un archivo de proyecto de Delphi. En el se encuentra recogido el código de inicialización de la aplicación así como todas las unidades y formularios del proyecto.

Delphi esta construido sobre el lenguaje de programación pascal, o más concretamente sobre Object Pascal que incluye el paradigma de objetos al lenguaje Pascal. Por ello conserva la organización inicial de pascal en casi su totalidad.

Por más que el IDE de desarrollo nos facilite las cosas y parezca que pasan "mágicamente", lo cierto es que todo, absolutamente todo, lo que se programa desde delphi acaba siendo un programa de Object Pascal. Por ello lo primero que encontramos en el dpr es la sentencia program NombreDePrograma; seguida de las declaraciónes uses (las unidades y formularios que aparecen en el project viewer (del menu view, project viewer) se leen de aqui) seguido de la declaración de variables, declaración de funciones (normalmente ninguna puesto que el IDE nunca mete funciones aqui) y por último un begin y un end dentro de los cuales se crean los formularios de la aplicación.

Un ejempo

Vamos a ver un ejemplo simple:

program Project1;

uses
  Forms,
  Unit1 in 'Unit1.pas' {Form1};

{$R *.res}

begin
  Application.Initialize;
  Application.CreateForm(TForm1, Form1);
  Application.Run;
end.

Este es el código básico de una aplicación vacia. Podemos ver que comienza la declaración con un program y el nombre del proyecto seguido de una declaración de las unidades usadas. Si no están en el path, hay que especificar donde encontrarlas. En este caso estamos diciendole que la unidad Unit1 se encuentra en el archivo Unit1.pas en el directorio actual.

En el cuerpo principal del programa se llama a varios metodos del objeto Application, que es un singleton (ubicado en la unidad Forms) que representa nuestra aplicación y que contiene varios metodos comunes.

De las declaraciones nos vamos a quedar con dos:

Application.CreateForm es un metodo del objeto application que se encarga de añadir forms a la aplicación y, en caso de ser el primero (es decir el form principal de la aplicación) realizar las acciones necesarias para configurarlo como form principal.

Application.Run es el metodo que se encarga de lanzar la ejecución de la aplicación (entrando en un bucle en el cual procesa los mensajes de windows que le van llegando hasta que recibe un wm_quit que es el modo habitual de funcionamiento de las aplicaciones de windows).

Si añadimos un nuevo formulario mediante el IDE de Delphi ...

program Project1;

uses
  Forms,
  Unit1 in 'Unit1.pas' {Form1},
  Unit2 in 'Unit2.pas' {Form2};

{$R *.res}

begin
  Application.Initialize;
  Application.CreateForm(TForm1, Form1);
  Application.CreateForm(TForm2, Form2);
  Application.Run;
end.

Observamos que el entorno automáticamente añade dos lineas, una en la cual define la nueva unidad del form y otra llamada a CreateForm. Puesto que la llamada que crea el Form2 está en segundo lugar, cuando el control de ejecución llegue a ese punto ya se habrá creado el Form1 por lo que Form2 ya no será el formulario principal de la aplicación (y por tanto no se mostrará hasta que no se haga implicitamente un Form2.Show).

Utilizando el dpr

Todo lo dicho hasta el momento esta muy bien pero, ¿que utilidad podemos sacarle a esto?

En la mayoría de las aplicaciones posiblemente no necesitemos tocar el dpr demasiado aunque hay algunos casos específicos en los que es interesante hacerlo.

  • No crear automáticamente dialogos: Todo formulario que se define en Delphi desde el IDE añade una llamada a Application.CreateForm para el formulario recien definido. Esto hace que los formularios se creen siempre aunque luego no se utilicen. Dependiendo del tamaño y complejidad de los formularios, y sobre todo de si dichos formularios tienen código asociado a su creación (por ejemplo accesos a bases de datos) este proceso puede ser costoso, sobre todo si tenemos en cuenta que, si el formulario es un dialogo podría no mostrarse nunca. Si este es el caso en que nos encontramos, es recomendable quitar la linea que crea el form del dpr y realizar la creación en el mismo lugar en el que estaría la llamada a Show.

procedure Form1.Button1Click(Sender : TObject);
begin
  Form2.ShowModal;
end;

// Podemos sustituirlo (quitando la declaración
// del dpr) por ...

procedure Form1.Button1Click(Sender : TObject);
var
  dlg : TForm2;
begin
  dlg := TForm2.Create;
  dlg.ShowModal;
  dlg.Free;
end;

De esta forma el formulario solo es creado cuando se necesita y es liberado (de forma que recuperamos la memoria asignada en cuanto dejamos de utilizarlo).

  • Para realizar operaciones antes de arrancar: Por ejemplo si queremos comprobar que no existe ya una instancia de nuestra aplicación o si queremos crear un tipo de formulario (con distintas fuentes por ejempo) dependiendo de la configuración de pantalla del usuario o de si es la primera ejecución del programa.

begin
  Application.Initialize;
  if ExisteEntradaRegistroDeWindows('Project') then
     Application.CreateForm(TMainForm, MainForm)
  else
     Application.CreateForm(TAsistenteConfig,
                            AsistenteConfigForm);

  Application.Run;
end.

10
Average: 10 (1 vote)
Your rating: None