Está en la página 1de 35

USUARIO

HPC1349

Indice por revistas | Búsqueda Temática

www.idg.es/pcworld

[01/11/1999]
Programación con Delphi (I) Haga sus propios programas con Delphi de
una forma sencilla, rápida y fiable

Programación con Delphi (I)


Haga sus propios programas con Delphi de una forma sencilla, rápida y fiable

Crear sus propias aplicaciones para Windows no es una tarea compleja en exceso. En este curso podrá aprender
las bases para hacerlo, usando una de las herramientas más conocidas y potentes: Borland Delphi.

Número: 159 Sección: PC World Práctico Página: 360

• El entorno de Delphi • El lenguaje de programación


• Componentes personalizables e interactivos • Visto y por ver

• Desarrollo basado en componentes

La mayoría de los usuarios de un ordenador son, a su vez, usuarios de aplicaciones informáticas que se adaptan, más o
menos, a sus necesidades. Muchas de estas aplicaciones, como las hojas de cálculo, las bases de datos o los procesadores
de textos, son de uso genérico, no hechas a medida para un usuario determinado. Diseñar y crear sus propios programas, lo
que tradicionalmente se ha entendido por programar, es cada día más fácil, gracias a la existencia de herramientas como
Borland Delphi. En éstas, gran parte del trabajo se efectúa de manera visual, arrastrando y soltando objetos con el ratón, en
lugar de escribiendo gran cantidad de código.

En la serie que se inicia en este número, y que nos ocupará los próximos meses, podrá aprender a crear aplicaciones a
medida utilizando Borland Delphi. El punto de partida, esta primera entrega, la dedicaremos a introducir términos y
conceptos genéricos, necesarios para poder avanzar posteriormente. Lo único que se asume es que el lector es usuario de
Windows, habituado, por tanto, al uso del ratón y con conocimiento de técnicas como arrastrar y soltar.

Lógicamente, para poder seguir los ejemplos propuestos deberá disponer de alguna de las versiones de Delphi instalada en
su equipo. Nosotros usaremos la edición Enterprise de Borland Delphi 5, la última versión disponible en este momento. No
obstante, las diferencias respecto a otras versiones previas serán mínimas y, siempre que sean de importancia, se indicarán
adecuadamente.

El entorno de Delphi
La instalación de Delphi en el sistema es una tarea muy sencilla, similar a la instalación de cualquier otra aplicación, por lo
que no emplearemos tiempo en ello y asumiremos que Delphi ya se encuentra instalado. Para iniciarlo se procederá,
asimismo, como en cualquier otro caso, por regla general abriendo el menú del botón Inicio y seleccionando la opción
adecuada.
Figura 1

El entorno de Delphi es configurable, adaptable a las preferencias del usuario, de ahí que su aspecto pueda variar mucho
según los cambios que se hayan efectuado en él. En la Figura 1 puede ver el aspecto típico que muestra Delphi al iniciarse,
mientras que en la Figura 2 puede ver el mismo entorno tras algunos cambios. A partir de la versión 4, las distintas ventanas
de Delphi son acoplables entre sí, formando mosaicos de ventanas adosadas o con múltiples páginas, según nuestras
preferencias. Como en muchos otros casos, lo único que hay que hacer es arrastrar y soltar las ventanas hasta allí donde se
desean colocar.

Figura 2
(HAGA CLICK SOBRE LA IMAGEN)

Las barras de botones, que puede ver en detalle en la Figura 3, ponen a nuestro alcance las acciones más habituales. Con
éstos es posible crear nuevas ventanas de aplicación, ejecutar el proyecto, guardarlo, etc., sin necesidad de recurrir al menú
de opciones. Observe que los botones se encuentran agrupados en varias barras, que pueden ocultarse, mostrarse y
moverse de manera independiente.

Figura 3
(HAGA CLICK SOBRE LA IMAGEN)

En la Paleta de componentes (detalle de la Figura 4), alojada normalmente junto al menú de opciones y las barras de
botones, se encuentran los elementos básicos sobre la base de los cuales se construyen las aplicaciones. Cuando se utiliza
un programa de diseño para crear un gráfico, las entidades básicas son las líneas, polígonos, tramas e imágenes. De
manera análoga, al usar Delphi para crear una aplicación dichas entidades son los botones, listas, opciones de selección,
etc.

Figura 4
(HAGA CLICK SOBRE LA IMAGEN)
Si para dibujar se utiliza como soporte un lienzo, que contendrá las diversas entidades citadas, en Delphi se utiliza lo que se
conoce como formulario. Éste, como puede apreciarse en la Figura 5, es una ventana que servirá como contenedor,
alojando a todos los componentes que se necesiten para conseguir la funcionalidad que se espera del programa.

Figura 5

Ciertos elementos del entorno de Delphi, como las barras de botones o la Paleta de componentes, no sólo pueden ser
colocados donde nos interese, ya sea como ventanas independientes o adosadas a otras, sino que, además, su contenido
puede ser también modificado. Usando el botón secundario del ratón, para hacer aparecer el correspondiente menú
contextual, podrá tanto añadir como eliminar botones, así como modificar las páginas de la Paleta de componentes y los
objetos que hay en ellas.

Componentes personalizables e interactivos


Cuando se está utilizando un programa de dibujo, por continuar con la analogía usada en el punto anterior, está claro que
todos los triángulos son triángulos y, lógicamente, todas las circunferencias son circunferencias. No obstante, un triángulo
puede diferenciarse de otro por sus dimensiones, por su tipo (isósceles, escaleno o equilátero), su color, etc. Dicho en otras
palabras: un triángulo es siempre un triángulo, pero nosotros podemos personalizarlo durante el dibujo.

Con los elementos usados para crear programas en Delphi, los componentes, ocurre otro tanto. Todos los botones son
botones pero, dependiendo de nuestras necesidades, podemos personalizarlos adecuadamente. Con este fin, los
componentes cuentan con propiedades, como pueden ser las dimensiones, el color, el título que aparece en el interior del
botón, etc.

Para modificar las propiedades de los componentes, personalizándolos según necesitemos, Delphi cuenta con una ventana
conocida como Inspector de objetos (véase la Figura 6). En éste aparece una lista con todas las propiedades del
componente que se elija, mostrándose tanto su nombre como su contenido. El color de un botón, por ejemplo, se almacena
en una propiedad llamada Color, y sus posibles valores serían clWhite, clRed o clYellow.

Figura 6
Un dibujo, una vez que se ha terminado, suele ser algo estático. El espectador puede verlo, analizarlo y opinar, pero no
puede interactuar con él. Un programa, por el contrario, se construye generalmente para que el usuario final pueda utilizarlo,
interactuando con él. Estas interacciones se producen casi siempre a través de dos dispositivos: el teclado y el ratón. Con
ellos el usuario puede introducir un nombre, pulsar un botón o seleccionar una opción de un menú. Cada vez que se efectúa
una de estas acciones, el sistema operativo la traduce en un mensaje que envía a la aplicación. Estos mensajes son
conocidos como eventos.

El lenguaje de programación
A pesar de la simplicidad que aporta el desarrollo de programas utilizando componentes, efectuando tareas que hace tiempo
debían realizarse mediante la escritura de código, para crear una aplicación no basta con pulsar botones y arrastrar y soltar
objetos, también es preciso escribir algo de código.

Éste se introduce utilizando un cierto lenguaje de programación que, en el caso de Delphi, es Object Pascal.

El lenguaje Pascal es uno de los más conocidos desde su creación, a principios de la década de los setenta. Derivado de
ALGOL, Pascal es un lenguaje que ha influido en otros muchos, desde Ada hasta Modula, Oberon o el propio Visual Basic.
Su punto álgido, en cuanto a uso se refiere, se produjo en la década de los ochenta, con la aparición del Turbo Pascal de
Borland, del cual es heredero el actual Delphi.

Pascal es un lenguaje inicialmente pensado para la educación aunque, hasta la actualidad, ha sido utilizado con muchos
otros fines. Desde sus inicios ha sido un lenguaje claro, estructurado y elegante, fácil de aprender y útil en la mayoría de
campos de aplicación. Object Pascal es una evolución del Pascal original que, preservando esa claridad y elegancia, añade
los elementos necesarios para convertirlo en un lenguaje orientado a objetos, al estilo de C++.

Como se ha indicado anteriormente, Delphi recibe del sistema unos eventos o señales en determinadas circunstancias, por
ejemplo cuando se pulsa un botón del ratón o del teclado. Siempre que nos interese, utilizaremos el lenguaje Object Pascal
para describir qué deseamos hacer cuando se reciba un evento. Dicho código será introducido en el Editor de código, que
puede ver en la Figura 7.

Figura 7

Visto y por ver


Esta primera entrega nos ha servido para familiarizarnos con el entorno de Borland Delphi, conociendo los nombres con los
que se denomina a los elementos más importantes: Paleta de componentes, Inspector de objetos, Editor de código, etc.

También se ha descrito, a grandes rasgos, el proceso de desarrollo de una aplicación usando Delphi: diseño de la interfaz,
insertando componentes en un formulario, y codificación de la funcionalidad, escribiendo código asociado a los eventos que
generan esos componentes.

El próximo mes entraremos en algunos detalles acerca del diseño de la interfaz, insertando componentes y utilizando el
Inspector de objetos para personalizarlos.

También aprenderá a asociar una línea de código a un evento, creando su primer programa funcional que, lógicamente,
podrá y ver en funcionamiento.
Desarrollo basado en componentes

Durante muchos años, prácticamente desde los inicios de la informática hasta principios de esta década, la programación o desarrollo
de aplicaciones para ordenadores ha sido una tarea prácticamente artesanal. El equipo implicado en el desarrollo, muchas veces una
sola persona, tenía que contar con conocimientos en muy distintas áreas, desde la gestión de bases de datos, hasta las
comunicaciones, pasando por los gráficos por citar los campos más conocidos. Utilizando una analogía, sería como que para construir
un coche el fabricante tuviese que crearlo todo desde cero, desde las ruedas hasta el motor, pasando por los más mínimos detalles
del equipamiento.

Lógicamente, la producción de un bien con esta técnica limita mucho sus posibilidades y alcance. Imagine cuántos de nosotros
dispondríamos de un automóvil si no existiese la fabricación en cadena, los fabricantes especializados y las cadenas de montaje.

Actualmente, por fortuna, el desarrollo de software ha cambiado considerablemente gracias a la existencia de los componentes, que
no son más que piezas del puzzle que será la aplicación. Nuestro trabajo, como programadores, consistirá en seleccionar los
componentes adecuados, personalizarlos y conectarlos entre sí para conseguir la funcionalidad perseguida. Es como crear una
construcción a partir de las piezas de un mecano, más o menos.

Borland Delphi cuenta con un importante número de componentes que, como se indicó previamente, encontrará en las distintas
páginas de la Paleta de componentes. A pesar de ello, esos componentes no cubren todas las necesidades de todos los
programadores, algo que sería prácticamente imposible. No obstante, existen cientos de desarrolladores que se dedican a crear
componentes, objetos que pueden ser añadidos a la Paleta de componentes de Delphi y utilizados en sus aplicaciones directamente,
como haría con los componentes que ya incorpora de por sí esta herramienta.

Francisco Charte es profesor de informática. Autor de diferentes libros sobre lenguajes y sistemas de información.

Francisco Charte.
USUARIO
HPC1349

Indice por revistas | Búsqueda Temática

www.idg.es/pcworld

[01/12/1999]
Creación de la primera aplicación ejecutable con Delphi

Programación con Delphi (II)


Creación de la primera aplicación
ejecutable con Delphi
En esta nueva entrega, veremos más fundamentos del lenguaje y del entorno de desarrollo de Visual Basic. En este
número se hablará sobre programación dirigida por eventos y se explicarán las propiedades más importantes de
algunos controles.

Número: 160 Sección: PC World Práctico Página: 308

[Planificación de su primer programa] [Inserción de los componentes]


[Edición de propiedades] [Gestión de los eventos]
[Guardar y ejecutar el proyecto] [Visto y por ver]
[Inserción de componentes] [El Inspector de objetos]

Francisco Charte Ojeda


charte@pcw.idg.es

La entrega anterior, primera de esta serie, fue poco más que un "vistazo" a la apariencia de una aplicación. Con ello,
sin embargo, ya sabemos cómo denominar a las partes más importantes del entorno de Borland Delphi, usando
términos que en esta segunda entrega nos serán útiles para ponernos manos a la obra.

