| Artículos | 01 SEP 1995

Curso de Programación con Delphi (2)

Tags: Histórico
ObjectPascal y el manejo de excepciones
Jaime Peña.

Delphi toma como base el lenguaje Pascal. Extendiendo sus especificaciones base, implementa el lenguaje orientado a objetos (ObjectPascal) y el manejo de excepciones (Exception Handling).

Delphi supone la mayor y más espectacular extensión del lenguaje, que se ha dado en denominar ObjectPascal, modificando su estructura OOP (aunque se mantenga la compatibilidad con la implementación anterior) y dotándolo de un férreo sistema de manejo de excepciones (Exception Handling).

Para ilustrar los cambios morfológicos y sintácticos del lenguaje ObjectPascal, trabajaremos sobre una cómoda ventana WinCrt, que nos permitirá centrarnos en él, sin perdernos en detalles de construcción de aplicaciones Windows estándar (algo a lo que llegaremos próximamente).

Los que hayan usado Borland Pascal, saben que la unidad WinCrt permite una sencilla migración de aplicaciones DOS al entorno Windows. La unidad se encarga de crear automáticamente una ventana Windows, en cuyo interior podemos hacer uso de procedimientos y funciones que son propias del DOS, típicamente Write, Writeln, Read, Readln, ClrScr y semejantes. Para usar WinCrt, sólo hay que incluir esta unidad en el apartado Uses de nuestro programa. Para cerrar una sesión de trabajo WinCrt sólo hay que llamar al procedimiento DoneWinCrt.

Para trabajar con una ventana WinCrt, abra Delphi y seleccione la opción de menú File\Open Project...; en la caja de diálogo de apertura de proyectos, escoja un tipo de archivo Source File (*.PAS) y escriba de nombre algo así cómo WINCRT01.PAS. Ahora, en la ventana del código, borre su contenido y escriba el programa del Listado 1. Ejecútelo, haciendo click sobre el botón triangular verde de la barra de acceso rápido, SpeedBar, o pulsando F9 y verá como se despliega una ventana WinCrt y al pulsar una tecla vuelve al entorno de desarrollo.

Funciones y variable Result

En Borland Pascal, las funciones devuelven valores del tipo que son declarados en su definición. El modo de devolución es mediante la asignación del valor a la función; por ejemplo:

suma := a+b;

siendo suma el nombre de la función. Por contra, Delphi define una variable de tipo variable denominada Result, de forma que la devolución del valor de la función se realiza asignado el valor a Result. Así, en la función suma se devolvería el resultado:

Result := a+b;

en donde Result es una variable creada automáticamente del tipo adecuado. Es decir, no se declara en ningún lugar y tiene una vigencia local dentro de la función (no puede ser referenciada desde fuera de ella). Delphi aún mantiene el método anterior, por compatibilidad; pero el nuevo tiene la ventaja de que la variable automática Result podrá ser referenciada en operaciones internas dentro de la función, sin que ello suponga una recursividad infinita, ya que si se usa en el lado derecho de una operación, tomará el valor actual y no llamará a la función recursivamente. En el Listado 2 se recoge un ejemplo muy simple del uso de Result.

Cambios en las estructuras Case

En Borland Pascal estaba permitidas estructuras Case que tuviesen valores de rangos superpuestos (o repetidos, si lo prefiere). Por ejemplo, sería valido:

Case i of

2: {... código}

1: {... código}

0..10: {... código}

end;

en dónde se evalúa i y si toma valores 1 ó 2, se ejecuta el código correspondiente; si su valor está entre 0 y 10, se ejecutaría el último, que no se alcanzaría si ya se hubiera ejecutado algún caso anterior (valores 1 ó 2).

En Delphi, esto ya no es válido y debería reescribirse:

Case i of

2: {... código}

1: {... código}

0, 3..10: {... código}

end;

Observe que ahora no hay dos casos para los valores 1 y 2. Además, se recomienda que los casos estén ordenados en valor creciente, para que Delphi pueda optimizar los saltos y no precise cálculos en cada comparación. Así que, estrictamente desde el punto de vista de la eficiencia en velocidad, mejor sería:

