CAPITULO 4

 

UNIDADES

 

 

 

QUE ES UNA UNIDAD?

 

 

Object Pascal da acceso a un largo número de constantes predefinidas, tipos de datos, variables, procedimientos y funciones. Algunas son específicas de Object Pascal; otras son específicas de las librerias de clases o del API (Interfaz de Programas de Aplicación) de Windows. Estas son muy numerosas, pero es inusual usarlas todas en un programa específico. Por ésto, dichas funciones han sido divididas en grupos llamados unidades, permitiendo usar sólo las unidades que su programa necesita.

 

Una unidad es una colección de constantes, tipos de datos, variables, procedimientos y funciones. Cada unidad es casi como un programa Pascal independiente: tiene un cuerpo principal que es llamado antes que el programa comience y hace todo lo que sea necesario para su inicialización. En resumen una unidad es una librería de declaraciones y de rutinas que se pueden usar dentro de un programa, que permite hacer programas por partes que se compilan separadamente.

 

 

 

 

ESTRUCTURA DE LAS UNIDADES

 

 

La estructura de una unidad es similar a la de un programa, pero con algunas diferencias significativas:

 

 

            unit       < Identificador >;

            interface

            uses     <Lista de unidades >;     {Opcional}

                        { Declaraciones públicas }

            implementation

                        { Declaraciones privadas }

                        { Procedimientos y funciones }

            initialization

                        { Codigo de inicializacion }

            end.

 

 

La cabecera de una unidad comienza con la palabra reservada unit, seguida por el nombre de la unidad, exactamente como los nombres de programa. El siguiente item en una unidad es la palabra reservada interface. Esta señala el comienzo de la sección de interfaz de la unidad   -la "sección visible" a cualquier otro programa o unidad que haga uso de esta unidad.

 

Una unidad puede hacer uso de otras unidades, especificándolas en la claúsula uses. Si esta claúsula está presente, debe aparecer inmediatamente después de la palabra reservada interface.

 

 

SECCION DE INTERFAZ

 

La parte de interfaz -parte "pública"- de una unidad comienza con la palabra reservada interface, después de la cabecera de una unidad y finaliza cuando se encuentra la palabra reservada implementation. La interfaz determina lo que es "visible" a cualquier programa (u otra unidad) que hace uso de la unidad; cualquier programa que haga uso de la unidad accede sus rutinas a través de estos items "visibles".

 

En la interfaz de la unidad, se pueden declarar constantes, variables, tipos de datos, procedimientos y funciones. Los procedimientos y funciones visibles a cualquier programa que haga uso de la unidad deben declararse aquí; el cuerpo de estos procedimientos y funciones se desarrollan en la sección de implementación.

 

 

SECCION DE IMPLEMENTACION

 

La sección de implementación ­la parte "privada"­ comienza con la palabra reservada implementation. Los procedimientos y funciones declarados en la interfaz deben reaparecer en la implementación con un encabezamiento idéntico al usado en la interfaz o en su forma corta. Para la forma corta, simplemente se escribe la palabra reservada function o procedure, seguido por el nombre identificador de la rutina sin necesidad de especificar sus parámetros. Las rutinas pueden contener sus declaraciones locales, seguidas por el cuerpo principal de la rutina. Si en la sección de interfaz aparecen declaraciones como éstas:

 

      function Mayor(v1,v2 : integer)  : integer;

      procedure Intercambiar(var v1,v2 : integer);

 

En la implementación podría aparecer como:

 

      function Mayor(v1,v2 : integer)  : integer;

      begin

            if v1 > v2 then Mayor := v1 else Mayor := v2;

      end; { mayor }

     

      procedure Intercambiar;

      var

            Temporal : integer;

      begin

            Temporal := v1;

            v1 := v2;

            v2 := Temporal;

      end; { intercambiar }

 

 

 

SECCION DE INICIALIZACION

 

El desarrollo completo de una unidad generalmente se encontrará en la sección de implementación de la misma (entre las palabras reservadas implementation y end.). Sin embargo, se puede colocar la palabra clave begin o la palabra clave Initilization antes del end final, con sentencias entre las dos, la sentencia  compuesta resultante -como si fuera el cuerpo principal de un programa- sería la sección de inicialización de la unidad.

 

En la sección de inicialización se inicializa cualquier estructura de datos (variables) que la unidad usa. Cuando se ejecuta un programa que haga uso de una unidad, antes de que el cuerpo principal del programa corra, se hace un llamado a la sección de inicialización de la unidad.

 

Las unidades se emplean en los programas una vez éstas hayan sido compiladas y almacenadas en lenguaje de máquina -no en código fuente Pascal, puesto que no son archivos incluídos. Como resultado, el usar unidades añade muy poco tiempo al tiempo de compilación de un programa.

 

Cuando un programa haga uso de una unidad específica o colección de unidades, se debe colocar la claúsula uses al comienzo de éste, seguido por una lista de los nombres de las unidades usadas, separadas por comas.

 

 

 

ESCRIBIENDO SUS UNIDADES

 

 

Ahora veremos cómo escribir una unidad llamada Mi_Libr, almacenada en un archivo llamado Mi_Libr.Pas y cómo compilarla en el disco; resultando un archivo codificado llamado Mi_Libr.Dcu, el cual puede usar en sus programas declarándola con la sentencia uses así:

 

      program ejemplo;

      uses mi_libr;

 

Tenga en cuenta que Object Pascal espera que la unidad y el archivo en que está contenida tengan el mismo nombre.

 

Una unidad se compila igualmente como se hace con un programa. Sólo que en lugar de crear un archivo .EXE, Delphi crea un archivo .DCU (Delphi Compile Unit).

 

A manera de ejemplo, una unidad completamente terminada tendría la siguiente estructura:

 

 

 

      unit mi_libr;

 

      interface

 

      function Mayor(v1,v2 : integer) : integer;

      procedure Intercambiar(var v1,v2 : integer);

 

      implementation

 

      function Mayor;

      begin

            if v1 > v2 then Mayor := v1 else Mayor := v2;

      end; { mayor }

     

      procedure Intercambiar;

      var

            Temporal : integer;

      begin

            Temporal := v1;

            v1 := v2;

            v2 := Temporal;

      end; { intercambiar }

 

      end. { fin de mi_libr }

 

 

 

Una vez escrita, salvada y compilada en el disco como MI_LIBR.DCU, ya está lista para ser usada por cualquier otro programa o unidad, tal como se aprecia en el siguiente programa:

 

 

      program prueba;

      uses mi_libr;

     

      var

            A,B   : integer;

 

      begin

            Write('Entre dos valores enteros: ');

            Readln(A,B);

            Writeln('El mayor entre estos dos valores es ',Mayor (A,B);

            Intercambiar(A,B);

            Writeln('Los valores intercambiados son A=',A,' B=',B);

            ReadLn;

      end. { del programa prueba} 

 

 

 

Hasta ahora hemos visto el uso de las unidades como librerías ( Una colección de rutinas comúnmente usadas por diversos programas ). Otra función que prestan las unidades, es dividir programas extensos en módulos, haciéndolos muy manejables y más estructurados, además de la posibilidad de probar los módulos independientemente y extender en más de 64K el segmento de código de los programas, ya que cada unidad posee un segmento de código independiente.