Desarrollar aplicaciones con una herramienta como Borland Delphi implica conocer no sólo un entorno, sino
también un lenguaje, un conjunto de componentes y, en ocasiones, el funcionamiento del propio sistema operativo.
El lenguaje que necesitaríamos conocer, en este caso, sería Object Pascal. Los componentes que utiliza Delphi son
de dos tipos: VCL ("Visual Component Library", Librería de componentes visuales) y ActiveX. El sistema
operativo actualmente es Windows, aunque en los próximos meses también existirá una versión para Linux.

Conocer Object Pascal, así como la jerarquía de componentes VCL y su funcionamiento, es algo que puede precisar
una cantidad importante de tiempo, cientos de horas distribuidas en muchas semanas o meses. No obstante, no es
preciso contar con todos esos conocimientos para desarrollar ejemplos sencillos. Éstos, al tiempo, nos permitirán ir
aprendiendo elementos diversos, tanto del lenguaje como de los componentes y el propio entorno.
Planificación de su primer programa
Sin conocer nada más que la interfaz del entorno de desarrollo, hemos de ser realistas y proponernos un objetivo
muy sencillo ya que, de lo contrario, corremos el riesgo de no entender nada y quedarnos atascados.

La finalidad de nuestro primer proyecto será mostrar una ventana, con un título, una caja de texto y un botón en su
interior. El usuario de esta maravilla de la ingeniería del software podrá introducir un nombre en la caja de texto,
pulsando a continuación el botón para recibir una contestación por parte del programa.

El desarrollo del proyecto lo dividiremos básicamente en tres fases: inserción de los componentes, edición de las
propiedades y asociación de código a los eventos que procedan. Dados estos pasos, podremos compilar y ejecutar
para ver el resultado.

Nuestro propósito con este programa, más allá de que disponga de una aplicación saludadora, es que adquiera las
bases necesarias para, posteriormente, saber cómo insertar cualquier componente, personalizarlo, gestionar sus
eventos, etc.

Inserción de los componentes


El primer paso que tenemos que dar es iniciar Delphi, si es que no estaba ya abierto. Cada vez que se inicia Delphi,
éste abre un proyecto por defecto que, generalmente, consta de un solo formulario. Éste inicialmente está vacío.
Existe, además, un módulo de código asociado a él, conteniendo la definición de los objetos que hay en él, el código
a ejecutar ante ciertos eventos, etc. El formulario, en principio, tendrá el aspecto mostrado en la Figura 1.

Figura 1.- En un principio, al iniciar el nuevo proyecto, el


formulario que aparece está vacío.

Mueva el puntero del ratón a la Paleta de componentes, en la ventana principal de Delphi, y localice el control
llamado Label. Cuando esté sobre él, pulse el botón principal del ratón, seleccionándolo. Verá que queda como
hundido. Ahora desplácese hasta situar el puntero del ratón sobre el formulario, más o menos en la esquina superior
izquierda, y pulse de nuevo el botón principal del ratón. Podrá ver que aparece un pequeño texto con unos recuadros
alrededor. En la Figura 2 puede ver representado el proceso.
Figura 2.El proceso de inserción de un control es siempre el mismo:
selección en la Paleta de componentes del icono correspondiente,
pulsando sobre él con el botón principal del ratón, y alojamiento en
el interior del formulario.

En este momento tiene en el formulario un objeto, un control en este caso, que pertenece a la clase TLabel. Pueden
existir muchos objetos de esta clase, al igual que pueden existir muchos automóviles de la misma marca y modelo,
pero no por ello todos tienen que ser iguales, puesto que pueden elegirse propiedades como el color, equipamiento,
motorización, etc. Por defecto, los controles de la clase TLabel, a los que se conoce comúnmente como "etiquetas
de texto", muestran en su interior un título que siempre es la palabra Label seguida de un número.

Siguiendo el mismo proceso descrito, elija ahora el componente Edit, que aparece a la derecha de Label en la
Paleta de componentes. Inserte un componente de esta clase en el formulario, situándolo justo debajo del anterior.
Por último, elija un control Button, que está más a la derecha, insertándolo en el formulario a la derecha de los dos
anteriores. Con todo, su aspecto ahora debería ser similar al de la Figura 3.

Figura 3. Detalle del formulario una vez insertados los tres


controles.

Inserción de componentes

Para insertar un componente en el formulario pueden utilizarse diferentes técnicas. Una de ella es la ya descrita, pulsando
sobre el icono que representa el componente y, a continuación, desplazándose hasta el formulario y pulsando de nuevo.

Un método alternativo consiste en hacer doble clic sobre el icono, en la Paleta de componentes. En este caso el control se
insertará directamente en el formulario, tomando una posición y un tamaño por defecto. Generalmente la posición será
centrada en el interior del formulario.

Otra opción consiste en elegir el control en la Paleta de componentes, como en el primer caso con un solo clic sobre él,
pulsar seguidamente sobre un punto del formulario y, sin soltar el botón, moverse a un segundo punto, estableciendo el
tamaño del componente. De esta forma el control no sólo aparece en la posición que nosotros queremos sino que,
además, tomará también unas dimensiones específicas.

Edición de propiedades
En este momento todos los elementos de nuestro proyecto, tanto el formulario existente inicialmente, como los
componentes insertados en él, tienen en sus propiedades unos valores por defecto. Dichos valores son los que
determinan muchos aspectos, tales como las dimensiones del formulario, el título que aparece en la etiqueta de texto
o el botón, etc.

Ciertas propiedades, como la posición o el tamaño de los componentes, pueden modificarse tanto visualmente como
mediante el Inspector de objetos. Cambiar las dimensiones del formulario, por ejemplo, es una tarea muy sencilla:
Desplace el puntero del ratón hasta una de las esquinas, pulse el botón principal y, sin soltarlo, arrastre la esquina
alterando el tamaño de la ventana. Lo mismo sería aplicable para modificar el tamaño de un control.

Otras propiedades, sin embargo, tan sólo pueden modificarse mediante el Inspector de objetos. Algunas de estas
propiedades son los nombres de los componentes, los títulos que muestran en su interior, el color o tipo de letra que
usan, etc. Si no tiene visible el Inspector de objetos, pulse la tecla F11 para hacerlo aparecer.

Vamos a comenzar modificando el título que aparece en la parte superior del formulario, "Form1" en este momento.
Pulse sobre él para seleccionarlo y a continuación sitúe el puntero sobre el Inspector de objetos, concretamente
sobre la propiedad llamada Caption. Pulse sobre ella e introduzca directamente el nuevo título, por ejemplo
"Emisor de saludos". A medida que teclea, podrá ver cómo el título del formulario va cambiando. En la Figura 4
puede ver cómo se ha pulsado sobre la mencionada propiedad y modificado su contenido.

Figura 4. Desde el Inspector de objetos es posible


modificar cualquier propiedad del componente que tenga
seleccionado.

A continuación pulse sobre BorderStyle. Despliegue la lista adjunta y elija el valor bsDialog. Con esto está
indicando que la ventana, el formulario, se comportará como un cuadro de diálogo, lo que significa que no será
redimensionable y no contará con botones de maximizar y minimizar.

Elija ahora el control Label1, ya sea pulsando sobre él, en el formulario, o seleccionándolo de la lista desplegable
que hay en la parte superior del propio Inspector de objetos. Vamos a modificar también la propiedad Caption que,
en este caso, corresponde al texto mostrado en el control. Teclee el texto "Introduzca su nombre" y pulse Intro.

El siguiente paso será elegir el control Buton1, modificando también su propiedad Caption. En este caso el valor
que le daremos será "Saludos". Para terminar, elija el control Edit1 y edite su propiedad Text, eliminando el
contenido que tiene en este momento. La propiedad Text de los controles TEdit es similar a la propiedad Caption
de los TLabel y TButton, es decir, contiene el texto mostrado en el control. La diferencia es que, cuando se
ejecute el programa, el usuario no puede modificar directamente el contenido de la propiedad Caption, mientras
que sí puede hacerlo con la propiedad Text.

En este momento el aspecto del formulario debería ser, más o menos, el mostrado en la
Figura 5. Podríamos decir que tenemos finalizado el diseño de la interfaz de nuestro programa. En este momento,
no obstante, tan sólo tenemos una interfaz estática, ya que no ocurriría nada si el usuario pulsase el botón, por poner
un ejemplo.

Figura 5. Tras modificar las propiedades de los


componentes, ya tenemos nuestro formulario con
su apariencia definitiva.

Gestión de los eventos


Los componentes aparte de propiedades, que establecen básicamente su apariencia, también cuentan con eventos,
que modifican su comportamiento. Un automóvil, por ejemplo, aparte de un cierto color, tapicería y equipamiento,
tiene eventos que son los que establecen qué ocurrirá al mover la palanca de cambios o pulsar un interruptor del
salpicadero. De forma análoga, los eventos de los controles son los que establecen qué ocurrirá cuando se pulsa un
botón o elige una opción

.
Figura 6. Desde el Inspector de
objetos también puede accederse a
la lista de los eventos de un
componente

.En el Inspector de objetos existen dos páginas, una que facilita la edición de las propiedades y otra para la edición
de los eventos. Seleccione el botón que hay en el formulario y, a continuación, abra la página de eventos del
Inspector, tal y como puede verse en la Figura 6. Como puede ver, todos los eventos tienen un nombre que
comienza por On, lo cual les diferencia rápidamente de las propiedades. El evento OnMouseMove se producirá
cuando el puntero del ratón se desplace sobre el botón, OnKeyPress al pulsar una tecla, OnClick al pulsar el botón
de cualquier forma, etc.
El evento más interesante de un botón es OnClick. Éste tiene lugar al pulsar el botón, ya sea utilizando el ratón o el
teclado. Haga doble clic, en el Inspector de objetos, a la derecha del mencionado evento. Podrá ver que se abre el
Editor de código, en el cual se ha introducido un nuevo procedimiento. Éste será ejecutado siempre que se pulse el
botón, lo que significa que cualquier código que escribamos se ejecutará al hacer clic sobre el botón.

Introduzca en el interior del procedimiento que se ha abierto la siguiente sentencia:

ShowMessage('Hola ' + Edit1.Text +


', ¿cómo estás?');

Observe que al poner el punto detrás de Edit1, automáticamente se abre una lista con las propiedades de ese objeto
(véase Figura 7).

Figura 7. El Editor de código facilita nuestro trabajo, abriendo una


lista de la que es posible elegir la propiedad a la que deseamos
acceder.

ShowMessage() es un procedimiento, una orden reconocida por Delphi, que se utiliza para mostrar un mensaje. Éste
debe facilitarse en el interior de los paréntesis que siguen a ShowMessage(). En este caso el mensaje está
compuesto de tres partes: la cadena 'Hola ', el contenido de la propiedad Text del control Edit1 y la cadena ',
¿cómo estás'. Observe que estas partes están separadas unas de otras por el operador +, lo cual indica que
deseamos unirlas para formar un solo mensaje.

El Inspector de objetos

El Inspector de objetos muestra siempre la lista de propiedades del componente que tenga seleccionado en
cada momento. Puede saber qué componente es el elegido observando la parte superior del propio Inspector,
en el que existe una lista desplegable que muestra el nombre y clase del objeto con el que está tratándose.
Los formularios son objetos de la clase TForm, las etiquetas de la clase TLabel, los botones de la clase
TButton, etc. Cada clase es como un molde, a partir del cual se obtienen copias exactas de los
componentes.

Puede cambiar el componente cuyas propiedades quiere editar, en el Inspector de objetos, bien pulsando
sobre el objeto que desee, por ejemplo el formulario, o bien eligiéndolo directamente de la lista desplegable.
Pruebe a abrir en este momento la lista desplegable que hay en la parte superior del Inspector de objetos,
verá que aparecen cuatro elementos: el formulario y los tres controles insertados en él.

Guardar y ejecutar el proyecto


En este momento ya tenemos finalizado nuestro primer proyecto. Use la opción Save All del menú File, o bien
el botón equivalente, y guárdelo en disco. Deberá facilitar dos nombres de archivo: uno en el que se guardará el
formulario y otro para almacenar el proyecto globalmente.

Dado el paso anterior, que nos garantiza que no perderemos el trabajo, pulse la tecla F9 para ejecutar el proyecto. Si
todo va bien, aparecerá el formulario como un cuadro de diálogo, solicitándonos que introduzcamos nuestro
nombre. Tras hacerlo, pulsamos el botón y obtenemos una respuesta, como puede verse en la Figura 8.