Case i of

0: {... código}

1: {... código}

2: {... código}

3..10: {... código}

end;

¿Object o Class?

Nos encontramos con una especie de cambio cosmético de sintaxis que, sin embargo, también implica cambios más profundos en funcionalidades. A bote pronto, Delphi usa la declaración Class en donde Borland Pascal usaba Object; pero Class implementa nuevas capacidades de declarar variables y métodos (o variables y funciones/procedimientos miembro, si prefiere la sintaxis de C++). Con todo, Delphi también mantiene, por razones de compatibilidad, el uso del término tradicional Object.

Una clase es la esencia de la programación orientada a objetos (OOP). A diferencia de lo que no es OOP, se define un tipo de datos complejo que auna variables y el código para manejarlas. Dentro de un objeto Borland Pascal es posible definir apartados públicos (por defecto todos lo son) o privados (los que siguen a la declaración Private). Delphi introduce dos nuevos tipos de apartados: protegidos (los que siguen a la declaración Protected) y publicados (los que siguen a declaración Published). Todos los tipos de apartados pueden declararse en Class (sólo en Delphi, ya que no existe la Class en Borland Pascal) y, si se trabaja sólo con Delphi, también dentro de una declaración/definición de Object. Las diferencias son las siguientes:

* Public: Los componentes públicos son visibles en todo el ámbito del programa. Es decir, podremos referenciarlos y acceder a ellos desde cualquier lugar de nuestra aplicación.

* Private: Estos componentes sólo son visibles dentro del módulo en que se define el objeto. Por ejemplo, si se define en una unidad, sólo podremos referenciarlos y acceder a ellos desde otro objeto descendiente de esa misma unidad.

* Protected: Son accesibles por parte de otros objetos que desciendan (deriven) del objeto en que son declarados. Son una especie de combinación de Private (ya que sólo se puede acceder desde objetos descendientes) y Public (ya que no se precisa que sea del mismo módulo).

* Published: Los componentes así declarados generan código RTTI (Run-Time Type Information). De esa manera, puede acceder a ellos desde otra aplicación, a través de la interfaz publicada. Así es cómo se deben declarar propiedades y métodos para ser usados en el Object Inspector de Delphi. Esta declaración sólo tiene interés cuando creemos nuevos componentes visuales, para usarlos en la programación visual con Delphi.

Si ahora se fija en el Listado 3, encontrará una sencilla aplicación, en la que por primera vez definimos una clase. Su funcionalidad es muy sencilla, aunque puede que le sea incluso útil, calcula el NIF de un DNI. Observe su declaración, hay una parte privada y una pública. En la privada hay dos variables y un procedimiento. Dentro del mismo módulo (en este caso, dentro del código del programa) son accesibles directamente.

Pero, por contra, si se definiera la clase en una unidad externa, ya no podría accederse a las variables y llamar a los procedimientos privados y, necesariamente, habríamos de trabajar con los métodos públicos. (NOTA: obsérvese que en el código del Listado 3, tal cual está, se podría ejecutar la aplicación aunque la definición de la clase NIF estuviera en una unidad aparte; lo que se encuentra entre llaves, comentado, no se podría ejecutar).

Manejo de excepciones

El manejo de excepciones es uno de los cambios más importantes de la implementación de ObjectPascal en Delphi. Ya desde hace tiempo, los compiladores de C++ disponían de la capacidad de manejar excepciones (Exception Handling), de conformidad con las especificaciones más recientes del lenguaje. Ahora, todas las ventajas del método están disponibles en Pascal; veamos

Contenidos recomendados...

Comentar
Para comentar, es necesario iniciar sesión
Se muestran 0 comentarios
X

Uso de cookies

Esta web utiliza cookies técnicas, de personalización y análisis, propias y de terceros, para facilitarle la navegación de forma anónima y analizar estadísticas del uso de la web. Consideramos que si continúa navegando, acepta su uso. Obtener más información