Programación Con Delphi
Programación Con Delphi
HPC1349
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
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.
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.
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
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
www.idg.es/pcworld
[01/12/1999]
Creación de la primera aplicación ejecutable con Delphi
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.
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.
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.
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 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.
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).
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.
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.
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.
PRÁCTICO
Componentes, propiedades,
métodos y eventos
Francisco Charte Ojeda
[email protected]
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.
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á
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
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.
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
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
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.
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
type
TDiaSemana = (Lunes, Martes, Miercoles, Jueves, Viernes, Sabado, Domingo);
var
Ayer, Hoy: TDiaSemana;
begin
Ayer := Jueves;
Hoy := succ(Ayer);
end;
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
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;
PCW
352
PRÁCTICO CURSO
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.
PCW 311
PRÁCTICO
PCW 312
PRÁCTICO
PCW 314
PRÁCTICO
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.