No es el programa más útil que existe, pero es nuestro primer programa hecho en Delphi, lo cual es muy
gratificante.

Figura 8. Nuestro primero proyecto en ejecución,


respondiendo a la pulsación del botón.

Visto y por ver


En esta segunda entrega hemos aprendido a insertar componentes, editar propiedades y codificar eventos,
construyendo un programa sencillo pero demostrativo. Este ejemplo le servirá de punto de partida para otras
experimentaciones. Puede, por ejemplo, insertar varios botones y asociar mensajes diferentes a cada uno, o solicitar,
además del nombre, otros datos del usuario.

El próximo mes entraremos en mayor detalle sobre las propiedades de los componentes, sus tipos y la forma de
editarlas. También conoceremos algunas características adicionales de los controles usados en este ejemplo, al
tiempo que trataremos controles nuevos.

Francisco Charte es profesor de infromática.


Autor de diferentes libros sobre lenguajes y sistemas de información

Francisco Charte.
PRÁCTICO

Programación con Delphi (III)

Componentes, propiedades,
métodos y eventos
Francisco Charte Ojeda
charte@pcw.idg.es

C
uando se comienza a trabajar muchas herramientas de desarrollo en
con una nueva herramienta, el las que crear una interfaz de usuario,
usuario generalmente quiere ver por poner el ejemplo más simple,
resultados de manera inmediata. Por requiere un gran trabajo de codifica-
ello en la entrega anterior, segunda ción.
de esta serie, nos centramos en el Las herramientas RAD disponen de
desarrollo de nuestro primer pro- componentes prefabricados, que efec-
grama con Delphi, a pesar de que túan una determinada labor, y asisten-
desconocemos la mayoría de las tes que generan código automática-
características de esta herramienta y mente. Estos elementos hacen que
sus componentes. En esta tercera crear una aplicación simple sea un
entrega nos ocuparemos, con algo juego de niños pero, a cambio, ocul-
más de detalle, de lo que estamos tan gran parte del funcionamiento del
utilizando y generando al trabajar sistema y las propias aplicaciones, por
con Delphi. Para ello nos serviremos lo que el desarrollador desconoce lo
del mismo programa de ejemplo de que está ocurriendo y, en ocasiones,
la entrega anterior, analizando su incluso lo que él mismo está haciendo.

Todos los elementos que manipulamos en el entorno de Delphi son objetos,

en su mayor parte componentes, que cuentan con propiedades, métodos y eventos.

diseño, el código generado y funcio- El lenguaje Object Pascal


namiento. Todos los componentes que incorpora
Delphi es una herramienta de desa- Delphi están escritos en Object Pascal.
rrollo visual, lo que habitualmente se Los asistentes de Delphi generan
conoce como un RAD (Rapid Appli- código en Object Pascal. Nuestras
cation Development, Desarrollo reglas de negocio, el código que ten-
rápido de aplicaciones). Esto signi- dremos que escribir para implementar
fica que ciertas tareas, como el la funcionalidad de nuestra aplicación,
diseño de las interfaces de usuario o deberemos realizarlas usando Object
la creación del modelo de acceso a Pascal. No hay duda, por tanto, de que
datos, se efectúan de manera visual, se trata de un lenguaje que debería-
arrastrando y soltando elementos mos conocer bien para poder aprove-
conocidos como componentes. Si char Delphi.
tan sólo conoce herramientas visua- Describir el lenguaje Object Pascal,
les, esta metodología le parecerá la tan sólo básicamente, abarcaría algu-
más lógica. No obstante, hasta la nos cientos de páginas de pura teoría.
aparición del concepto RAD, hace Una buena forma de aprender un len-
unos años, y aún hoy, existen guaje, sin comenzar con esa descrip-

◆ 296 PC World Enero 2000


PRÁCTICO

con procedimientos y fun- repetidamente unas de otras y dando


ciones, escritos en módu- lugar a lo que, habitualmente, se
los de código independien- conoce como jerarquías de clases. La
tes que es posible incluir VCL (Visual Component Library, Libre-
en nuestros proyectos. ría de componentes visuales) de
Delphi es una jerarquía de clases.
Clases y objetos El Listado 1 corresponde a la defini-
Como su propio nombre ción de una clase simple en Object
denota, Object Pascal es Pascal. La palabra class es la que iden-
una versión del lenguaje tifica a esta porción de código, hasta
Pascal original pero orien- encontrar la palabra end, como una
tada a objetos. Esto signi- definición de clase. La que está defi-
fica que en Object Pascal niéndose se llamará TBeepButton, indi-
es posible definir clases de cándose que ésta será una derivada de
objetos, que serían los TButton, una clase ya existente. No se
moldes a partir de los cua- preocupe en este momento por com-
les, posteriormente, se prender todos los elementos de ese
c r e arían copias de ese código, lo importante es que le resulte
objeto. Existen multitud de familiar la construcción. En este caso
clases predefinidas, dispo- concreto, lo único que se hace es aña-
nibles para ser usadas por dir una propiedad, llamada Beep, de
nosotros. Utilizando la tipo Boolean, por lo que tan sólo podrá
clase TButton, por ejemplo, tomar los valores True y False.
podemos crear tantos obje- Como iremos viendo en ésta y futu-
tos de tipo botón como ras entregas, hay clases predefinidas,
deseemos o necesitemos. que se generan mediante asistentes y
Hágase a la idea de que otras que podemos escribir nosotros
la clase es un molde de manualmente. Prácticamente todos los
madera o metal, mientras elementos que usamos en una aplica-
que el objeto es lo que se ción Delphi: el formulario, los boto-
obtiene al verter la esca- nes, cajas de texto, etc., son objetos,
yola en ese molde. Lógica- es decir, elementos obtenidos a partir
mente, puede usar el de una definición de una clase.
ción, consiste en ver código, analizarlo mismo molde para crear tantos objetos
y modificarlo. Es el sistema que todos como quiera. Posteriormente, utili- Propiedades
hemos empleado de niños, para apren- zando pinturas y otros tratamientos, En la analogía usada anteriormente,
der el idioma que hablamos: oyendo, puede diferenciar cada objeto de los en que se comparaba una clase con
repitiendo y analizando. Posterior- demás, aunque, básicamente, todos un molde para escayola, decíamos
mente, cuando sepamos defendernos ellos son similares puesto que han que los objetos obtenidos a partir del
con él, tendremos ocasión de conocer salido del mismo molde. molde, todos exactamente iguales,
la sintaxis general y teórica. En Object Pascal las clases pueden podían personalizarse de diferentes
Pascal es un lenguaje originalmente heredar unas de otras, pueden deri- formas. Es posible, por ejemplo, pintar
pensado para la educación, lo cual, varse clases nuevas de otras que ya toda la figura de un cierto color, aña-
indudablemente, influyó en su estilo, existen. Suponga que tiene un molde dirle ornamentos, vestirla, etc.
muy claro y fácil de entender, espe- ya hecho y que, partiendo de él, cons- Los objetos que se crean a partir de
cialmente para los anglo-parlantes. En truye otro más complejo, que tiene los una clase, como TBeepButton, también
Pascal existen variables, constantes, elementos del anterior más otros nue- son todos idénticos. Si esto quedase
bucles y funciones, como en cualquier vos que ha añadido posteriormente. así, lógicamente, no serían objetos
otro lenguaje actual. Básicamente, lo que ha hecho es deri- muy útiles. Imagine para qué puede
Los elementos esenciales del len- var un molde de otro, heredando en servir la clase TButton si todos los boto-
guaje no son muchos, más allá de las el nuevo las características del anti- nes tienen siempre las mismas dimen-
estructuras de control y manipulación guo. Esta técnica, que en Object Pas- siones, el mismo título, tipo de letra,
de datos más o menos simples. El cal se utiliza continuamente, permite etc. Los objetos creados a partir de
resto de las operaciones se efectúan crear clases muy complejas, derivando clases, obviamente, también pueden

PC World Enero 2000 ◆ 297


PRÁCTICO

Dispon-
manera similar a como se usa una
memos
variable cualquiera. Es decir, pode-
de distin-
mos leer el contenido de una propie-
tos asis-
dad, por ejemplo para saber las
tentes
dimensiones de un botón, así como
para
asignarle un valor, por ejemplo para
generar
modificar el título. Existen, no obs-
las con-
tante, propiedades que no pueden
sultas
ser escritas, tan sólo leídas.
SQL de
forma
Métodos
cómoda y
Además de propiedades, en las clases
visual.
también se definen métodos, que
actuarán sobre los objetos creados a
partir de dicha clase. Sintácticamente
hablando, un método es similar a una
función o un procedimiento cual-
quiera, con la salvedad de que actúa
no de forma general, sino sobre un
cierto objeto de la clase
ser personalizados, aunque usando a la que pertenece.
elementos algo menos tangibles que la Suponga que su
pintura o una prenda de vestir. molde, anteriormente
La personalización de un objeto se para figuras de esca-
efectúa, en Delphi, a través de sus pro- yola, se convierte en
piedades. Éstas son elementos expues- algo más avanzado, per-
tos por el componente a fin de que el mitiéndole crear figuras
programador pueda personalizarlo, que cuentan con diver-
estableciendo colores, dimensiones, sos pulsadores y dispo-
títulos, enlaces a bases de datos, cone- sitivos electro-mecáni-
xiones con servidores, etc. Al igual cos o electrónicos. Al
que otros elementos, van heredándose El deposito de Delphi permite iniciar el desarrollo de distintos
pulsar sobre el botón
de unas clases a otras. Nuestra clase elementos: apliucaciones, componentes, recursos, etc.
titulado Rie, el muñeco
TBeepButton , por tanto, contará con se ríe, y al hacerlo sobre
todas las propiedades que ya existían Desde nuestro punto de vista, el el botón Habla, la figura dice algunas
en TButton, aparte de la propiedad Beep usuario de los objetos para crear apli- palabras. Esto ocurre, lógicamente,
propia. caciones, una propiedad se utiliza de con el muñeco cuyos pulsadores está

Clases, objetos, componentes y manipulado visualmente en un entorno de desarrollo, en una fase


controles previa a la ejecución, entonces estamos hablando de un compo-
Son estos cuatro términos que tienden a confundirse y utilizarse de nente. Los componentes VCL, por ejemplo, pueden ser insertados en
manera indistinta, aunque realmente, en la terminología propia de un contenedor con una operación de arrastrar y soltar, estableciendo
los lenguajes orientados a objetos y, en particular, la de Delphi, no sus propiedades y eventos también visualmente, mediante el Inspec-
significan lo mismo. tor de objetos. Si el objeto no es un componente, sus métodos, pro-
La diferencia entre una clase y un objeto, tras las explicaciones piedades y eventos estarán accesibles tan sólo en ejecución,
dadas en esta entrega, han quedado bastante claras. Una clase es mediante código.
una definición, con la que se describen los miembros y características Los controles, por último, son aquellos componentes que cuentan
que tendrán los objetos. Un objeto es una copia, también llamada con una interfaz de usuario. Son lo que podríamos llamar compo-
instancia, de una clase. Todo elemento creado a partir de una clase nentes visuales, ya que el usuario del programa podrá verlos y, en
es, por definición, un objeto. Éste puede estar compuesto sólo de ocasiones, interactuar con ellos. En el ejemplo utilizado en la entrega
métodos, disponer también de propiedades y quizá de eventos. Nin- previa, todos los componentes usados son controles. Existen, no
guna de las tres categorías de miembros, no obstante, es obligatoria. obstante, componentes que efectúan otras tareas que no requieren
Cuando un objeto dispone de los elementos necesarios para ser contar con una parte de interfaz.

◆ 298 PC World Enero 2000


PRÁCTICO

des y los métodos, la componen los


eventos. Un evento es una señal gene-
rada por el objeto, ante un suceso con-
creto, y que nuestra aplicación puede
aprovechar para ejecutar alguna
acción. Dicho suceso puede ser
externo, como la pulsación de una
tecla en el teclado o el desplazamiento
del ratón, o bien interno, como la
recepción de una señal por parte del
sistema operativo.
Para terminar con nuestros moldes y
nuestras figuras, últimamente muy
avanzadas tecnológicamente hablando,
añadámosles un elemento más. Ade-
más de los pulsadores que actúan
como métodos, haciendo que la figura
hable o se ría a demanda del usuario,
ahora vamos a añadir unos sensores
de temperatura. De esta forma, cuando
la temperatura sea inferior o supere
una determinada marca, el muñeco
Las propiedades de los objetos se definen en el cuadro a tal efecto, mientras que los métodos se escriben en emitirá directamente un mensaje, tem-
el listado de código. blará o sudará. Estas acciones, que el
usuario de la figura puede atender o

