Clase2 t programas - unidades - workspaces - Delphi
1. 1 Embarcadero Delphi / Introducción
Ing. Américo Torres Gonzales
Programas y Unidades
Esta sección cubre la estructura general de una aplicación en Delphi: El encabezado program,
la sintaxis de declaración unit, y la clausula uses.
Consideraciones Básicas para realizar un programa:
Divide programas grandes en modulos que puedan ser editados separadamente.
Crea librerías que puedas compartir con otros programas.
Distribuye las librerías a otros desarrolladores en formato compilado, por lo que el código
fuente queda protegido.
I. Estructura y Sintaxis de un Programa
Una aplicación ejecutable completa Delphi consiste de múltiples módulos, todas unidas por un
archivo de código fuente llamado Archivo de Proyecto (.dpr). En programación tradicional
Pascal, todo el código fuente, incluyendo el programa principal, es almacenado en un archivo
.pas. Las herramientas Embarcadero usan el archivo dpr para designar al programa principal,
mientras que otros archivos de código fuente residen en unidades que tienen la extensión
.pas. Para construir un proyecto, el compilador necesita el archivo dpr, y los archivos de código
fuente de las unidades en .pas o ya compiladas.
Nota: Estrictamente hablando, no necesitas usar específicamente unidades en un proyecto,
pero ya por defecto todos los programas usan las unidades System y SysInit.
El archivo de código fuente para un ejecutable Delphi contiene:
Una declaración program.
Una clausula opcional uses, y
Un bloque de declaraciones y sentencias ejecutables.
Adicionalmente, un programa RAD Studio podría contener una clausula namespace, para
especificar espacios de nombres adicionales para buscar unidades.
A. La declaración Program
Especifica un nombre para el programa ejecutable. Consiste de la palabra reservada program,
seguido por un identificador valido, seguido de un punto y coma. El siguiente ejemplo muestra
el código fuente de un archivo de proyecto llamado Editor. Dado que el programa es llamado
Editor, este archivo de proyecto se llama Editor.dpr.
2. 2 Embarcadero Delphi / Introducción
Ing. Américo Torres Gonzales
Explicación: La primera línea contiene el nombre del programa. Luego la clausula uses en este
ejemplo especifica una dependencia de 3 unidades adicionales: Forms, REAbout y REMain. La
directiva de compilador $R enlaza el archivo de recursos del proyecto. Finalmente, el bloque
de sentencias dentro de las palabras begin / end son ejecutadas cuando el programa corre. El
archivo de proyecto, como todos los archivos fuente Delphi, termina con un punto.
Los archivos de proyecto son usualmente cortos, ya que toda la lógica esta en sus unidades. Un
archivo de proyecto contiene típicamente solo codigo suficiente para lanzar la ventana
principal del programa, y arrancar el bucle de eventos. Los archivos de proyecto son generados
y mantenidos automáticamente por el IDE.
B. La clausula Uses
Ella lista las unidades que son incorporadas al programa. Esas unidades podrían tener a su vez
sus propias dependencias en su clausula uses.
C. El Bloque
Contiene una o muchas sentencias que son ejecutadas cuando el programa corre. En la
mayoría de los archivos de programa, el bloque consiste de un conjunto de sentencias
encerradas entre las palabras reservadas begin y end, estas sentencias son simplemente
llamadas a métodos al objeto Application del proyecto. La mayoría de los proyectos tienen una
variable global Application que tiene una instancia de Forms.TApplication, TWebApplication o
SvcMgr.TServiceApplication. Este bloque pueden también tener declaraciones de constantes,
tipos, variables, procedimientos y funciones.
II. Estructura y Sintaxis de una Unidad
Una unidad consiste de tipos (incluyendo clases), constantes, variables, y rutinas (funciones y
procedimientos). Cada unidad esta definida en su propio archivo .pas.
Un archivo de Unidad comienza con la palabra Unit, luego de la cual sigue la palabra interface,
luego de esta de forma opcional puede haber una clausula uses para especificar dependencias
si estas existieran. Luego viene la sección implementation, seguido por las secciones
opcionales initialization y finalization. El esqueleto de una unidad es mostrado a continuación:
3. 3 Embarcadero Delphi / Introducción
Ing. Américo Torres Gonzales
La unidad debe terminar siempre con la palabra reservada end seguida de un punto (.).
A. La palabra Unit
Sirve para especificar el nombre de la unidad. Consiste de la palabra unit, seguido por un
identificador valido, seguido de un punto y coma. Para aplicaciones desarrolladas usando
herramientas Embarcadero, el identificador debe coincidir con el nombre del archivo .pas, de
modo que por ejemplo si tenemos:
Unit FormularioPrincipal;
Debería existir un archivo fuente llamado FormularioPrincipal.pas, y el archivo resultante luego
de la compilación debería ser FormularioPrincipal.dcu. Los nombres de las unidades deben ser
únicos en un proyecto. Aun si sus archivos están en diferentes directorios, dos unidades con el
mismo nombre no pueden ser usadas en un solo programa.
B. La Sección interface
Esta sección comienza con la propia palabra interface y continúa hasta que se encuentre la
palabra reservada implementation. En ella se declaran constantes, tipos, variables,
procedimientos y funciones que estarán disponibles para los clientes. Esto es, para otras
unidades o programas que desean usar los elementos de esta unidad. Estas entidades son
llamadas públicas debido a que el código en otras unidades puede accederlas como si
estuvieran declaradas en la misma unidad.
La declaración de la interface de un procedimiento o función incluye solamente la firma de la
rutina. Esto es, el nombre de la rutina, los parámetros, y el tipo de retorno (para funciones). El
bloque que contiene el código ejecutable para el procedimiento o función se encontrara
siempre en la sección implementation.
La declaración de la interface para una clase debe incluir declaraciones para todos sus
miembros de clase: campos, propiedades, procedimientos y funciones.
4. 4 Embarcadero Delphi / Introducción
Ing. Américo Torres Gonzales
La sección interface puede incluir su propia clausula uses, la cual, de ser usada, debe aparecer
inmediatamente después de la palabra interface.
C. La Sección implementation
Esta sección comienza con la propia palabra implementation y continua hasta el comienzo de
la sección initialization, o, si no hay sección initialization, hasta el final de la unidad (end.). Esta
sección define procedimientos y funciones que son declarados en la sección interface. Dentro
de la sección implementation, esos procedimientos y funciones pueden ser definidos y
llamados en cualquier orden.
Esta sección también puede incluir su propia clausula uses, la cual debe ser incluida, si se usa,
inmediatamente después de la palabra implementation. Los identificadores declaradas con
unidades especificadas en una sección implementation son solo disponibles para uso en esa
sección. No pueden ser referenciadas a esos identificadores en la sección interface.
D. La Sección Initialization
Es opcional. Comienza con la propia palabra initialization y continúa hasta el comienzo de la
sección finalization, o si no existe esta ultima hasta el final de la unidad (end.). Esta sección
contiene sentencias que son ejecutadas, en el orden en que aparecen. Asi, por ejemplo, si has
definido estructuras de datos que necesitan ser inicializadas, puedes hacer esto en esta
sección.
E. La Sección Finalization
Es opcional. Puede aparecer solo en unidades que tienen la sección inicialization definida.
Comienza con la propia palabra finalization y continúa hasta el final de la unidad. Contiene
sentencias que son ejecutadas cuando el programa principal termina (a menos que el
procedimiento Halt sea usado para terminar el programa). Esta sección se usa también para
liberar recursos que son asignados en la sección inicialization.
La liberación de recursos se realiza en orden inverso a la de inicialización de los mismos. Por
ejemplo, si tu aplicación inicializa las unidades A, B y C en ese orden, deberán ser finalizadas en
el orden C, B y A.
Una vez que el código de inicialización de la unidad comienza a ejecutarse, la sección
finalization correspondiente esta garantizada a ejecutarse cuando la aplicación finalice.
5. 5 Embarcadero Delphi / Introducción
Ing. Américo Torres Gonzales
Espacios de Nombres (Namespaces) con Delphi
En Delphi, una unidad es un contenedor básico para tipos; mientras que un Espacio de Nombre
es un contenedor de unidades.
A diferencia de las unidades tradicionales, los espacios de nombres pueden ser apilados para
formar una jerarquía. Los espacios de nombres proveen una forma de organizar
identificadores y tipos, y son usados para que no existan ambigüedades con tipos que tengan
el mismo nombre. Ya que hay un contenedor para Unidades, los espacios de nombres pueden
ser usados para diferenciar entre unidades del mismo nombre que residen en paquetes
diferentes.
Por ejemplo, la clase MiClase en MiNombreEspacio1, es diferente de la clase MiClase en
MiNombreEspacio2.
A. Declaración de Espacios de Nombres
En RAD Studio, un archivo de proyecto (programa, librería o paquete) implícitamente
introduce su propio espacio de nombre, llamado el “Espacio de Nombre por defecto”. Una
unidad podría ser un miembro de un “Espacio de Nombre por defecto”, o podría ser declarado
explícitamente a si mismo para ser un miembro de un Espacio de Nombre diferente. En otro
caso, una unidad declara su membresía a un Espacio de Nombre en su encabezado de unidad.
Por ejemplo, considera la siguiente declaración:
Unit MiEmpresa.AreaContabilidad.UnidadPlanContable;
Primero, nota que las partes de los Espacios de nombres están separadas por puntos. Los
espacios de nombres no introducen nuevos símbolos para los identificadores entre los puntos;
los puntos son parte del nombre de la unidad. El nombre del archivo fuente para esta ejemplo
es MiEmpresa.AreaContabilidad.UnidadPlanContable.pas, y el nombre del archivo compilado
resultante será: MiEmpresa.AreaContabilidad.UnidadPlanContable.dcu.
Segundo, nota que los puntos implican una relación conceptual de un espacio de nombre con
otro. El ejemplo arriba declara la unidad UnidadPlanContable que es miembro del espacio de
nombre AreaContabilidad, el cual esta contenido en el espacio de nombre MiEmpresa.
Un espacio de nombre por defecto declara un espacio de nombre para todas las unidades en el
proyecto. Considera las siguientes declaraciones:
Program MiEmpresa.AreaContabilidad.UnidadPlanContable;
Library MiEmpresa.AreaContabilidad.UnidadPlanContable;
Package MiEmpresa.AreaContabilidad.UnidadPlanContable;
Estas 3 sentencias establecen el espacio de nombre por defecto para el programa, librería y
paquete respectivamente. El espacio de nombre es determinado removiendo el identificador y
punto que están mas a la derecha de la declaración.
6. 6 Embarcadero Delphi / Introducción
Ing. Américo Torres Gonzales
Una unidad que omite un espacio de nombre explicito es llamado Unidad Genérica. Una
Unidad Genérica automáticamente se vuelve miembro del espacio de nombre por defecto.
Dada la declaración anterior de program, la siguiente declaración de unidad causaría que el
compilador trate a la unidad UnidadPlanContable como miembro del espacio de nombre
MiEmpresa.AreaContabilidad:
unit UnidadPlanContable;
El espacio de nombre por defecto no afectará el nombre del archivo fuente para una unidad
genérica. En el ejemplo anterior, el nombre del archivo fuente sería UnidadPlanContable.pas.
El compilador sin embargo usa la extensión dcu para el nombre del archivo con el espacio de
nombre por defecto. El archivo dcu resultante sería por lo tanto:
MiEmpresa.AreaContabilidad.UnidadPlanContable.dcu.
Los Espacio de Nombre no son case-sensitive.