No es el objeto del presente proyecto hacer un repaso
exhaustivo de la programación en Pascal, por eso vamos a ver de
forma somera solo algunas de las características de que dispone
Delphi, principalmente aquellas que le diferencian más del Pascal
estándar. Para ello, vamos a introducir una serie de conceptos:
Como su propio nombre indica, el Object Pascal (usado por Delphi) es un lenguaje totalmente orientado a objetos. Prácticamente todos los elementos del entorno Delphi son objetos, que unas veces se encuentran definidos de antemano (los forms, los componentes de la paleta, objetos no visuales, etc), y otras se definen en nuestra propia aplicación (por ejemplo el componente TPostIt de ANALOGIA.EXE definido en la unit U_Misc).
Todo el desarrollo de aplicaciones en Delphi está íntimamente ligado con la definición y uso de objetos, por lo que es fundamental conocer la mecánica que Object Pascal utiliza para describir un objeto, sus características y su funcionamiento, sobre todo a la hora de que el programador cree sus propios componentes. En muchos casos no es necesario conocer el funcionamiento de la programación orientada a objetos para programar con Delphi, puesto que en la mayoría de los casos existen controles ya creados sin necesidad de tener que programarlos. Por ejemplo en ANALOGIA.EXE la mayoría de los objetos forman parte de la VCL de Delphi y otros dos componentes han sido escritos por terceros (RChart y TFormulaParser), sin embargo ha sido útil desarrollar un componente propio (TPostIt) para mostrar la tabla de valores de los componentes en el programa.
La propia programación visual de Delphi, que
escribe parte del código automáticamente, hace posible utilizar
objetos de forma práctica sin tener por qué comprender al
cien por cien su funcionamiento.
Un componente es cualquiera de los elementos que
podemos insertar en una ficha, tanto si su función es visual como
si no lo es (por supuesto un componente es también un objeto). Un
ejemplo de componente puede ser RChart, usado en ANALOGIA.EXE para dibujar
las gráficas. Sin conocer exactamente el cómo realiza su
función, el programador manipula una serie de propiedades, métodos
y eventos que caracterizan al componente, a través de los cuales
se "maneja" el componente en la forma deseada. Por supuesto el usuario
puede crear sus propios componentes y usarlos en distintas aplicaciones,
de forma que la reusabilidad del código es máxima. A los
componentes que cuentan con una parte visual, como puede ser un botón,
se les denomina controles.
Los componentes, y de hecho todos los objetos de Delphi son de uso general, por lo que a la hora de usarlos de alguna forma deberemos adecuarlos a nuestras necesidades. Para ello nos serviremos de las propiedades de cada objeto, mediante las cuales podremos establecer el título de una ventana, el tipo de letra de una etiqueta de texto o el color en el que aparecen los distintos controles.
Se puede pensar en las propiedades como si fuesen variables pertenecientes a un objeto (veremos que no es así exactamente), de tal forma que para acceder a ellas generalmente habrá que indicar no sólo el nombre de la propiedad, sino también a qué objeto pertenece.
La modificación o consulta del valor de una propiedad puede diferir según intentemos acceder a ella mientras estamos diseñando un form, en tiempo de diseño, o bien mediante el código del programa, en tiempo de ejecución. Ciertas propiedades están sólo accesibles en tiempo de ejecución, por lo que mientras estamos diseñando la ficha no aparecerán. Además hay algunas propiedades que son de sólo lectura, por lo que su valor puede ser consultado, pero no modificado, y otras que son sólo de escritura.
Aunque a primera vista si usamos un componente prefabricado,
las propiedades pueden parecer simples variables, en la mayoría
de las ocasiones una propiedad no es una variable, y la modificación
o consulta de su valor puede conllevar que internamente el componente ejecute
un cierto código. Si por ejemplo tuviésemos un componente
para comunicaciones serie que se encargase de enviar mensajes a un ordenador
remoto, podríamos tal vez asignar una cadena de caracteres a una
hipotética propiedad "Envia". De esta forma, con una simple asignación
(Envia:='Mensaje a mandar') se pondría en marcha todo el mecanismo
implícito en el componente para enviar el mensaje al ordenador remoto.
Esta propiedad podría ser un ejemplo de propiedad de sólo
escritura, ya que sólo interesa mandar el mensaje al ordenador remoto,
sin conservar información acerca del mensaje, por lo que sería
inapropiada su lectura.
Como dije anteriormente, la programación en el entorno Windows se caracteriza por estar dirigida por eventos, de tal forma que un programa no tiene por qué ejecutarse necesariamente de forma secuencial, sino que ciertas porciones de código se ejecutarán cuando ocurra un cierto evento.
Los eventos son señales que el entorno recibe
desde distintos elementos, como puedan ser el ratón, el teclado
o un temporizador. Estos eventos son redirigidos a las aplicaciones, que
en caso de aceptarlos deberán responder adecuadamente de ellos.
Ciertos eventos pueden ser gestionados por el propio Windows, otros quedarán
a cargo del propio lenguaje que estemos usando, y un tercer grupo serán
los que lleguen hasta nuestro programa. En Delphi prácticamente
todo el código que escribimos irá asociado a algún
evento. Si retomamos el ejemplo del componente para comunicaciones serie,
podría interesarnos que se ejecutara un evento cada vez que se recibiese
un carácter por el puerto serie, de forma que podríamos escribir
el código necesario para guardar el carácter en un archivo
cada vez que se produjese el evento. Normalmente los eventos a los que
reaccionarán los componentes serán las pulsaciones del teclado
o el ratón, activaciones de los componentes, etc.
Los componentes Delphi además de disponer de propiedades y poder responder a ciertos eventos, habitualmente también disponen de métodos. Un método es un procedimiento o función que nos permite realizar una determinada acción en el componente, pudiendo necesitar o no el paso de algún parámetro.
Al igual que ocurre en las propiedades, a la hora
de usar un cierto método normalmente tendremos que indicar primero
el objeto o componente al que pertenece, de tal forma que la acción
del método recaiga sobre él, y no sobre cualquier otro. El
hecho de que cada objeto sea propietario de una serie de propiedades y
métodos, variables y código, que no son accesibles a ningún
otro objeto externo, recibe el nombre de encapsulación, aunque también
es posible definirlos de tal modo que sean accesibles a otros objetos.