Listado 1. Definición de Listado 2. Definición de Listado 3. Definición de


la clase TBeepButton en clase correspondiente a la clase asociada al
Object Pascal un formulario vacío formulario tras añadir
los componentes
TBeepBoton = class(TButton) TForm1 = class(TForm)
private private TForm1 = class(TForm)
FBeep: Boolean; { Private declarations } Label1: TLabel;
published public Edit1: TEdit;
property Beep: Boolean read FBeep write FBeep; { Public declarations } Button1: TButton;
end; end; private
{ Private declarations }
public
utilizando, es decir, no se ríe otro nado objeto, sobre el que actuarán { Public declarations }
muñeco distinto a aquél sobre el que según proceda. end;
ha pulsado. De la misma forma, tam- Al igual que las propiedades, y cual-
poco tiene sentido la existencia del quier otro elemento perteneciente a
botón Rie por sí solo, tiene que existir una clase, los métodos se heredan de ignorar, serían los eventos. Si somos
una figura que pueda reírse. unas clases a otras. La clase TBeepBut- considerados, abrigaremos o refresca-
Los métodos de una clase son com- ton del Listado 1, por tanto, dispondrá remos nuestro muñeco respondiendo
parables a los pulsadores de las figu- de todos los métodos que existieran al evento.
ras. Como se ha dicho antes, se codi- en la clase TButton. Los eventos que puede generar un
fican y usan de manera similar a las objeto tienen nombre, al igual que las
funciones, pero a diferencia de éstas, Eventos propiedades y métodos. No obstante,
los métodos no existen por sí solos, La tercera categoría de miembros de no puede llamárseles, ya que no están
sino siempre asociados a un determi- una clase, mencionadas las propieda- diseñados para ello. Nosotros pode-

LOS COMPONENTES QUE ENCONTRAMOS en la Paleta de Delphi son objetos, creados

a partir de clases predefinidas en la VCL, la librería de componentes visuales

◆ 300 PC World Enero 2000


PRÁCTICO

Los modulos
mos indicar al objeto que ejecute un
web se
determinado procedimiento cuando se
manejan de la
produzca un cierto evento, atendién-
misma forma
dole como proceda. Al pulsar un
que cualquier
botón del ratón sobre una ventana,
otro objeto, a
por ejemplo, podríamos abrir un menú
través del
emergente.
inspector.
En el programa utilizado como ejem-
plo en la entrega previa, aprovechába-
mos el evento OnClick del botón, que se detrás de los dos puntos, TLabel, TEdit y
produce al pulsarlo, para mostrar un Listado 4. Versión final TButton, respectivamente. Cada uno de
mensaje en la pantalla. De forma aná- de la definición de la estos miembros es un objeto que, a su
loga, podríamos controlar cada una de clase TForm1 vez, cuentan con sus características pro-
las pulsaciones de teclas sobre un pias.
campo de edición, la recepción de TForm1 = class(TForm) Por último, haga doble clic sobre el
información por la red o la selección de botón para gestionar el evento OnClick y
Label1: TLabel;
un elemento en una lista. mostrar el mensaje. A la definición de la
Edit1: TEdit;
clase se añade un elemento más, la defi-
Button1: TButton;
Definición visual de clases nición de un método en el que escribi-
No todas las clases se definen escri- procedure Button1Click(Sender: TObject); remos el código que deberá ejecutarse
biendo código, en ocasiones dicha defi- private cuando se genere el mencionado
nición es generada por Delphi a partir { Private declarations } evento. Finalmente, la definición de la
de las operaciones de diseño efectuadas public clase queda como se muestra en el Lis-
por nosotros. Esto es lo que ocurre, por { Public declarations } tado 4.
ejemplo, cuando usamos una ficha para end; La clase TForm1, en este momento, ya
definir el aspecto de nuestras ventanas. no es igual a TForm. Hereda toda la fun-
A medida que se incluyen componentes cionalidad de ésta pero, además, añade
y gestionan eventos, Delphi genera algunos elementos adicionales. Se ha
automáticamente una definición de Listado 5. Código creado una clase derivando de otra,
clase que describe a esa ficha. correspondiente al TForm es la clase base y TForm1 la deri-
Repitamos los pasos dados en la módulo de proyecto vada. Como ha podido ver, la definición
entrega previa a la hora de crear nuestra de esta nueva clase se ha efectuado de
primera aplicación con Delphi. program EmisorSaludos; manera visual, sin necesidad de escribir
Comience por iniciar un nuevo pro- uses código.
yecto. Pulse F12 para acceder al Editor Forms,
de código, encontrará una definición de Formulario in ‘Formulario.pas’ {Form1}; El objeto Application
clase como la del Listado 2. Todos los Llegados a este punto, en nuestro pro-
formularios, el elemento visual que yecto contamos con una nueva clase,
{$R *.RES}
nosotros vemos como una ventana, son llamada Form1, que contiene los elemen-
objetos de la clase TForm o alguna deri- tos y el código asociado para que al
vada de ésta. Cuando diseñamos un begin pulsar el botón se muestre un mensaje
nuevo formulario, indirectamente esta- Application.Initialize; de saludo. Sin embargo, en ningún
mos definiendo una nueva clase que, en Application.CreateForm(TForm1, Form1); punto creamos un objeto a partir de esa
principio, no añade nada a lo que Application.Run; clase, ni indicamos a Windows que
hereda de TForm. En este momento, por end. muestre la ventana para poder actuar
tanto, tendríamos una clase: TForm1, idén- sobre ella. Estas acciones, y otras
tica funcionalmente a TForm. muchas, quedan en manos del objeto
Añada ahora la etiqueta de texto, el ahora encuentra el código mostrado en Application.
campo de edición y el botón, los tres el Listado 3. La clase TForm1 cuenta con Cada vez que se inicia un nuevo pro-
elementos que había en la ventana, tres miembros que no existen en TForm. yecto en Delphi, éste crea un módulo
abriendo de nuevo al Editor de código. Éstos son tres variables, llamadas Label1, de código, no visible en principio, que
La definición de la clase ha cambiado, y Edit1 y Button1, cuyos tipos se indican contiene el código por donde comienza

LOS FORMULARIOS SON OBJETOS creados a partir de clases que se definen

visualmente, a medida que colocamos componentes sobre la ficha

◆ 302 PC World Enero 2000


PRÁCTICO

la ejecución de la aplicación. Puede acceder a dicho


módulo mediante la opción View Source del menú Project
de Delphi. En el caso de nuestro programa de ejemplo,
el contenido de este módulo será similar al del Listado
5.
Este módulo, a diferencia del asociado al formulario,
no comienza con la palabra unit en su cabecera, sino
con la palabra program. Esto es lo que le diferencia de
cualquier otro módulo, indicando que es el punto de
inicio del programa. El código escrito entre las palabras
begin y end de este módulo, por tanto, será lo que eje-
cute Windows al poner en marcha al programa.
Como puede ver en el Listado 5, el código a ejecutar
se compone tan sólo de tres sentencias, en las que
repetidamente se usa un objeto
llamado Application. Éste está cre-
ado a partir de la clase TApplica- MEDIANTE LAS
tion, predefinida en la VCL. Los
objetos de esta clase son capaces propiedades
de controlar la ejecución de una
aplicación. Por ello, como es podemos
lógico, tan sólo puede existir un
objeto en cada proyecto. Lo que
personalizar un
se hace es llamar a tres métodos
de ese objeto, inicializando la
aplicación, creando un objeto de objeto,
la clase TForm1 (nuestro formula-
rio) y poniendo en marcha la modificando
visualización, recepción de men-
sajes y su procesamiento. atributos con el

Visto y por ver fin de adaptarlo


Esta tercera entrega, básicamente
teórica, nos ha servido para com- a nuestras
prender mejor cómo funcionan
nuestros proyectos creados con
necesidades
Delphi. Sabemos que dichos
proyectos cuentan con un
objeto, creado a partir de la clase concretas
TApplication, que se encarga de
las tareas de inicialización, crear
los formularios y poner el programa en marcha. Tam-
bién sabemos que los formularios son objetos creados
a partir de clases que, derivadas de TForm, se definen
visualmente, a medida que insertamos componentes.
Los componentes, que son objetos manipulables
durante la fase de diseño, cuentan con propiedades,
métodos y eventos, las tres categorías de miembros
fundamentales.
Con la base adquirida hasta ahora, en futuras entregas
nos centraremos en el trabajo con algunos componen-
tes, conceptos de Object Pascal, manipulación de pro-
piedades y gestión de eventos. Nuestro objetivo: dise-
ñar aplicaciones con un mínimo de utilidad práctica. ◆

Francisco Charte es profesor de informática. Autor


de diferentes libros sobre lenguajes y sistemas de infor-
mación. .

PC World Enero 2000


PRÁCTICO

Programación con Delphi (IV)

Controles de uso habitual


y sus miembros básicos
Francisco Charte Ojeda
charte@pcw.idg.es

A
l hablar de los componentes de Delphi, hay que tener en cuenta que no
estamos hablando más que de clases a partir de las cuales pueden crearse
objetos, según se describió en la entrega previa. Esas clases, además, no son
independientes, sino que se derivan unas de otras. Esto tiene para nosotros, que
somos los usuarios de los componentes, una ventaja fundamental: la mayoría de
ellos cuentan con muchas características comunes.
La posición de un componente en el interior del contenedor donde está alojado,
por ejemplo, siempre se almacena en las propiedades Left y Top. Éstas están defi-
nidas en la clase TControl, de la cual derivan otras como TWinControl que, a su vez,
son la base de botones, cajas de texto, listas, etc. De forma análoga, existen méto-
dos como Show() y Hide() o eventos como OnClick generales a la mayoría de los con-
troles.
En esta cuarta entrega, va a tener oportunidad de conocer algunos de los contro-
les usados con más asiduidad en el diseño de interfaces de usuario con Delphi,
así como sus miembros más básicos: propiedades, métodos y eventos.

La edición empresarial de la última versión de Delphi, la 5, cuenta con más de


doscientos componentes de todo tipo. Existe un grupo, no obstante, que son de uso
habitual en la mayoría de las aplicaciones.
Contenedores de controles
Cuando uno se dispone a construir algo, pongamos por caso un automóvil, lo pri-
mero que hace es disponer los contenedores en los cuales se integrarán los
demás elementos, como el chasis, el salpicadero, hueco-motor, etc. Para crear una
interfaz de usuario ocurre más o menos lo mismo, aunque las posibilidades en
cuanto a flexibilidad son mucho más amplias.
Nuestro chasis o contenedor principal será el formulario, como ya vimos en la
segunda entrega. En el interior de éste es posible disponer otros contenedores,
elementos que tienen por finalidad alojar a otros controles. Esto se hace, general-
mente, para agrupar elementos funcionales o hacer más claro el diseño de la
interfaz.
Los dos contenedores usados más habitualmente se encuentran en la página
Standard de la Paleta de componentes, como puede verse en la Figura 1. En la
Figura 2 se muestra el aspecto de tres contenedores: un GroupBox, un Panel y el pro-
pio formulario. Observe que el GroupBox muestra el título en su parte superior
izquierda, el Panel en la parte central y el formulario en su barra de título. Inde-
pendientemente de esto, el texto mostrado como título siempre se almacena en la
misma propiedad: Caption. Puede comprobar, en el Inspector de objetos, que estos

◆ 302 PC World Febrero 2000


PRÁCTICO

todo el espacio disponible. En


la Figura 3 puede ver cinco
controles Panel. El primero de
ellos se ha insertado directa-
mente sobre un formulario,
dándose el valor alClient a su
propiedad Align para que
ocupe todo el espacio disponi-
ble. A continuación, dentro de
éste se han insertado otros
cuatro Panel , ajustando cada
uno de ellos a un extremo.
Todos los contenedores cuen-
tan con las propiedades Compo-
nentCount, ControlCount, Components
y Controls , que sirven para
saber cuántos componentes o
controles hay en el contene-
dor, facilitando el acceso indi-
vidual a cada uno de ellos
mediante un índice numérico.
De esta forma es posible efec-
tuar, durante la ejecución, ope-
raciones que afectan a múlti-
ples elementos de la interfaz
sin necesidad de hacer referen-
cia directa a cada uno de ellos.

Introducción de datos
Gran parte de la información
que se manipula habitualmente
en las aplicaciones, indepen-
dientemente de su tipo, debe
ser introducida o editada por el
usuario mediante el teclado.
Para facilitar esta tarea existen
diversos componentes, de los
cuales conocemos uno por
haberlo usado en la segunda
entrega de este curso. En la
Figura 4 se indican dos de los
componentes disponibles para
tres elementos cuentan con esa pro- Inicialmente, la posición de un con- este fin: Edit y Memo.
piedad, que puede modificar simple- tenedor dentro de otro vendrá deter- El control Edit, usado en el citado
mente introduciendo el texto que minada por sus propiedades Left y Top, ejemplo de la segunda entrega, se uti-
desee. mencionadas previamente. Asimismo, liza cuando el texto a introducir o edi-
Exceptuando el caso de los formula- las dimensiones se indicarán con las tar está contenido en una sola línea.
rios, que no pueden introducirse en propiedades Width y Height , ancho y La propiedad Text es la que almacena
otros contenedores, dentro de uno alto respectivamente. Una alternativa a el texto, pudiendo asignársele un
puede alojar cualquier control, inclui- estas cuatro propiedades, en el caso valor, para facilitar un texto inicial, así
dos otros contenedores. Dentro un de los contenedores, consiste en usar como leerlo, para recuperar el dato
Panel , por ejemplo, puede disponer la propiedad Align, que facilita la ali- introducido por el usuario.
varios Panel más para crear varias divi- neación del control a uno de los már- A diferencia del anterior, el control
siones. genes del mismo, o bien ocupando Memo está preparado para contener

PC World Febrero 2000 ◆ 303


PRÁCTICO

se quiere dar al usuario a elegir entre


varias opciones. El primero se usa
cuando la respuesta puede ser sólo sí
o no, al tratarse de un control sobre el
que el usuario puede simplemente
pulsar para activar o desactivar. Un
caso típico sería la respuesta a la pre-
gunta “¿tiene hijos?”, que sólo puede
Figura 1. En la página Standard de la Paleta de componentes podemos encontrar dos de los contenedores
ser contestada con un sí o un no.
con que cuenta Delphi.
Mediante el control RadioButton, que se
utiliza habitualmente for-
múltiples líneas de texto, facili- mando grupos, podríamos
tando al usuario el desplaza- plantear cuestiones con más
miento y la edición. Las líneas posibilidades. Planteemos la
de texto se almacenan en la pregunta “¿Cuál es su estado
propiedad Lines, que se caracte- civil?”. En este caso las res-
riza por ser una lista en la cual puestas son varias, pudiendo
cada línea de texto está identifi- elegirse sólo una de ellas
cada por un índice numérico. puesto que no puede estarse
No obstante, también existe la Figura 2. Aspecto que tienen los controles GroupBox y Panel al ser casado y soltero al tiempo,
propiedad Text , como en el insertados en un formulario. por poner un ejemplo. Por
caso del control Edit , que cada respuesta posible se
puede utilizarse para asignar o insertaría un RadioButton, que el
recuperar todo el texto, en usuario podrá seleccionar sim-
lugar de líneas concretas. plemente haciendo clic sobre
Aparte de la propiedad Text, él. Esta acción, además, desac-
estos dos controles comparten tivará la opción que existiese
muchas otras características. La anteriormente elegida.
entrada de texto puede contro- Ambos controles, al igual
larse gestionando el evento que otros muchos, disponen
OnKeyPress, generado con cada de la propiedad Caption, que
Figura 3. Mediante la propiedad Align es posible alinear unos
pulsación de tecla. Es posible nos servirá para establecer un
contenedores dentro de otros, creando espacios independientes para
usar las habituales combinacio- título que, generalmente, será
agrupar los elementos de la interfaz.
nes de tecla para copiar, cortar la pregunta u opción que el
y pegar texto, existiendo ade- usuario puede elegir. Además,
más varios métodos para efectuar esas Selección de opciones ambos disponen también de la propie-
mismas operaciones desde programa. En ocasiones, los datos que precisa dad Checked, que sólo puede ser True o
Para mostrar un texto ya conocemos una aplicación pueden ser facilitados False, según que la opción haya sido
el control Label, que en lugar de la pro- por el usuario mediante medios alter- elegida o no.
piedad Text dispone de la propiedad nativos al uso del teclado. Suponga
Caption , como los contenedores que que dicho usuario debe rellenar un Estado y visibilidad de los
hemos conocido en el punto previo. formulario con datos como el estado controles
Edit y Memo, no obstante, también pue- civil, sexo, si tiene automóvil, vivienda Aparte de todas las propiedades men-
den ser usados para mostrar un texto propia, etc. La mayoría de estas cues- cionadas en los puntos anteriores,
sin permitir su edición, simplemente tiones tienen sólo unas pocas respues- muchas de ellas comunes a un grupo
dando el valor True a la propiedad Rea- tas posibles, en ocasiones tan sólo dos: de controles, existen otras genéricas,
dOnly. Esta propiedad, que inicialmente sí o no. que afectan a todos ellos, y que rigen
tiene el valor False, indica si el conte- Los dos controles indicados en la el estado en el que se encuentran y su
nido del control puede o no ser modi- Figura 5, conocidos como CheckBox y visibilidad.
ficado. RadioButton, son los más usados cuando Un componente puede encontrarse

LOS CONTROLES CONTENEDORES son capaces de alojar en su interior otros

controles. Éstos se ven afectados por el estado y la visibilidad del contenedor,

activándose, desactivándose, ocultándose y mostrándose de forma solidaria

◆ 304 PC World Febrero 2000


PRÁCTICO

Listado 1 Código del


programa de ejemplo

// Al cambiarse el texto del Edit1


procedure TForm1.Edit1Change(Sender: TObject);
begin
Caption := Edit1.Text; // asignarlo al título de la
ficha
Figura 4. Los controles Edit y Memo, usados para facilitar la edición de texto, también se encuentran en la end;
página Standard, como todos los controles más habituales.
// Al pulsar sobre el CheckBox
procedure TForm1.CheckBox1Click(Sender: TObject);
begin // mostrar y ocultar el panel inferior
Panel1.Visible := CheckBox1.Checked;
end;

// Según el botón de radio que se pulse


procedure TForm1.RadioButton1Click(Sender: TObject);
begin
Figura 5. Existen controles para mostrar al usuario una serie de opciones entre las que elegir, en lugar de BorderStyle := bsNone; // establecer un tipo
tener que introducir un texto. end;

procedure TForm1.RadioButton2Click(Sender: TObject);


estarlo, o de ser visibles
begin
a no serlo, es algo que
BorderStyle := bsSingle; // u otro de borde
dependerá de la propia
end;
funcionalidad de la
aplicación que se desa-
procedure TForm1.RadioButton3Click(Sender: TObject);
rrolle. Dicho de otra
begin
manera: no hay una
BorderStyle := bsSizeable; // para la ficha
norma que nos indique
end;
cuándo debemos dar el
valor True o False a las
// Controlar cada pulsación de tecla en el Memo
Figura 6. Aspecto del formulario que diseñaremos para probar el citadas propiedades Ena-
procedure TForm1.Memo1KeyPress(Sender: TObject;
funcionamiento de algunos de los controles conocidos. bled y Visible.
var Key: Char);
begin
activo o desactivado, según lo cual el Eventos genéricos
if Key In [‘0’..’9’] then // si es un dígito numérico
usuario podrá o no interactuar con él y, Todos los controles que hemos cono-
Key := #0; // no permitirlo
además, aparecerá con una apariencia cido, por el hecho de estar directa o
end;
u otra en pantalla. Para conocer y indirectamente derivados de la clase
modificar el estado se usa la propiedad TControl , cuentan con una serie de
Enabled que, al igual que Checked y eventos genéricos, como OnClick, OnDbl-
muchas otras, tan sólo puede contener Click, OnMouseDown, OnMouseUp u OnMouseMove. Además de los anteriores, los contro-
los valores True o False, al tratarse de El primero de ellos, que es el evento les que trabajan con texto, como Edit y
una propiedad de tipo Boolean. más usado, se produce al pulsar sobre Memo, cuentan con otros eventos adicio-
A diferencia de los componentes físi- un control, generalmente utilizando el nales relacionados con el teclado. El
cos, como las piezas de un motor o los ratón. Los otros cuatro tienen lugar al más representativo sería OnKeyPress ,
ladrillos de una vivienda, los compo- efectuar un doble clic, pulsar un equivalente al OnClick, mientras que los
nentes software que usamos en Delphi botón, liberarlo y mover el ratón, res- eventos OnKeyDown y OnKeyUp serían simila-
pueden aparecer y desaparecer a pectivamente. res a OnMouseDown y OnMouseUp, si bien en
voluntad, es decir, pueden hacerse invi- Podemos saber, por tanto, cuándo el este caso indican la pulsación de una
sibles. La visibilidad la controlaremos puntero del ratón está desplazándose tecla en el teclado, y no de un botón
mediante la propiedad Visible, que es sobre un Panel o si se ha pulsado en del ratón.
también de tipo Boolean. Inicialmente, un CheckBox cambiando su estado. Son Aprovechando el evento OnKeyPress es
dicha propiedad siempre tiene el valor eventos que pueden desencadenar una posible, por ejemplo, controlar la
True. cierta acción, por ejemplo cambiando introducción de un dato en un control
Que los componentes cambien de el estado de un elemento según que el Edit , limitando los caracteres, reali-
estado, pasando de estar activos a no CheckBox esté seleccionado o no. zando conversiones, etc.

◆ 306 PC World Febrero 2000


PRÁCTICO

MUCHOS DE LOS CONTROLES de Delphi, como el formulario, las etiquetas de texto,

grupos, paneles, cajas de selección y botones de radio, disponen de una propiedad

llamada Caption , mediante la cual puede establecerse un título visible que

acompañará al control

Un caso práctico El panel que hay en la parte inferior elementos que conocerá en la próxima
En este artículo hemos conocido tres podrá estar visible, como lo está ini- entrega de este curso. Lo que se hace
contenedores, dos controles para intro- cialmente, u oculto, dependiendo de es comprobar si el parámetro Key, que
ducir texto, otros dos para facilitar la que el CheckBox que hemos dispuesto contiene el carácter pulsado, almacena
selección de opciones, un buen grupo en la parte superior izquierda esté o un dígito entre 0 y 9 y, de ser así, anu-
de propiedades y algunos eventos. La no marcado. Tendremos, por tanto, larlo asignando al mismo parámetro el
mejor forma de saber cuándo y cómo que controlar la pulsación sobre el código #0.
utilizar estos elementos, consiste en CheckBox, alterando la propiedad Visible
introducirlos en un formulario, modifi- del Panel. Puesto que la etiqueta de Visto y por ver
car propiedades, escribir código y, en texto y el Edit se han insertado en el Al finalizar esta cuarta entrega, ya
resumen, hacer pruebas. Comenzare- interior del Panel, al ocultar éste tam- conocemos el entorno de Delphi, sabe-
mos proponiendo un ejemplo relativa- bién se ocultarán aquellos. mos cómo crear interfaces de usuario
mente sencillo, que le sirva como Los botones de radio servirán para insertando y personalizando compo-
punto de partida para continuar con su modificar el tipo de borde de la ven- nentes, cómo escribir código y cómo
exploración hasta el próximo número. tana, entre tres opciones posibles. El ejecutar nuestro programa. También
Usando la técnica de arrastrar y sol- control Memo , por último, podemos sabemos algo acerca de los controles
tar, diseñaremos un formulario similar usarlo para introducir texto, compro- más básicos, y tenemos unos conoci-
al que puede verse en la Figura 6. bar cómo podemos copiar, cortar y mientos generales sobre clases, obje-
Hemos insertado un Panel en la parte pegar, etc. Este control tendrá una tos, propiedades, métodos, eventos y
inferior, con un Label y un Edit en su característica especial, y es que no per- otros conceptos relativos a Object
interior. En la parte izquierda de la mitirá la introducción de dígitos numé- Pascal. En la próxima entrega conoce-
ficha tenemos un CheckBox y un GroupBox ricos. Con este fin, controlaremos el remos algunos de los tipos de datos
con tres botones de radio, mientras evento OnKeyPress comprobando qué de Object Pascal, haciendo especial
que a la derecha otro GroupBox sirve carácter es el que se ha pulsado, anu- hincapié en los más específicos, como
como delimitador para un control Memo. lándolo en caso de ser un dígito numé- los conjuntos y enumeraciones. Tam-
No hemos modificado los nombres de rico. bién tendremos ocasión de aprender
ningún control, dejando los que asigna El código, como puede verse en el las construcciones de control más
Delphi por defecto para poder seguir Listado 1, es bastante sencillo, consis- básicas. ◆
mejor el ejemplo. En la práctica, no tiendo básicamente sólo en algunas
obstante, lo habitual es asignar un asignaciones. En el evento OnKeyPress Francisco Charte es profesor de infor-
nombre lógico y descriptivo a cada del Memo se ha usado un condicional, un mática. Autor de diferentes libros sobre
elemento. conjunto y un código de carácter. Son lenguajes y sistemas de información.
PRÁCTICO CURSO

Programación con Delphi (V)


Introducción informal
a Object Pascal
Francisco Charte Ojeda charte@pcw.idg.es

D esde que Niklaus Wirth


lo crease a finales de los sesenta,
Pascal ha sido uno de los lengua-
jes más importantes en el ámbito
informático, tanto en número de
usuarios como en las influencias
que ha tenido sobre otros. Como
se apuntaba al inicio de la pri-
tiempo, Object Pascal posee prác-
ticamente las mismas posibilida-
des que dichos lenguajes, y el
código objeto generado por Delphi
a partir de código fuente Object
Pascal es comparable en eficien-
cia.
En las entregas previas ha
mera entrega de este curso, aun- tenido ocasión de conocer algu-
que Pascal fue creado, inicial- nos de los elementos fundamen-
mente, como una herramienta tales de Object Pascal, sobre todo
académica, la aparición de herra- los que tienen que ver con las cla-
mientas como Turbo Pascal lo ses de objetos y su uso. Para
pusieron al mismo nivel que C. Lo poder crear aplicaciones con
mejor de Object Pascal, una ver- Delphi, no obstante, eso no es
sión avanzada y orientada a obje- suficiente. Es necesario, además,
tos del Pascal original, es que saber cómo podemos manipular
ofrece una claridad y elegancia en los datos, almacenándolos en
el código que otros lenguajes, variables y efectuando operacio-
como C o C++, no tienen. Al nes. También es preciso conocer

PCW
346
Una de las
características
de Delphi que
más gusta a sus
usuarios, los
desarrolladores,
es el lenguaje en
que está basado:
Object Pascal.
En esta penúltima
entrega
conocemos las
bases de este
lenguaje.

de uno o varios módulos de


código que, básicamente,
siempre tienen la misma
estructura general. Uno de
esos módulos, el único
imprescindible, contendrá
el código de entrada a la
aplicación, mientras que
los demás pueden almace-
nar definiciones de funcio-
las estructuras de control básicas de las que tiene esta revista para nes y procedimientos, clases de
para poder tomar decisiones, poder estudiarlo y, de hecho, hay objetos y otros elementos.
repetir procesos, etc. libros completos dedicados Los módulos de código Object
Lógicamente, en esta entrega lo exclusivamente a Pascal y Object Pascal cuentan con una cabecera
único que se persigue es efectuar Pascal. que se inicia con la palabra pro-
una introducción a Object Pascal gram o unit, seguida del nombre
de manera totalmente informal. Estructura general de una aplicación del módulo. Al trabajar con
Este lenguaje es tan rico, que Las aplicaciones escritas con Delphi, el nombre de cada uno se
harían falta muchas más páginas Object Pascal pueden componerse establece automáticamente, en el

PCW
347
PRÁCTICO

momento en que éste es guar- Un proyecto escrito ría de las aplicaciones tienen que
dado. Tan sólo puede existir un manipular datos obtenidos de
módulo con el encabezado program,
con Object Pascal se fuentes externas: el teclado,
mientras que puede haber nin- compone siempre de archivos en disco, una red, etc.
guno, uno o varios módulos con el uno o varios módulos Para ello, dichos datos debe
encabezado unit. almacenarse temporalmente en
Cuando se ejecuta un programa
de código fuente, memoria, usando variables, y a
escrito con Object Pascal, el siendo el que se inicia continuación actuar como ope-
código al que se transfiere el con- con la cabecera program el randos, generalmente en expre-
trol es aquél delimitado por las siones aritméticas, relacionales y
palabras begin y end en el módulo
punto de entrada a la condicionales.
con el encabezado program. Dicho aplicación Como se ha apuntado antes, las
módulo es, como se decía antes, variables de un programa Object
el punto de entrada a toda apli- Pascal pueden tener ámbitos
cación. Su estructura general que esos elementos sólo pueden diferentes, según el lugar en que
será la mostrada en el Listado 1. usarse desde el interior de dichas se declaren. Si el punto de decla-
Observe que tras la cabecera funciones. ración es el cuerpo de una fun-
aparece una cláusula uses. Ésta En un proyecto desarrollado con ción, por ejemplo, tendremos
sirve para referenciar a otros Delphi el módulo principal, con el una variable local. En caso de
módulos que componen el pro- encabezado program, es el que con- que ésta deba ser compartida por
yecto, concretamente aquellos tiene el código de proyecto, en el varias funciones de un mismo
cuyo contenido va a ser usado que se referencian todos los módulo, lo normal es declararla
directamente al inicio del pro- módulos y se crean los formula- en la sección de implementación.
grama. rios. Otros elementos, como los Por último, tenemos el ámbito
La estructura del resto de los formularios y módulos de datos, público. Éste se obtiene al decla-
módulos será similar a la que tienen asociados módulos unit en rar la variable en la sección de
puede ver en el Listado 2. Cada los que se alojan las definiciones interfaz, consiguiendo así que
uno se divide en dos grandes par- de tipos y el código asociado a los sea accesible desde cualquier
tes: la interfaz y la implementa- eventos. punto del código del programa.
ción, delimitadas por las palabras En cualquier caso, la sección de
interface e implementation. La interfaz Manipulación de datos declaración de variables siempre
contiene los elementos que podrí- Para poder efectuar las funciones se inicia con la palabra var. De
amos considerar públicos y, por que se le encomiendan, la mayo- igual forma, la sintaxis para esa
tanto, pueden ser usados desde el
módulo principal o cualquier otro.
En esta sección suelen definirse
tipos de datos, clases de objetos y
variables. La sección de imple-
mentación, como de su propio
nombre puede deducirse, con-
tiene los detalles de implementa-
ción, es decir, métodos de objetos,
funciones, etc. Todos los elemen-
tos de esta sección quedan ocul-
tos, no siendo accesibles para el
resto de módulos del proyecto.
Los tipos, clases y variables
también pueden aparecer en la
sección de implementación, caso
éste en que sólo serán visibles
para ese módulo. Serán, por
tanto, elementos con un ámbito
no público. Por último, también
pueden incluirse algunos de esos
elementos, por ejemplo tipos y
variables, en el interior del
cuerpo de funciones y procedi-
mientos. Éste es el ámbito más Figura 1. Los tipos de datos en Object Pascal se estructuran en varias categorías, dando
reducido, conocido como local, ya lugar a esta pseudo-jerarquía.

PCW
348
PRÁCTICO

declaración es también siempre


program Project1;
idéntica, siguiendo el patrón varia-
ble: tipo; donde tipo determina la uses unit Unit2;
Unit1 in ‘Unit1.pas’ {Form1};
información que puede contener
esa variable. En el Listado 3 interface
begin var
puede ver diversas declaraciones // Sentencias a ejecutar iContadorGlobal: Integer;
de variables en varios ámbitos. //… implementation
La Figura 1 muestra una lista end. var
iContadorDeModulo: Integer;
jerárquica en la que se clasifican procedure ActualizaContador;
Listado 1. Estructura típica del módulo con
los distintos tipos existentes en var
el punto de entrada a la aplicación. iContadorLocal: Integer;
Object Pascal. begin
Las variables representan el Inc(iContadorGlobal);
Inc(iContadorDeModulo);
medio por el cual un programa unit Unit1;
Inc(iContadorLocal);
puede, al ejecutarse, almacenar interface end;
en memoria los datos que pre- end.

cise. Estos datos, lógicamente, uses


// Otros módulos
tendrán que manipularse, ope-
rando sobre ellos para obtener Listado 3. Módulo con tres variables
type
un resultado. Aquí es donde // Definición de tipos y clases
declaradas en ámbitos distintos.
entran en escena los operadores,
var
los elementos que permiten efec- // Definición de variables de esos valores. Por lo demás, es
tuar diversas acciones sobre los posible utilizar con una variable
implementation
operandos que serían los valores // Código de implementación
del nuevo tipo cualquier opera-
almacenados en las variables. dor habitual de Object Pascal.
Mediante los operadores puede end. En el Listado 4, por ejemplo,
efectuar operaciones aritméticas puede ver cómo se usa la función
Listado 2. Estructura general de un módu-
con valores numéricos, concate- succ() para obtener el valor
lo Object Pascal.
nar cadenas, analizar la relación siguiente a uno dado.
existente entre varios elementos, Los conjuntos, por su parte,
comprobar la existencia de un la definición del nuevo tipo, pue- son tipos estructurados y no
valor en un conjunto, etc. den declararse variables de ese ordinales, como las enumeracio-
tipo tratándolo como a cualquier nes. Un conjunto se define siem-
Definición de nuevos tipos otro de los existentes en el len- pre a partir de un tipo ordinal,
Aparte de los tipos básicos o guaje, sin diferencias aparentes. dando lugar a uno nuevo que
nativos del propio lenguaje, como Una enumeración, como su pro- puede contener ninguno, uno,
los números en diferentes preci- pio nombre indica, es un tipo de varios o todos los valores de ese
siones, las cadenas o los punte- dato en el que son posibles sólo tipo base. Observe el código del
ros, en Object Pascal el progra- una lista determinada de valores. Listado 5. En él se ha definido
mador puede definir sus propios En el Listado 4 puede ver un un conjunto, Set Of, partiendo de
tipos. Es posible definir conjun- ejemplo de definición. En este la enumeración TDiaSemana anterior.
tos, enumeraciones, subrangos, caso, el tipo TDiaSemana sería equiva- El resultado es un nuevo tipo,
registros y clases de objetos. Tras lente a Integer o Boolean, es decir, un llamado TDiasSemana , que puede
tipo ordinal. La diferencia es que estar vacío o contener cualquier
los límites de TDiaSemana no son true número de los elementos de TDia-
y false o 0 a 255, sino Lunes a Domingo. Semana . En dicho ejemplo puede
Una variable de tipo TDiaSemana, por ver, además, cómo se asigna a
tanto, sólo puede contener uno una variable un conjunto con tres

type
TDiaSemana = (Lunes, Martes, Miercoles, Jueves, Viernes, Sabado, Domingo);

var
Ayer, Hoy: TDiaSemana;

begin
Ayer := Jueves;
Hoy := succ(Ayer);

end;

Figura 2. Representación gráfica de una


estructura condicional clásica if-then-else. Listado 4. Definición de una enumeración y declaración de dos variables del nuevo tipo.

PCW
350
PRÁCTICO
Además de los tipos ras de control, siendo las más
de datos típicos importantes las estructuras con-
dicionales y las de repetición.
en otros lenguajes,
Una estructura condicional per-
como los enteros, mite optar por la ejecución de una
los decimales determinada porción de código
según unas condiciones que,
o las cadenas,
dependiendo de los casos, pueden
en Object Pascal ser más o menos complejas. La
existen estructura condicional más cono-
cida, existente en la mayoría de
otros más específicos:
los lenguajes imperativos, es la
conjuntos, subrangos, conocida if-then-else. Previamente,
enumeraciones en el ejemplo del Listado 5, ha
podido ver un ejemplo de uso de
y registros
esta estructura, concretamente
para mostrar un mensaje en pan-
talla sólo en caso de que se dé
Figura 3. Representación gráfica de un
cutarse secuencialmente, desde la una condición: que un conjunto
bucle típico con comprobación condicional
al inicio.
primera sentencia hasta la contenga el elemento Miercoles.
última, con cada inicio de la apli- La Figura 2 representa la estruc-
días, y cómo se usa a continua- cación por parte del usuario. tura típica de una sentencia con-
ción el operador in para compro- Dependiendo de las acciones de dicional con todas sus partes. En
bar la existencia de un determi- éste y los datos a tratar, es habi- un determinado punto, el flujo del
nado elemento en ese conjunto. tual optar por la ejecución de un programa llega a la sentencia if y
Al igual que los conjuntos, tam- código u otro, o bien repetir el analiza la expresión condicional
bién los registros forman parte de mismo código mientras se dé una que le acompaña. Si ésta se cum-
los tipos estructurados. Un regis- cierta condición. Para poder dise- ple, lo que equivale a decir que el
tro, conocido como estructura en ñar ese tipo de construcciones resultado devuelto es true, se eje-
otros lenguajes, está compuesto contamos con diversas estructu- cutará la sentencia que sigue a la
de varios miembros o elementos, palabra then. En caso contrario, la
que pueden ser, a su vez, de cual- sentencia ejecutada será la que
type
quier tipo. En el Listado 6 puede TDiasSemana = Set Of TDiaSemana; sigue a la palabra else. En lugar de
ver cómo se define un registro una sola sentencia, ambas partes
var
simple, compuesto de tres miem- Citas: TDiasSemana;
pueden ser un bloque de código
bros de tipos diferentes: un TDiaSe- delimitado por las palabras begin y
mana, un TTime y una cadena. Defi- begin end.
Citas := [Martes, Miercoles, Viernes];
nido el nuevo tipo, declarar una if Miercoles in Citas then Una alternativa a esta conocida
variable es algo tan simple como ShowMessage(‘Sí tienes cita’); construcción condicional, útil
en los casos anteriores. Por end; sobre todo cuando quieren com-
último, a la hora de acceder a probarse varias expresiones con
esta variable, hay que tener en Listado 5. Definición de un conjunto y uso
un operando común, es la senten-
cuenta que contiene varios ele- del operador In para comprobar la existen-
cia case. Ésta deberá ir seguida del
mentos, por lo que es preciso cia de un elemento. operando común, al que se
especificar su nombre. conoce generalmente como selec-
Por último, y al igual que en la type tor, y la palabra of. Entre esta
mayoría de los lenguajes actuales, TCita = record apertura y el final del bloque, deli-
Dia: TDiaSemana;
Object Pascal permite declarar Hora: TTime; mitado por la palabra end, podre-
matrices de cualquier tipo de Nombre: String; mos introducir cuantos valores
end;
dato, facilitando la creación de lis- deseemos comparar con el selec-
tas, tablas y estructuras más var tor. El resultado es una construc-
Cita: TCita;
complejas. Estas estructuras, ción como la del Listado 7, en la
además, pueden ajustar su begin que se ejecutan diferentes senten-
tamaño dinámicamente durante Cita.Dia := Martes; cias dependiendo del valor de la
Cita.Hora := StrToTime(‘12:30’);
la ejecución del programa. Cita.Nombre := ‘Francisco Charte’; variable Hoy. Si el valor de dicha
variable es Lunes se muestra un
end;
Estructuras condicionales mensaje, si es cualquier día entre
El código de un programa no está, Listado 6. Definición de un registro y pos-
Martes y Jueves otro distinto, etc.
generalmente, pensado para eje- terior uso para declarar una variable. Observe la sintaxis utilizada para

PCW
351
PRÁCTICO

crear un subrango de valores. Las estructuras de bucle no pueda controlarse


mediante un contador, porque
control, ya sean
Estructuras repetitivas no exista un incremento o decre-
Como se apuntaba al inicio del condicionales o de mento predeterminado, es posi-
punto anterior, además de las repetición, son ble usar las sentencias while..do y
condicionales también existen repeat..until . La única diferencia
básicas.
estructuras repetitivas que per- entre ambas es que el condicio-
miten ejecutar más de una vez el Ellas, junto con los nal que controla el bucle, una
mismo código. A estas estructu- operadores del expresión que devolverá true o
ras se las conoce habitualmente false, con while se dispone al inicio
lenguaje, son las que
como bucles. Clásicamente han y causa la salida con el valor
existido siempre dos categorías nos permitirán false , mientras que con repeat el
de bucles: por contador y por codificar la lógica condicional se codifica al final
condición. En la primera catego- del bucle y éste finaliza con el
de nuestras
ría entran aquellos cuya ejecu- valor true.
ción se rige por el valor de una aplicaciones
variable que, a cada ciclo, se Visto y por ver
incrementa o decrementa hasta Si a lo cubierto en esta entrega,
llegar a un determinado límite. una variable. Éste toma un valor dedicada monográficamente a
En realidad, dicha categoría es inicial que, posteriormente, va Object Pascal, sumamos las
simplemente un caso particular incrementándose o decremen- cuatro entregas anteriores, nos
de los bucles por condición que, tándose con cada ciclo. El valor daremos cuenta que ya conoce-
como puede suponer, ejecutan el puede ser cualquiera de tipo mos el entorno de Delphi; sabe-
código mientras una expresión ordinal, por lo que es posible mos cómo crear un proyecto,
condicional sea cierta o falsa. usar caracteres, enumeraciones compilarlo y ejecutarlo; pode-
La Figura 3 es una representa- o, más típicamente, números mos usar los controles más
ción genérica del funcionamiento enteros. En el Listado 8 puede básicos de Delphi y, además,
de un bucle, independiente- observarse la estructura típica tenemos las bases de Object
mente de que esté controlado o de un bucle por contador. Pascal necesarias para iniciar la
no por un contador. En este Observe cómo detrás de la sen- codificación. Para completar
caso, no obstante, la comproba- tencia for se indica la variable este curso, con el objetivo de
ción de la condición se efectúa al que servirá como contador, así que el lector adquiera las bases
inicio, por lo que si ésta, ya como el valor inicial que tomará suficientes para comenzar a tra-
desde principio, es falsa, no lle- éste. Tras la palabra to se especi- bajar con Delphi, la última
garía nunca a entrarse en el fica el valor objetivo o límite, en entrega la dedicaremos al pro-
bucle. Es posible efectuar dicha este caso mayor que el de inicio. ceso de depuración. Saber
comprobación al final del bucle, Si fuese a la inversa, caso en el depurar una aplicación es,
de tal forma que éste se ejecute que habría que decrementar el actualmente, casi tan impor-
al menos una vez. contador, cambiaríamos to por tante como conocer los contro-
Los bucles por contador rigen downto. Por último, tras la palabra les o las sentencias que debe-
su funcionamiento, como se ha do, hemos dispuesto las senten- mos utilizar. PCW
dicho antes, sobre el valor de cias a ejecutar en cada ciclo. En
este caso tan sólo Francisco Charte es iprofesor de
una. informática. Autor de diferentes
var
Hoy: TDiaSemana; En caso de que el libros sobre lenguajes y sistemas
número de ciclos del de información
begin
Hoy := Jueves;

case Hoy of
type
Lunes:
TDiaSemana = (Lunes, Martes, Miercoles, Jueves, Viernes, Sabado, Domingo);
ShowMessage(‘La semana está comenzando’);
Martes..Jueves:
var
ShowMessage(‘Ya estás a mitad de semana’);
Dia: TDiaSemana;
Viernes:
Anotaciones: array[TDiaSemana] of integer;
ShowMessage(‘El fin de semana está a la vuelta’);
Sabado, Domingo:
begin
ShowMessage(‘Disfruta del descanso’);
for Dia := Lunes to Domingo do
end;
Anotaciones[Dia] := 5;
end;
end;

Listado 7. Estructura condicional case-of, que permite eva-


Listado 8. Construcción típica de un bucle por contador.
luar varias expresiones contra un mismo operando.

PCW
352
PRÁCTICO CURSO

Programación con Delphi (y VI)


Ayudas
a la depuración
Francisco Charte Ojeda charte@pcw.idg.es

M ientras se desa-
rrolla y ejecuta una aplicación
generalmente surgen errores.
Éstos impiden que la aplicación
funcione correctamente o, al
menos, que lo haga como esperá-
bamos que lo hiciese. Los posi-
bles errores pueden clasificarse
rrupción de ésta si no se contro-
lan de manera adecuada. Se pro-
ducen, por ejemplo, cuando
intentamos abrir un archivo ine-
xistente, se efectúa una conver-
sión inválida o una división por
cero.
La tercera categoría de errores,
en tres grupos: de compilación, los que hemos denominado lógi-
de ejecución y lógicos. Los prime- cos, no son detectados por la
ros, como su propio nombre herramienta de desarrollo
indica, son identificados por el durante la compilación ni ejecu-
compilador en una fase previa a ción. Son errores no provocados
la ejecución. Son fácilmente por una codificación sintáctica-
corregibles al tratarse, en la mente incorrecta pero, sin
mayoría de los casos, de errores embargo, impiden que el pro-
de sintaxis y similares. Los erro- grama funcione de forma normal.
res de ejecución surgen de forma Errores de este tipo se producen
esporádica al ejecutar la aplica- cuando en una expresión se ha
ción, pudiendo llegar a la inte- usado la variable que no corres-

PCW 310
El proceso de
depuración, uno
más en la fase de
desarrollo de una
aplicación,
precisa de
herramientas
eficientes que
permitan
identificar los
posibles errores.
Conozcamos
algunas de esas
herramientas en
Delphi 5.

gran funciones de depura-


ción en el propio entorno y
en el editor de código.

Transición de los tres estados


Y no nos referimos a los
estados físicos: sólido,
líquido y gaseoso, sino a los
estados posibles en un
pondía, se invoca a un método con combinadas entre sí: la ejecución momento dado en el entorno de
un parámetro que no se esperaba del código sentencia a sentencia y desarrollo de Delphi. Éstos son
y casos similares. el inspeccionamiento del contenido tres también: diseño, ejecución y
El único método para detectar y de objetos y variables. Hace unos pausa. El estado de diseño es el
encontrar este tipo de errores, años este proceso se efectuaba inicial, en el cual podemos modifi-
aparte de la intuición propia de mediante una herramienta car propiedades, escribir código y
todo programador, consiste en lle- externa, un depurador, como efectuar todas las tareas propias
var a cabo una sesión de depura- podía ser Turbo Debugger. Actual- del diseño de la aplicación.
ción. En ésta se usan general- mente, no obstante, la mayoría de Al ejecutar un programa desde el
mente dos técnicas distintas pero herramientas de desarrollo inte- propio entorno de desarrollo,

PCW 311
PRÁCTICO

pasamos al estado de ejecución. El proceso de Generalmente la ejecución paso a


Se distingue del anterior porque paso parte del modo de pausa. A
en la barra de título de la ventana
depuración permite éste podemos llegar de diversos
principal de Delphi aparece la detectar aquellos modos: detener la ejecución del
palabra Running, como puede apre- errores que, de programa manualmente cuando
ciarse en el detalle de la Figura 1. interese, ejecutando hasta una
Al pasar a este modo también
manera directa, no son determinada sentencia, etc. Según
observaremos la activación de comunicados ni por el el caso, bastará con pulsar el
ciertos botones y opciones de compilador ni por botón Pause, habrá que disponer un
menú, así como la desactivación punto de parada o usar algún otro
de otros que estaban activos en el
errores de ejecución mecanismo que nos permita inte-
estado de diseño. El botón de eje- rrumpir la ejecución. En cualquier
cución, por ejemplo, se desacti- conocidas de depuración consiste caso, estando ya en el modo de
vará, al igual que los de ejecución en la ejecución paso a paso del pausa podremos acceder a los
paso a paso. Los botones de código. De esta forma es posible comandos de depuración siguien-
pausa y parada, por el contrario, ver el resultado generado por la tes.
se activarán. ejecución de cada sentencia de Al encontrarnos en modo de
El tercer estado posible es el de manera individual. Tras cada una, pausa en la ventana del Editor de
pausa. A éste se llega cuando, además, es posible inspeccionar el código debe aparecer, destacada
estando en modo de ejecución, contenido de los objetos y variables sobre las demás, la sentencia que
pulsamos sobre el botón Pause o que estén implicados, haciendo se ejecutará en el paso siguiente.
seleccionamos la opción equiva- más sencilla la localización del Si esto no es así, bastará con usar
lente del menú Run. Como se apre- posible error. la opción Show Execution Point del menú
cia en el detalle de la Figura 2, la En Delphi la ejecución paso a Run para conseguirlo.
indicación Running que aparecía en paso se efectúa en la propia ven- La sentencia destacada podemos
la barra de título es sustituida por tana del Editor de código, es decir, ejecutarla usando dos opciones
la palabra Stopped. Al igual que en el no existe una ventana o herra- distintas. Con la opción Trace Into, el
caso anterior, ciertos botones y mienta separada para este trabajo. botón equivalente o la tecla F7, el
opciones cambian de estado. En Es una ventaja, ya que al localizar control pasará temporalmente a
este momento pasarán a estar los errores podemos corregirlos nuestro programa y se procederá a
activos los de ejecución paso a directamente, modificando el ejecutar la sentencia. Si en ésta se
paso. código según corresponda. Al ini- efectúa una llamada a otro punto
Al iniciar la ejecución de un pro- ciar una sesión de depuración el del programa, la ejecución paso a
grama desde el entorno de Delphi Editor de código resalta la senten- paso se transferirá a ese otro
estamos, en realidad, ejecutando cia que va a ejecutarse, distin- punto facilitándonos su depura-
dos aplicaciones de forma para- guiéndola visualmente de las ción. Una alternativa consiste en
lela: nuestro propio programa y el demás. usar la opción Step Over que, a dife-
depurador integrado de Delphi. rencia de la anterior, ejecu-
En estado de ejecución el control tará la sentencia destacada en
lo tiene nuestro programa, mien- un solo paso. Suponiendo que
tras que en estado de pausa el el punto de ejecución se
control lo tiene el depurador. A encuentre en una sentencia
medida que se va ejecutando paso que contiene una llamada a
a paso, con las opciones que vere- un procedimiento de nuestro
mos en el punto siguiente, el con- programa, la opción Step Over
Figura 1. En el modo de ejecución aparece la indi-
trol pasa alternativamente de ejecutará directamente todo el
cación Running en la barra de título, al tiempo que se
nuestro programa al depurador y activa el botón de pausa y se desactivan los de
código de ese procedimiento,
viceversa. De esta forma es posi- ejecución completa y paso a paso. de tal forma que el punto de
ble ir viendo el resultado que ejecución pasará a la senten-
genera el programa poco a poco, cia siguiente del mismo blo-
al tiempo que inspeccionamos que en que nos encontrába-
código, expresiones, objetos y mos.
variables. Es como si lo ejecutáse-
mos a cámara lenta para poder Lanzar y detener la ejecución
encontrar el punto en el que falla. Encontrándonos en el modo
de pausa, ejecutando paso a
Ejecución paso a paso Figura 2. En el modo de pausa la indicación cam- paso nuestro programa, pode-
Como se ha indicado en el punto bia de Running a Stopped, al tiempo que se invierte el mos volver al modo de ejecu-
anterior, una de las técnicas más estado de los botones de ejecución y pausa. ción en cualquier momento

PCW 312
PRÁCTICO

de ejecución al de parada: Pause Pro-


gram y Run to Cursor. Además de éstas
existen otras y, entre ellas, princi-
palmente los conocidos como pun-
tos de parada. Éstos son unas
marcas que indican al depurador
que ha de cambiar de estado al lle-
gar a una cierta sentencia, permi-
tiendo así iniciar o continuar la
sesión de depuración a partir de
ese nuevo punto.
Para establecer un punto de
parada lo primero que hay que
hacer es situar el cursor en la sen-
tencia que interese, pulsando a
continuación F5 o usando la
opción Debug∑Toggle Breakpoint del menú
emergente del Editor de código. De
manera inmediata podremos ver
que la sentencia se destaca del
resto, generalmente apareciendo
Figura 3. Los puntos de parada pueden tener asociados contadores y condicionales. con el fondo rojo.
Una vez colocados los
pulsando F9 o el botón correspon- puntos de parada en
diente. El programa tomará el con- aquellas sentencias a
trol y no lo devolverá a Delphi partir de las cuales
hasta que finalice o, de algún deseemos ejecutar
modo, interrumpamos su ejecu- paso a paso, estare-
ción. Otro comando muy útil en mos en disposición de
este contexto es el que nos permite lanzar la ejecución
transferir el control a nuestro pro- del programa de
Figura 4. Basta con situar el puntero del ratón sobre un
grama, continuando con la ejecu- punto de parada para conocer sus propiedades.
forma normal. En
ción, hasta llegar a una cierta sen- principio no notare-
tencia. Esto permitiría, por ejem- o usar la opción que proceda para mos nada especial, pero en cuanto
plo, ejecutar todos los ciclos de un su finalización. el punto de ejecución llegue a una
bucle o, simplemente, iniciar la Existe, no obstante, una alterna- de las sentencias marcadas con un
ejecución del programa desde el tiva que permite finalizar la ejecu- punto de parada, Delphi pasará
estado de diseño deteniéndola ción de un programa en cualquier automáticamente al modo de
hasta llegar a una cierta sentencia. momento, indistintamente de que pausa.
Para ejecutar hasta un determi- nos encontremos en modo de Cuando un punto de parada ya
nado punto del programa tendre- pausa y ejecución. Dicha alterna- no nos sea útil, podemos elimi-
mos que posicionar el cursor en la tiva es la opción Program Reset, que narlo usando exactamente la
sentencia que nos interese, equivale a la pulsación de Control- misma opción utilizada para esta-
usando a continuación la opción F2. blecerlo, es decir, pulsando la tecla
Run to Cursor o la tecla F4. F5 o abriendo el menú emergente
En algún momento, tras iniciar la Puntos de parada y seleccionando Debug∑Toggle Breakpoint.
ejecución de nuestro programa, el Conocemos al menos dos opciones Los puntos de parada pueden
control debe volver de nuevo al que nos permiten pasar del estado clasificarse en grupos y también
entorno de Delphi devol-
viendo éste al estado de
diseño. La mejor forma
de hacerlo es finalizar la
ejecución del programa.
Cuando ésta se encuen-
tra en estado de pausa
tan sólo hay que pulsar
F9, como se ha indicado
antes, procediendo des-
pués a cerrar la ventana Figura 5. Ventana que enumera todos los puntos de parada existentes en nuestro proyecto.

PCW 314
PRÁCTICO

Figura 6. Sólo que nos encontremos en el modo


situando el de pausa.
puntero del Podemos conocer el contenido de
ratón sobre una variable o propiedad de un
una variable
objeto de forma inmediata, con tan
podemos cono-
sólo situar el puntero del ratón
cer su conteni-
sobre ella. En la Figura 6, por
do actual.
ejemplo, puede ver cómo, tras
detenerse la ejecución en el punto
de parada condicional que había-
mos dispuesto previamente, com-
contar con condicionales. Si no probamos el valor de la
existe un condicional, el punto de variable Dia. Una alternativa
parada detendrá la ejecución siem- consiste en situarnos sobre
pre que se llegue a la sentencia la variable y pulsar Control-
asociada, lo cual puede ser un F7 o elegir la opción
poco tedioso si dicha sentencia se Evaluate/Modify del menú emer-
encuentra en el interior de un gente asociado. En este caso,
bucle o, simplemente, es ejecutada como puede ver en la Figura
con cierta frecuencia. En estos 7, el contenido se examina
casos podemos añadir el punto de en una ventana indepen-
parada usando la opción Add Break- diente. Lo más interesante
point∑Source Breakpoint del menú Run, que es que en esta ventana pode-
abre la ventana mostrada en la Figura 7. La ventana de evaluación permite com- mos, además, modificar el
probar el contenido de variables, modificarlo y eva-
Figura 3. Como puede ver en ella, valor de variables y evaluar
luar expresiones.
es posible establecer tanto un con- expresiones. En la citada
tador como una Figura 7, por ejemplo, estamos
condición. comprobando si la variable Dia con-
Para conocer cuá- tiene actualmente el valor Viernes.
les son las propie- Si nos encontramos en la necesi-
dades de un punto dad de comprobar el valor de una
de parada: la misma variable o expresión con
acción que efectúa, cierta frecuencia, no sólo de
el contador, condi- manera puntual, existen otras
cional asociado y Figura 8. Manteniendo abierta esta ventana podremos conocer alternativas más cómodas a las
grupo al que perte- el valor de las variables y expresiones a medida que ejecuta- dos opciones anteriores. Una de
mos paso a paso.
nece; bastará con ellas consiste en abrir la ventana
situar el puntero del ratón sobre tencia a sentencia es ya de gran de visualizadores y añadir la
él. Al hacerlo, como se aprecia en utilidad, siendo posible la detec- expresión que deseemos, usando
el detalle de la Figura 4, aparece ción de errores sólo con esta téc- para ello la opción Run∑Add Watch o la
un texto flotante que nos informa. nica. Esta tarea, no obstante, se combinación Control-F5.
Si contamos con múltiples puntos complementa y simplifica gracias a La lista de visualizadores, que
de parada repartidos por el código, la posibilidad de poder evaluar puede ver en la Figura 8, puede
podemos usar la opción View∑Debug expresiones y comprobar el conte- acoplarse a otras y mantenerse
Windows∑Breakpoints para abrir la ven- nido de variables y objetos siempre siempre visible. De esta forma
tana mostrada en la Figura 5. En podremos ir viendo el valor de las
ella se enumeran todos los puntos variables o expresiones que desee-
de parada existentes en nuestro Con las distintas mos a cada paso de la ejecución,
código, siendo posible acceder a la sin necesidad de dar ningún paso
ventanas disponibles
sentencia asociada de cada uno de adicional. Esta ventana, además,
ellos con un simple doble clic. podremos conocer el cuenta con un menú emergente en
También contamos con un menú estado actual de los el que encontraremos las opciones
emergente que nos permite operar necesarias para modificar las pro-
hilos de ejecución, la
sobre ellos. piedades de los visualizadores, eli-
CPU o los módulos que minarlos o añadir otros nuevos.
Comprobación ha cargado en
de expresiones y variables ¿De dónde vengo?
memoria nuestra
El solo hecho de poder ejecutar el Al entrar en el estado de pausa,
código de nuestro programa sen- aplicación tras iniciar la ejecución del pro-

PCW 316
PRÁCTICO

grama, nos encontraremos en un Delphi cuenta con una Visto y por ver
punto al que hemos llegado tras A lo largo del semestre que ha
extensa batería de
disponer un punto de parada, durado este curso, que llega a su
usar la opción Run to Cursor o inte- opciones que facilitan punto final, se ha pretendido intro-
rrumpir el programa de alguna el proceso de ducir al lector en el uso de una de
otra forma. Independientemente las herramientas de desarrollo
depuración, facilitando
de ello, es posible que estando más polivalentes y conocidas en la
en ese punto no sepamos muy la ejecución paso a actualidad: Borland Delphi. Si,
bien cómo hemos llegado hasta paso, la evaluación e partiendo de unos conocimientos
él. Esto es habitual cuando esta- nulos, al llegar a esta última
inspeccionamiento de
mos en un procedimiento o fun- entrega el lector se siente cómodo
ción que es llamado desde dis- expresiones, valores y en el entorno de Delphi, sabe cómo
tintos puntos de la aplicación. objetos diseñar una interfaz básica, escri-
La solución a este problema es bir código en Object Pascal, ejecu-
tan rápida como seleccionar la tar y depurar su proyecto, habre-
opción View∑Debug Windows∑Call Stack , ción que nos ha llevado hasta mos conseguido nuestro objetivo.
que hace aparecer una ventana este punto. Obviamente no será un experto en
similar a la de la Figura 9. Ésta Aparte de esta ventana y las la materia, pero se encontrará en
es conocida como la ventana que que hemos visto en puntos pre- el punto adecuado para iniciar un
muestra la pila de llamadas. En vios, en el submenú View∑Debug Win- aprendizaje en profundidad de
ella aparecen, en orden inverso, dows contamos con opciones que Object Pascal, Delphi y sus com-
los nombres de los procedimien- nos permiten abrir muchas ponentes contando con una indis-
tos por los que se ha pasado otras. Con ellas podemos anali- pensable visión general. PCW
hasta llegar al punto actual, que zar el estado de los hilos de eje-
ocupa el primer puesto en la cución del programa, los módulos Francisco Charte es profesor de
lista. De esta forma podemos que éste está utilizando o, informática. Autor de diferentes
saber de manera inmediata cuál incluso, conocer el estado de los libros sobre lenguajes y sistemas
ha sido la secuencia de ejecu- registros de la CPU y FPU. de información.

También podría gustarte