0% encontró este documento útil (0 votos)
280 vistas61 páginas

Curso Basico de Delphi

1. El documento describe los principales elementos de la interfaz de Delphi, incluyendo la ventana principal con su menú, botones y paletas de componentes y botones, el inspector de objetos, el visualizador de objetos y el depósito de objetos. 2. También explica cómo se pueden crear nuevos formularios a partir de otros existentes mediante herencia visual, permitiendo compartir y modificar fácilmente formularios entre proyectos. 3. Finalmente, detalla cómo al modificar un formulario base, esas modificaciones se heredan automáticamente en cualquier formulario deriv

Cargado por

Steven Reyes
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como DOC, PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
280 vistas61 páginas

Curso Basico de Delphi

1. El documento describe los principales elementos de la interfaz de Delphi, incluyendo la ventana principal con su menú, botones y paletas de componentes y botones, el inspector de objetos, el visualizador de objetos y el depósito de objetos. 2. También explica cómo se pueden crear nuevos formularios a partir de otros existentes mediante herencia visual, permitiendo compartir y modificar fácilmente formularios entre proyectos. 3. Finalmente, detalla cómo al modificar un formulario base, esas modificaciones se heredan automáticamente en cualquier formulario deriv

Cargado por

Steven Reyes
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como DOC, PDF, TXT o lee en línea desde Scribd
Está en la página 1/ 61

1.

La ventana principal
Cuando ejecutamos Delphi, nos encontramos ante un entorno como el que se ve en la imagen,
compuesto por varias partes:

En la barra de ttulo de la ventana principal (la superior) vemos el nombre del entorno (Delphi)
seguido del nombre del proyecto en curso. Bajo la barra de ttulo encontramos el men, con las
opciones tpicas de ficheros, herramientas, edicin, etc.
La parte inferior izquierda de la ventana principal est ocupada por un conjunto de botones,
separados en tres grupos, como vemos en el grfico:

Mediante ellos podemos cargar un nuevo proyecto, salvar el actual, etc. Cada uno de estos botones
tiene una correspondencia con una opcin del men y algunos de ellos tambin tienen asociada
una tecla de acceso rpido.
Por ltimo, en la ventana principal de Delphi, encontramos las paletas de componentes Delphi:

En principio la paleta activa es la llamada Standard, en la que podemos encontrar los componentes
y controles ms habituales en un programa. Las pestaas existentes en la parte superior nos
permitirn acceder a la dems paletas de controles.

Men de Opciones
Este elemento contiene las diferentes opciones del programa agrupadas en varias principales. En
Delphi el men de opciones es un apartado con estructura casi fija (es decir, siempre las mismas
opciones en el mismo lugar), salvando la posibilidad de aadir opciones mediante la creacin de
extensiones al entorno.

La Paleta de Botones

Otro de los elementos de la ventana principal de Delphi es la Paleta de botones o acciones rpidas.
Nos permite ejecutar de forma directa algunas de las opciones del men sin necesidad de buscar
por las distintas ventanas. Hay que observar que aquellos que no estn disponibles se muestran en
gris. Si dejamos un momento el cursor sobre un botn, aparecer una pequea etiqueta (un hint)
que nos indicar de forma breve cul es su funcin.
Al igual que otros elementos de Delphi, la paleta de botones tiene asociado un men emergente o
contextual, que podemos hacer aparecer pulsando el botn derecho del ratn. Estas opciones nos
permiten ocultar la barra de botones, pedir ayuda, decir si queremos que se muestren los hints o
no, y personalizarla aadiendo/quitando botones en properties. Si ocultamos la barra de botones,
siempre tenemos la opcin de volver a mostrarla en el men View, opcin Speedbar.

Paleta de Componentes
Aqu podemos seleccionar los elementos que vamos a insertar en un form. Esta tambin puede ser
personalizada mediante el men emergente, idntico al de los botones. Igualmente, si ocultamos la
paleta de componentes, podemos volver a mostrarla con la opcin Component Palette del men
View.
Hay que hacer notar lo siguiente: en el panel de la derecha, adems del icono y nombre del
componente, tambin aparece el nombre del paquete en que est incluido. En Delphi, todo
componente instalado en el entorno debe estar contenido en un paquete, bien de forma aislada o
con otros.

El Form
La interfaz de las aplicaciones que escribamos con Delphi estar basada en el uso de forms,
nombre con el que se denomina a las ventanas del entorno Windows en las que se alojarn los
distintos controles encargados de interactuar con el usuario. Cada vez que se inicia un nuevo
proyecto, en pantalla veremos aparecer un form vaco, en el que podremos insertar los
componentes que seleccionemos de la Paleta de componentes.
Prcticamente en todas las aplicaciones contaremos con varios forms, uno principal, que ser aquel
que aparezca inicialmente al ejecutar el programa, y otros que se irn usando segn las opciones
que el usuario de la aplicacin vaya seleccionando.
En el men File disponemos de opcin New Form, que nos permite insertar un nuevo form en
nuestro proyecto. Habitualmente en pantalla slo tendremos visible aquel form sobre el que
estemos trabajando en cada momento, mientras los dems permanecen cerrados (o no visibles por
estar detrs del form activo).
Para abrir uno de los forms ya existentes en el proyecto podemos utilizar la opcin Forms del
men View; o pulsar el botn
de la Paleta de botones. En cualquiera de los dos casos
aparecer la lista de los forms existentes.

El Inspector de Objetos
Otro de los elementos que habitualmente est visibles en pantalla es el Inspector de objetos, cuya
finalidad es facilitar la edicin de las propiedades correspondientes al componente que se
seleccione.

En la parte superior aparece el nombre del componente que se est inspeccionando as como su
tipo. Es posible seleccionar cualquier componente de la lista desplegable asociada a este campo, o
bien marcar el componente en el form.
La columna izquierda de la ventana sirve para mostrar los nombres de las propiedades, mientras
que en la derecha se muestran los valores que tienen actualmente.

El visualizador de objetos
La mayor parte del tiempo, durante la creacin de una aplicacin con Delphi, estaremos trabajando
con objetos, que pueden ser controles y objetos no visuales. Estos objetos disponen en su interior
de miembros de datos, mtodos, propiedades, pueden definir tipos, etc. Toda la informacin
disponible sobre un cierto objeto la podemos obtener fcilmente mediante el visualizador, que
podemos abrir mediante la opcin Browse Symbol del men Search, o bien con la opcin
Browser del men View. Para poder analizar un cierto smbolo u objeto con el Visualizador,
previamente debemos haber compilado nuestro programa, ya que es del cdigo objeto de donde se
obtiene esta informacin. Si no hemos compilado el programa, veremos que esta opcin no est
disponible.
En el panel izquierdo del Visualizador podemos seleccionar el objeto del que deseamos obtener
informacin, mostrndose sta de forma inmediata en el panel derecho de la ventana. En dicho
panel existen en realidad tres pginas mostrndose en la primera, Scope, todos los tipos,
constantes, mtodos, etc., que tiene el objeto; en la segunda la jerarqua de tipos correspondiente
al objeto, y en la tercera las referencias existentes a dicho objeto en el cdigo de nuestro
programa.
En principio en la pgina Scope aparecen todos los identificadores existentes en el objeto, tanto si
han sido definidos en l como si son heredados. Los botones existentes en la parte superior del
Visualizador, tras la palabra Show, nos permiten seleccionar qu informacin deseamos ver. Los
primeros cinco botones nos permiten activar/desactivar la visualizacin de constantes, mtodos,
tipos, variables y propiedades, respectivamente. Los dos siguientes botones realizan la misma
accin con aquellos miembros que son heredados o son virtuales. Por ltimo tenemos cuatro
botones ms, que representan a los indentificadores privados, protegidos y pblicos.

El depsito de objetos
Al seleccionar la opcin New del men File, Delphi abrir la ventana del Depsito de objetos, en la
que podremos optar por crear un nuevo elemento desde cero, o bien partir de otro ya existente. En
la primera pgina de la ventana, que es la que aparece abierta por defecto, podemos optar por
iniciar una nueva aplicacin estndar, un nuevo componente, librera de enlace dinmico, mdulo,
etc. La pgina siguiente llamada ActiveX, contiene los elementos que facilitan la creacin de
controles ActiveX, forms Active, etc. A continuacin tenemos una pgina que tendr como ttulo el
nombre del proyecto sobre el que estamos trabajando. En ella aparecern los forms que en ese
momento existan en dicho proyecto, permitiendo crear otros nuevos a partir de ellos. En las
pginas siguientes, Forms, Dialogs, Data Modules y Projects, encontraremos plantillas de
forms, cuadros de dilogo, mdulos de datos y proyectos, respectivamente, que podemos copiar en
nuestro proyecto, utilizar o bien crear un nuevo elemento heredando las caractersticas de uno ya
existente.

Reutilizacin de Forms en un mismo proyecto


Por defecto, cada vez que aadimos un nuevo form al proyecto, ste aparece vaco y es
descendiente directo del tipo TForm. Como sabemos, un form no est compuesto slo por un
mdulo de cdigo, sino que, adems, cuenta con un archivo en el que se almacena toda la
informacin referida a las propiedades de los componentes que hay en el form, lo que dificulta la
posibilidad de crear un form utilizando otro ya existente como base. Esta posibilidad, sin embargo,
ha sido implementada en Delphi de una forma muy notable, permitiendo compartir forms entre
distintos proyectos e incluso dentro de uno mismo, bsicamente gracias a lo que Borland ha
llamado herencia visual.
Object Pascal es un lenguaje orientado a objetos y, como tal, permite utilizar el concepto de
herencia, derivando nuevos objetos de otros ya existentes. Sin embargo, al definir un form hemos
de tener en cuenta que no todo en l es cdigo, ya que, adems, existe el archivo DFM en el que
se almacenan las propiedades de todos los componentes que existen en l. La estructura de estos
archivos se ha visto modificada con el fin de aplicar al mismo concepto de herencia.

Modificaciones a un form base


Sin duda la posibilidad que acabamos de conocer, creando nuevos forms a partir de otros ya
existentes, es muy potente, y puede ahorrarnos bastante trabajo. Sin embargo, ah no acaba todo,
ya que no estamos hablando de plantillas de forms que se copian en nuestro proyecto, sino de
verdadera herencia, con todas las implicaciones que ello tiene.
Imaginemos que hemos escrito la definicin de un determinado objeto, del cual posteriormente
hemos derivado un nuevo tipo. Qu ocurre si ahora modificamos alguna de las caractersticas del
tipo base? Est claro que el tipo descendiente o derivado tambin heredar de forma inmediata las
modificaciones. Pues bien, esto mismo es aplicable a los forms que han sido heredados de otros.
Al modificar por ejemplo la posicin de un botn en el form base, lo que estamos modificando es el
valor que se almacena en el archivo DFM de este form. Puesto que el form de entrada de datos no
almacena en su archivo DFM informacin acerca de estos compnentes sino que la hereda, una
modificacin se muestra de forma inmediata.

Personalizacin de un form derivado


Un objeto derivado de otro puede no slo ampliar sus capacidades, aadiendo nuevos mtodos o
en el caso de un form, nuevos componentes, sino que adems tambin es posible, si lo deseamos,
redefinir mtodos que han sido heredados, modificando as el comportamiento por defecto del
objeto. En un form que ha sido heredado de otro esto tambin es posible y podemos alterar las
propiedades de aquellos elementos que inicialmente se encuentran definidos en el form base.
Cuando se modifica una propiedad heredada, de un form derivado o de uno de los componentes
existentes en l, al archivo de definicin de este form se aade una entrada indicando que este
componente es heredado, pero que se modifica el valor de dicha propiedad. En realidad es como si
hubiramos redefinido un mtodo de cualquier objeto derivado de otro.

Reutilizacin de Forms entre proyectos


Un form que ha nacido en una determinada aplicacin como base para el desarrollo de otras ms
especializadas, puede sernos til posteriormente en otros programas, sobre todo si pretendemos
que todos nuestros desarrollos compartan una apariencia comn. Aunque podemos salvar el form
que vamos a utilizar como base e incorporarlo con posterioridad a otros proyectos, resultar mucho
ms fcil aadirlo al Depsito de objetos de tal forma que la tengamos disponible en todo
momento.
Para aadir el form FormBase al Depsito de objetos, hay que situarse con el ratn sobre l,
pulsar el botn derecho y seleccionar la opcin Add To Repository. En la ventana que aparece,
existe una lista con los nombres de todos los forms del proyecto actual. Seleccionamos el que
deseamos almacenar en el Depsito de objetos, a continuacin damos un ttulo u opcionalmente
una descripcin. En la lista desplegable Page habr que seleccionar la pgina del Depsito de
objetos en la que aparecer el form; selecciona, por ejemplo la pgina Forms, que es el destino
ms lgico. Po ltimo podemos facilitar el nombre del autor y un icono con el que se mostrar el
form, finalizando el proceso con la pulsacin del botn OK.

Copiar, heredar o usar un form del depsito de objetos.


Al abrir la pgina Forms del Depsito de objetos y seleccionar uno de los forms existentes,
observamos que en la parte inferior de la ventana se activan tres opciones mediante las cuales
podemos: copiar el form en nuestro proyecto, derivar un nuevo form a partir de l o bien utilizarlo
directamente. La opcin a usar depender obviamente del resultado que deseemos obtener.
Copiar el form en nuestro proyecto, que es la primera opcin disponible, aade a nuestro proyecto
un nuevo mdulo de cdigo y un form, que inicialmente cuenta con unas determinadas propiedades
y componentes. Este form que se ha aadido a nuestro proyecto no guardar ninguna relacin con
el form original, por lo que no se ver afectado por ninguna modificacin posterior en este.
La segunda opcin es la que hemos estado usando en los supuestos anteriores, derivando un form
que hereda las caractersticas de otro, pero que sigue estando relacionado con l, de tal forma que
cualquier modificacin en el form base tiene su reflejo inmediato en el form derivada.
Por ltimo tenemos la opcin Use, que ser la que utilicemos cuando en nuestro proyecto
deseamos usar el form original que existe en el depsito de objetos, no una copia ni un nuevo form
derivado de l. Al utilizar un form de esta forma, cualquier modificacin que se realice sobre l
afectar de forma indirecta a cualquier otro form derivado de l, incluso de otras aplicaciones.

Reutilizacin de proyectos enteros


Adems de forms individuales, Delphi tambin nos permite reutilizar aplicaciones o proyectos
completos. De hecho en la pgina Projects del Depsito de objetos existen varios modelos de
aplicacin ya "prefabricados". Esta posibilidad est dirigida sobre todo a reducir el tiempo que se
emplea en la creacin del esqueleto de una aplicacin, que suele ser siempre igual.
Para aadir un proyecto al Depsito de objetos deber abrir el men Project y seleccionar la
opcin Add To Repository. Esto mostrar una ventana en donde tendremos que introducir un
ttulo, una descripcin e indicar la pgina del Depsito de objetos en la que aparecer. Tambin
podemos facilitar el nombre del autor y un icono que le identifique. Dado este paso, siempre que
deseemos iniciar un nuevo proyecto podemos elegir la pgina adecuada del Depsito de objetos y
hacer un doble clic sobre el icono, ahorrando mucho trabajo.
Los proyectos que vayan a aadirse al Depsito de objetos para ser posteriormente utilizados,
debern almacenarse en un directorio que tan slo contenga los elementos de ese proyecto. Al
crearse una nueva aplicacin tomando esa plantilla como base, Delphi preguntar cul ser el
directorio del nuevo proyecto y copiar en l todos esos archivos.

Personalizar el depsito de objetos


Al igual que la mayora de los elementos en Delphi, la ventana del Depsito de objtos cuenta con
un men emergente, que podemos hacer aparecer simplemente pulsando el botn derecho del
ratn. En este men podemos elegir entre diferentes modos de visualizacin, el orden de los
elementos en la ventana y una opcin, llamada Properties, que nos da acceso a la ventana de
propiedades del Depsito de objetos, en la que podremos adecuarlo a nuestras preferencias.
Tambin podemos acceder a esta ventana mediante la opcin Repository del men Tools.
Esta ventana cuenta con dos listas y una serie de botones que ocupan la parte central. La ventana
de la izquierda contiene el nombre de cada una de las pginas del Depsito de objetos, as como
un elemento, Object Repository, que representa a todos los anteriores juntos. La lista de la
derecha muestra los nombres de los elementos existentes en la pgina que hay seleccionada
actualmente en la lista de la izquierda, como forms y proyectos. Mediante los botones existentes en
la parte central podemos acceder a la mayora de las opciones disponibles.

Aadir, eliminar y modificar pginas


Tanto el form como el proyecto que hemos aadido, en los pasos anteriores, al Depsito de
objetos, han tenido como destino pginas que ya existan. Nada nos impide, sin embargo, aadir
nuestra propia pgina con el fin de almacenar en ella los elementos definidos por nosotros, los
cuales seguramente utilizaremos con mayor asiduidad. Para aadir una nueva pgina simplemente
pulsamos el botn Add Page y, a continuacin, facilitaremos el ttulo que deseamos darle.
Eliminar una pgina del Depsito de objetos es an ms simple, ya que simplemente tenemos que
seleccionarla y pulsar el botn Delete Page. Sin embargo, deberemos tener en cuenta que la
pgina se habr de encontrar vaca, no permitindosenos el borrado en caso contrario. Para dejar
vaca una pgina seleccionamos cada uno de los elementos que sta contiene y pulsamos el botn
Delete Object.
Los nombres de las pginas que ya existen pueden ser modificados. Esta es la finalidad del botn
Rename Page.

Gestin de los objetos de las pginas


Cada vez que se selecciona una pgina en la lista de la izquierda, en la que hay en la derecha
aparecen los nombres e iconos de los objetos que sta contiene. Haciendo un doble clic sobre
cualquiera de ellos, podremos editar su ttulo, descripcin, icono, pgina en la que se almacena y
autor.
Si deseamos mover objetos entre las pginas del Depsito de objetos, el mtodo ms rpido y fcil
consiste en seleccionar la pgina Object Repository, que nos permite disponer en la lista de la
derecha de todos los objetos existentes en ese momento. Tomando cualquiera de ellos y
arrastrndolo hasta la pgina deseada lo moveremos.

2.I. Caractersticas de un Form


La principal cualidad de un form es la de tratarse de un componente "contenedor", lo que le
permite albergar en su interior otros componentes. Aunque el form en s dispone ya de una cierta
funcionalidad, realmente su utilidad la obtendremos cuando en l insertemos otros componentes
que nos sirvan para mostrar o solicitar informacin al usuario del programa. Este proceso, en el
cual los componentes se van situando en el form y se van modificando segn las necesidades, es el
diseo de la interfaz de nuestra aplicacin.

Propiedades
Durante la etapa de diseo de la interfaz, las propiedades de un objeto pueden ser consultadas y
modificadas mediante el Inspector de Objetos. Bsicamente, el Inspector de objetos est
compuesto de una cabecera, en la que aparece el nombre del tipo del objeto que se est
inspeccionando en ese momento, y dos pginas, una donde aparecen las propiedades y otra
correspondiente a los eventos. En la pgina de propiedades nos encontramos con dos columnas,

conteniendo la izquierda el nombre de la propiedad y la derecha su valor actual. Existen ciertas


propiedades que slo son accesibles durante el diseo, mientras que otras slo lo son durante la
ejecucin del programa.

Modificacin de una propiedad


El mtodo de modificacin de una propiedad en tiempo de diseo depender directamente del tipo
de la propiedad, que al igual que una variable puede contener una cadena, un nmero, una
numeracin, etc. Adems una propiedad tambin puede ser un objeto, que a su vez contenga sus
propiedades particulares.
Para modificar el valor de una propidad simple, que contiene una cabecera o un nmero, bastar
con pulsar sobre el nombre o el valor actual. Al hacerlo veremos que automticamente se marca el
contenido actual.
Otras propiedades slo pueden tomar un valor de una lista predeterminada, que podemos abrir
pulsando sobre la flecha hacia abajo que aparecer al seleccionar dicha propiedad.
Un tercer tipo de propiedad la componen aquellas que contiene otras propiedades y a las que por
tanto se pueden llamar propiedades compuestas. Estas tienen un valor que aparece como si fuese
una cadena de caracteres, pero que en realidad no podremos modificar directamente. Si nos
fijamos, a la izquierda del nombre de la propiedad aparece un signo +, lo que indica que esta
propiedad es una propiedad compuesta. Realizando un doble clic sobre el nombre conseguiremos
desplegar su contenido, teniendo acceso a las propiedades que la componente y pudiendo
modificar su valor por alguno de los mtodos anteriores. Podemos volcer a cerrar el contenido de
una propiedad compuesta de la misma forma, realizando un doble clic sobre el nombre.
Adems de los tres tipos anteriores de propiedades, nos podemos encontrar con casos particulares
en los cuales, para editar el valor de la propiedad, se facilita algn tipo de herramienta adicional a
la que llamaremos editor de propiedad.

Eventos
Un form que contenga los componentes nacesarios con sus correspondientes propiedades
establecidas correctamente, nos ser de poca utilidad si no tenemos algo ms. Una interfaz por s
sola no tiene finalidad alguna ya que aunque el usuario puede interactuar con el form y sus
componentes, nuestro programa no har nada a no ser que nosotros escribamos algo de cdigo.
El cdigo de una aplicacin Delphi habitualmente siempre est asociado a eventos, de tal forma
que su ejecucin no se produce de forma secuencial, desde el principio hasta el fin del programa.
Un evento es una seal, externa o interna a la aplicacin, que nuestro programa puede aprovechar
para ejecutar un cierto bloque de cdigo, el cual escribiremos en un mtodo. El nombre y
parmetros de estos mtodos estn predeterminados por Delphi, de tal forma que si deseamos
responder a un evento tan slo hemos de escribir el cdigo que queremos ejecutar.

El evento por defecto


Slo existe un evento por defecto para cada componente, por lo que para acceder al resto de
eventos tendremos que utilizar la pgina Events del Inspector de objetos. Al abrirla podremos ver
el nombre de todos los eventos posibles para el componente seleccionado en ese momento.
Realizando un doble clic sobre la columna derecha de un evento, en la ventana de cdigo aparecer
el mtodo de respuesta correspondiente, en el que podremos insertar las sentencias que
deseemos.

Eventos con mtodos comunes


Aunque inicialmente es posible crear un mtodo de respuesta distinto para cada evento, en caso de
que el cdigo a ejecutar sea el mismo, Delphi nos permite que mltiples eventos compartan un
solo mtodo de respuesta. Para conseguir esto, primero tendremos que crear dicho mtodo,
realizndose un doble clic a la derecha del primer evento que vayamos a agrupar. En la ventana de
cdigo podemos entonces introducir las sentencias que necesitemos. Hecho esto no tenemos mas

que seleccionar el segundo evento, pulsando sobre su nombre, y abrir la lista desplegable de
mtodo mediante la flecha que aparece en la columna derecha. En esta lista seleccionaremos el
mtodo correspondiente, que quedar as asociado tambin a este evento. El proceso lo podemos
repetir tantas veces como sea necesario, asociando mltiples eventos a un solo mtodo.
Para modificar el cdigo de un mtodo de respuesta a un evento, suponiendo que ste no est
visible en ese momento en la ventana de cdigo, bastar con realizar un doble clic en la columna
derecha del evento en cuestin para que el cursor se desplace hasta el cuerpo de dicho mtodo.

Parmetros de eventos
Al igual que ocurre con cualquier procedimiento, los mtodos de respuesta a eventos tambin
pueden recibir parmetros de distintos tipos. El nmero y tipo de los parmetros a recibir
dependern directamente del evento del que se trate.

2.II. Manipulacin de componentes


Los componentes a insertar en el form, los seleccionamos de la Paleta de componentes, eligiendo
primero, si es necesario, la pgina en que se encuentre el componente necesitado.
Existen varias formas de insertar un componente en el form, an cuando el resultado final ser el
mismo. Si hacemos un doble clic sobre un componente de la Paleta conseguiremos que ste se
inserte automticamente en el centro del form, tomando un tamao por defecto. Si lo deseamos,
podemos fijar un tamao distinto.
En caso de que necesitemos insertar en el form mltiples componentes del mismo tipo, podemos
usar un mtodo ms rpido, que consiste en pulsar la tecla de <Mayscula> antes de pulsar el
componente de la Paleta. Hecho esto, el componente quedar seleccionado y, simplemente
pulsando sobre el form, podremos ir insertando tantas copias del control como sea necesario.
Cuando hayamos terminado, tendremos que pulsar sobre el icono que representa al cursor del
ratn, que aparece siempre a la izquierda de la Paleta de componentes.

Posicin y tamao de los componentes


Aunque en el momento en que un control se inserta en el form ste ya toma una posicin y un
tamao determinados, estos atributos son modificables siempre y cuando no est activa la opcin
Lock Controls, en el men Edit.
Para modificar la posicicin en la que se encuentra un componente bastar con <pincharlo>,
situando el cursor del ratn sobre l y pulsando el botn izquierdo y <arrastrarlo>, desplazando el
cursor del ratn hasta la posicin que deseemos, momento en que liberaremos la pulsacin.
Con el fin de alterar el tamao de un componente, primero deberemos seleccionarlo, para lo que
bastar con realizar una pulsacin sobre l con el cursor del ratn. Hecho esto, el componente
aparecer delimitado por una serie de bloques, que realmente nos indican los puntos por los que
podemos redimensionar el control.
Aunque todos los componentes tienen una posicin en el form, no todos tienen un tamao
definible. Por ejemplo, el componente PrintDialog tiene un tamao fijo, al tratarse de un
componente no visual, que en tiempo de ejecucin no aparecer en el form.

Cortar, copiar y pegar componentes


Los componentes existentes en un form pueden cortarse, copiarse al portapapeles y pegarse desde
el portapapeles, de igual forma que podemos hacer con un texto en el editor de cdigo. Al copiar
un componente al portapapeles, se conservar informacin acerca de las dimensiones del
componente y los valores de sus propiedades, de tal forma que si posteriormente lo pegamos,
obtendremos una copia exacta del componente original, a excepcin del nombre.
Los comandos Cut, Copy y Paste pueden ser ejecutados desde el men Edit, pero es mucho ms
rpido y cmodo usar las combinaciones de teclas <Control+X>, <Control+C> y <Control+V>.

Seleccin de componentes
Para seleccionar un componente basta con realizar una pulsacin con el botn izquierdo del ratn,
habiendo situado previamente el cursor sobre el componente en cuestin. Otra forma consiste en
desplegar la lista existente en la parte superior del Inspector de objetos, eligiendo una de las
lneas. Al hacerlo, en el form automticamente se mostrar seleccionado el componente
correspondiente a dicha lnea.
En ocasiones puede ser interesante seleccionar mltiples componentes en el form, con la finalidad
de tratarlos de forma genrica. Para ello podemos usar bsicamente dos mtodos: ir pulsando con
el ratn sobre los distintos componentes mientras mantenemos pulsada la tecla de <Mayscula>, o
bien trazar en el form, usando el botn izquierdo del ratn, un cuadrado o rectngulo que delimite
a todos los componentes que deseamos agrupar.
Un grupo de componentes seleccionados puede ser copiado al portapepeles, borrado, desplazado
en el form e incluso es posible modificar aquellas propiedades y eventos que son comunes.

Alineacin y otras opciones


Por defecto, en el interior del form siempre aparece una rejilla de puntos, que slo es visible
durante el diseo, desapareciendo en tiempo de ejecucin. La finalidad de esta rejilla es facilitar el
correcto posicionamiento de los componentes del form, siendo configurable la distancia entre
puntos.
Las opciones relacionadas con la rejilla podemos modificarlas en la pgina Preferences de la
opcin Environment Options del men Tools.

Anlisis del cdigo


A medida que en nuestro proyecto vayamos insertando forms, en estos aadimos controles a los
cuales asociaremos mtodos de respuesta a eventos, etc., Delphi ir generando automticamente
todo el cdigo necesario para que, posteriormente, sea posible obtener un ejecutable simplemente
compilando, sin necesidad de pasos intermedios. El conocimiento del cdigo generado por Delphi
nos permitir una mejor comprensin del funcionamiento general de nuestra propia aplicacin,
facilitndonos posteriores tareas de modificacin y mantenimiento.

Mdulos y Forms
Delphi utiliza el programa principal para almacenar el cdigo del proyecto, que habitualmente no se
hace visible. Sim embargo, podemos usar la opcin Project Source del men View para hacer
aparecer dicho cdigo, que se almacena en un archivo que en lugar de tener extensin PAS, como
los mdulos habituales de Pascal, tiene la extensin DPR, con el fin de diferenciar un proyecto de
cualquier otro mdulo de cdigo.
Adems del cdigo del proyecto, cualquier aplicacin tpica contar con al menos un form, que
tendr asociado un mdulo de cdigo. Por cada form adicional existir un mdulo adicional con el
cdigo correspondiente. Por ltimo tambin es posible tener otros mdulos no asociados a forms,
conteniendo objetos o procedimientos y funciones definidos por nosotros mismos.
Cada mdulo de cdigo asociado a un form contendr la definicin de un objeto, conteniendo los
componentes y mtodos de respuesta a eventos necesarios. Todos los forms se definen como
objetos descendientes del tipo TForm, que se caracteriza por contener los atributos comunes a
cualquier form. A la definicin del nuevo tipo de objeto se aadirn tantos miembros como
componentes insertemos en la ficha y tantos mtodos como eventos controlemos.

El cdigo del proyecto


A medida que vayamos aadiendo forms a nuestro proyecto, en el cdigo correspondiente, que
podemos visualizar mediante la opcin Project Source del men View, se irn aadiendo
entradas a la clusula Uses, relacionando todos los mdulos existentes en el proyecto principal. Por
lo dems, el cdigo del proyecto, que es por donde comenzar la ejecucin de la aplicacin, se

suele reducir a la creacin del form principal y al inicio de lo procesos necesarios para que dicho
form pueda interactuar con el usuario.

Archivos DFM
En el cdigo del mdulo asociado a un form no se almacenan los valores de las propiedades de
cada componente, como puede ser su posicin, dimensiones, ttulo, etc. Este tipo de informacin
se almacena en un archivo separado, con extensin DFM, que es incluido en la aplicacin durante la
compilacin, como si se tratase de un recurso.
Los archivos de definicin de componentes estn en un formato binario, que no es legible
directamente. Sin embargo, el propio editor de Delphi nos permite ver y editar el contenido de
estos archivos. Para ello lo nico que debemos hacer es pulsar el botn derecho del ratn sobre el
form, seleccionando la opcin View As Text. Tambin podemos pulsar la combinacin de teclas
<Alt + F12>. Al cargar el archivo ste aparecer en forma de texto en el editor, conteniendo por
cada componente su nombre, tipo y valores de las propiedades.
Aunque no es una tcnica habitual, el contenido de este archivo puede ser modificado en el editor
de cdigo. Para que las modificaciones tengan efecto deberemos convertir de nuevo el texto que
tenemos en el editor al formato del archivo DFM, para lo que bastar con salvarlo con dicha
extensin o simplemente volver a convertirlo en un form utilizando la misma combinacin de teclas
citada antes.

2.III. Propiedades de TForm


Nombre del componente
Cada uno de los componentes usados en una aplicacin, incluyendo en este conjunto los forms, ha
de tener un nombre nico que nos servir para hacer referencia a ellos de una forma inequvoca. El
nombre de los componentes se fija en tiempo de diseo, mediante la propiedad Name,
convirtindose en una propiedad de slo lectura durante la ejecucin.
En el momento en que se produce el cambio de nombre del componente, el cdigo generado por
Delphi se actualizar automticamente, por ejemplo en los mtodos de respuesta a eventos, sern
modificados.

Titulo del form


Su finalidad es la de identificar la ventana en tiempo de ejecucin. En principio, el ttulo del form
coincidir con el nombre que se haya asignado a ste, de tal forma que si modificamos la
propiedad Name el mismo valor ser asignado tambin a la propiedad Caption, que es la encargada
de mantener el ttulo de los componentes que cuentan con este elemento.
La asociacin entre las propiedades Name y Caption es temporal ya que, aunque en principio la
modificacin de la primera influye en la segunda, este lazo se rompe en el momento en que
nosotros modifiquemos el valor de Caption, introduciendo el ttulo que ms nos convenga. Dicho
ttulo es una cadena de caracteres, no un identificador, por lo que puede contener espacios en
blanco y otra serie de caracteres especiales no permitidos en un identificador como es Name.
Podemos alterar el ttulo de un form desde el interior del programa simplemente asignando un
nuevo valor a su propiedad Caption.

mbito de tipo
Para acceder a un miembro de un objeto debemos primero especificar el identificador del objeto,
seguido de un punto y el identificador del miembro que se desea manipular. Esto es lo que se llama
un referencia completa o cualificada, que nos permite acceder a identificar de forma inequvoca, ya
que en dos objetos distintos pueden existir miembros con los mismos nombres, pero, sin embargo,
no podemos tener dos objetos con el mismo nombre en el mismo mbito.

El cdigo que nosotros podemos escribir en el interior de un mtodo de respuesta a un evento, se


encuantra en el mbito del objeto. Al encontrarnos en el mismo mbito que el objeto, para acceder
a sus miembros no es necesario componer una referencia cualificada. De esta forma, para acceder
a la propiedad Caption del objeto Form1 desde un mtodo del propio objeto, no es necesario
componer la referencia Form1.Caption, basta con el nombre de la propiedad. Sin embargo, si
quisiramos acceder a esa misma propiedad de otro form o componente distinto, s que sera
necesaria la composicin de una referencia cualificada.

Posicin y dimensiones del form


A medida que un componente es desplazado y redimensionado, su posicin y tamao actuales
quedan almacenados en cuatro propiedades : Left contiene la coordenada horizontal, Top la
vertical, Width la anchura del componente y Height la altura, medidas todas stas expresadas en
puntos de pantalla. La posicin de cualquier componente de un form es relativa al interior de l,
mientras que la posicin de un form es absoluta, refirindose Left y Top a posiciones de pantalla.
Generalmente, en tiempo de ejecucin el form aparecer en la misma posicin en la que lo
situamos durante el diseo y con el mismo tamao, aunque por medio de la propiedad Position
podemos configurar ambos parmetros. Esta propiedad puede tomar cualquiera de los siguientes
valores:
poDesigned. Es el valor tomado por defecto, causando que el form aparezca en la misma
posicin y con el mismo tamao que se fij en tiempo de diseo.
poDefault. Dando este valor a Position, la posicin y el tamao del form irn cambiando con
cada ejecucin, tomando la posicin que les corresponda por defecto y el mayor tamao
posible.
poDefaultPosOnly. Esta opcin es una variacin de la anterior, en la que el tamao del form
permanece fijo, mientras que la posicin va cambiando con cada ejecucin.
poDefutoSizeOnly. Inversa a la anterior, conserva la posicin del form pero el tamao es
fijado en el momento de la ejecucin.
poScreenCenter. Por medio de esta opcin conseguiremos que el form permanezca con su
tamao original, modificndose su posicin para que aparezca ocupando el centro de la
pantalla.
La apariencia inicial de un form en pantalla tambin podemos fijarlo mediante la propiedad
WindowState, que puede tomar los valores wsNormal, wsMinimize y wsMaximize, segn deseemos
que la ventana aparezca en su estado normal, minimizada como un icono, o maximizada ocupando
la pantalla completa. Estos tres estados son independientes de las opciones que hayamos fijado
mediante la propiedad anterior.

El rea cliente
La existencia de una barra de ttulo, un borde de ms o menos grosor, unos botones, etc., limitan
el rea realmente "til" del form, que para nosotros es su interior, al que se denomina rea cliente.
Obviamente, al modificar el tamao de la ventana tambin estamos alterando las dimensiones del
rea cliente, ya que est ocupa todo el interior del form. Podemos conocer y modificar las
dimensiones del rea cliente mediante las propiedades ClientWidth (ancho) y ClientHeight (alto).

Proporciones generales
Por defecto el efecto de escalado no se produce, aunque la propiedad Scaled tiene al valor True.
Dando el valor True a esta propiedad activaremos el escalado, cuya proporcin vandr dada por el
valor que asignaremos a la propiedad PixelsPerInch. Dicho valor indica cuntos puntos de medida
entrarn en cada pulgada, por lo que cuanto ms grande sea el nmero, ms reducida aparecer el
form y viceversa. Dando el valor False a la propiedad Scaled desactivaremos el escalado, a pesar
de que hayamos asignado cualquier valor a PixelsPerInch.
Hay que tener en cuenta que no es lo mismo escalar el form que redimensionarlo. En este ltimo
caso lo que hacemos es cambiar el tamao del form, de tal forma que los componentes que hay en
su interior pueden quedar ocultos en parte. Al escalar un form automticamente se modifica
tambin el tamao de todos los componentes que hay en l, adecuando su tamao, que se
aumenta o reduce, para adecuarlo al del form.

Estilo y controles del form


Por defecto, un form contiene a la derecha de su barra de ttulo tres botones, mediante los cuales
podemos minimizar el form, maximizarlo o restaurarlo, o bien cerrarlo. En la esquina izquierda de
la barra tambin existe un icono, que nos permite acceder al tpico men de sistema que tienen la
mayora de las ventanas Windows. La existencia o no de estos controles en el form depender de
los valores que contenga la propiedad BorderIcons, que es un conjunto que puede contener tres
valores distintos: biMinize, que representa el primer botn de los tres que hay en la parte derecha
del form, biMaximize, representa al segundo de esos botones, biSystemMenu, al tercer botn y al
men de sistema.
A pesar de que en el inspector de objetos indiquemos que no deseamos en el form ciertos botones
de los descritos, hasta que no ejecutemos el programa, dichos controles permanecern activos
para permitir la manipulacin completa de la ventana.

El borde del form


Mientras estamos diseando un form, ste puede ser redimensionado sin ms lmites que los de la
propia pantalla, con el fin de ajustarlo a nuestras necesidades. Una vez que el programa es
ejecutado, las dimensiones del form podrn o no ser modificadas, por parte del usuario,
dependiendo bsicamente del valor que asignemos a la propiedad BorderStyle. Por defecto esta
propiedad toma el valor bsSizeable, lo que permite que durante la ejecucin el form pueda ser
redimensionado por el usuario simplemente utilizando el cursor del ratn sobre cualquiera de sus
extremos. Adems de este valor, la propiedad BorderStyle tambin puede tomar los siguientes:
bsSingle. Esta opcin hace que el borde del form aparezca algo menos grueso, adems de
no permitir redimensionarlo.
bsToolWindow. Como el anterior pero con una barra de ttulo menor, al estilo de las barras
de herramientas.
bsDialog. Asignando este valor no modificaremos el grosor del borde de la ventana,
evitando slo el redimensionamiento del form.
bsNone. Elimina el borde de la ventana, as como la barra de ttulo con todos sus controles.
bsSizeToolWin. Borde redimensionable con una barra de ttulo con todos sus controles.

Apariencia tridimensional
Las ltimas aplicaciones aparecidas para Windows 3.1 incorporaron en su mayora efectos
tridimensionales en ventanas y controles, hasta tal punto que Microsoft cre una librera cuya
finalidad era le de crear un estndar en este tipo de controles. En Windows 95 el propio sistema
operativo ha incrementado visiblemente los efectos tridimensionales en opciones de men,
botones, etc. Tambin nuestrar aplicaciones Delphi pueden contar con este aspecto, de hecho lo
hacen automticamente a no ser que modifiquemos el valor de la propiedad Ctl3D.
Por defecto esta propiedad tiene el valor True, haciendo, por ejemplo, que el fondo de los forms
sea gris, y los distintos controles existentes en l aparezcan como esculpidos. Dando el valor False
a esta propiedad desactivaremos el efecto tridimensional, de tal forma que el fondo del form ser
blanco, como el de cualquier ventana.
La propiedad Color nos permite modificar este color por defecto, pudiendo elegir entre un color
concreto, como pueda ser azul, rojo, negro, etc., o bien un color del sistema, por ejemplo el color
de la barra de ttulo d la ventana activa, el color de un botn pulsado, etc.

Forms y mens
Cualquier form Delphi puede tener asociado un men de opciones que aparecer bajo su barra de
ttulo. La propiedad encargada de mantener la referencia al men asociado al form es Menu. De
igual forma, podemos asociar un men emergente a una form, utilizando la propiedad PopupMenu.

Etiquetas de ayuda
En Delphi, la creacin de estas etiquetas de ayuda es de suma facilidad, lo nico que hemos de
hacer es asignar la cadena que queremos visualizar a la propiedad Hint del componente, dando
adems el valor True a la propiedad ShowHint. Estas propiedades las tienen prcticamente todos
los controles, incluidos los forms, aunque su uso ms habitual est asociado con los botones
existentes en las barras o paletas de herramientas.

Estado del form


En un momento determinado de la ejecucin de un programa, un form que estaba activo, de tal
forma que el usuario poda interactuar con ella, puede pasar a estar inactivo o incluso hacerse no
visible. El estado del form lo controlaremos bsicamente con dos propiedades, Enable y Visible.
Ambas pueden tomar los valores True y False, siendo el valor por defecto de las dos True.

Estilo del form


La propiedad FormStyle puede contener uno de cuatro valores indicando el estilo del form, que
habitualmente es fsNormal. Este estilo normal se corresponde con un form de carcter
independiente, que no puede contener otras ventanas en su interior ni ser a su vez contenido en
otra ventana.
Es posible crear un form que acte como marco para utilizar mltiples forms relacionados entre s.
Al primero lo denominaremos ventana marco o principal, cuyo estilo ser fsMDIForm, mientras que
a los distintos forms que existan en su interior les llamaremos ventanas hija, siendo el estilo
correspondiente fsMDIChild.
El cuarto valor que es posible dar a FormStyle nos permite crear una ventana que no ser ocultada
cuando otra ventana se active, siepre estar sobre las dems, este estilo es fsStayOnTop.

Iconos y cursores
Por defecto, el icono que aparece en la barra de ttulo de un form y con el que se representa el
mismo cuando se minimiza, es el mismo icono de la aplicacin, a no ser que nosotros
establezcamos uno distinto mediante la propiedad Icon. Esta propiedad es en realidad un objeto,
con sus propiedades, eventos y mtodos. En tiempo de diseo, podemos cargar un icono mediante
el editor que aparecer al pulsar en los puntos suspensivos que aparecen a la derecha. En tiempo
de ejecucin, necesitaremos como nico parmetro el nombre del archivo en que se encuentra el
icono.
Por defecto, al pasar sobre el rea cliente de un form, el cursor del ratn es una flecha, pero
podemos cambiar a cualquier otro aspecto modificando el valor de la propiedad Cursor. La
enumeracin de valores que es posible asignar a Cursor la podemos ver desplegando la lista de
esta propiedad en el Inspector de objetos.

Estilos de letra
Los distintos controles que insertemos en un form pueden utilizar un tipo y estilo de letra de
nuestra eleccin, para lo cual nos serviremos de la propiedad Font, que es en realidad un objeto del
tipo TFont. Al modificar esta propiedad del form, generalmente no observamos cambio alguno, ya
que los efectos se producirn en el momento en que insertemos algn control, cuya propiedad Font
tomar los mismos valores que hayamos asignado a dicha propiedad en el form.
Las propiedades con que cuenta un objeto TFont nos permiten seleccionar el tipo de letra, color,
tamao, estilo, etc. Podemos modificar dichas propiedades en tiempo de diseo mediante el
Inspector de objetos, as como acceder a ellas en tiempo de ejecucin. Estas propiedades son:

Color: Establece el color del texto. Hay que recordar que con la propiedad Color del form
fijbamos el color de fondo de la ventana.
Height y Size. Ambas propiedades tienen una misma finalidad: especificar el tamao del
tipo de letra, bien facilitando su altura o el tamao de los puntos.

Name. Asignando a esta propiedad el nombre de un tipo de letra conseguiremos


seleccionarlo. En el Inspector de objetos podremos seleccionar cualquiera de los tipos
desde una lista desplegable, mientras que durante la ejecucin tendremos que asignar a
esta propiedad una cadena conteniendo especficamente el tipo.
Style. Se trata de un conjunto, que puede contener los valores fsBold, fsItalic, fsUnderline
y fsStrikeOut, segn lo cual el texto aparecer o no en negrita, itlica, subrayado o
tachado.

Barras de desplazamiento
El uso automtico de barras de desplazamiento est controlado por la propiedad AutoScroll, que
por defecto tiene el valor True.
Las caractersticas de las barras de desplazamiento pueden ser alteradas mediante las propiedades
HorzScrollBar y VertScrollBar, dos objetos que representan respectivamente a la barra de
desplazamiento horizontal y vertical. En el caso de un form, las propiedades de estos objetos
toman sus valores automticamente, dependiendo del tamao de dicho form.

Otras propiedades
En un form encontraremos asimismo otros tambin editables en tiempo de diseo. Estas
propiedades son:
ActiveControl. Cuando un form con diversos componentes se muestra inicialmente, el
control toma uno de los componentes, que ser el que est activo en principio. Al desplegar
la lista asociada a esta propiedad en el Inspector de objetos podremos seleccionar cul ser
dicho control.
HelpContext. Mediante esta propiedad podemos asociar al form una determinada pgina de
ayuda contextual.
ObjectMenuItem. Esta propiedad nos permitir establecer una opcin de men que se har
activa cuando en el form se est trabajando con un campo OLE.
PrintScale. Es posible imprimir un form con una simple llamada a un mtodo del objeto
TForm. Antes necesitaremos especificar la escala con la que deseamos que se realice la
impresin. Las opciones posibles son poNone, poProportional y poPrintToFit, segn
deseemos no mantener proporcin alguna, imprimir el mismo nmero de puntos en
impresora que en pantalla o bien ocupar el mayor espacio posible en la pgina
manteniendo la proporcin del form, respectivamente.
Tag. Se trata de una propiedad que no tiene significado alguno ni es usada por ninguno de
los objetos que cuentan con ella. Su finalidad es permitirnos guardar cualquier valor entero
que necesitemos asociar al objeto.
KeyPreview. Por defecto el valor de esta propiedad es False, de tal forma que las
pulsaciones de tecla que se produzcan durante la ejecucin del programa vayan
directamente al control del form que en ese momento est activo. Dndole el valor True a
esta propiedad conseguiremos que dichas pulsaciones sean enviadas antes al form y
despus al control que est activo, permitiendo as su intercepcin.

Controles y componentes
Podemos conocer en tiempo de ejecucin el nmero de componentes y controles que existen en un
form, mediante las propiedades ComponentCount y ControlCount. Recordemos que un componente
es cualquiera de los elementos existentes en un form, mientras que un control es un componente
que cuenta con una interfaz, se trata de un elemento visual.
Conociendo el nmero de componentes y controles, podemos acceder a cualquiera de ellos usando
las matrices Components y Controls, que son otras dos propiedades del form. Estas matrices
contendrn tantos elementos como nos indiquen ComponentCount y ControlCount,
respectivamente, siendo la base de los ndices el cero. Una vez que accedamos a un elemento de
cualquiera de estas dos matrices podemos determinar su tipo, realizar las conversiones necesarias
y manipular sus propiedades.

Superficie de trabajo
Un form de Delphi tiene una correspondencia directa con una ventana Windows, que es
habitualmente manipulado por medio de un identificador o handle, que podremos obtener
mediante la propiedad Handle. Este identificador podremos usarlo con cualquiera de las funciones
Windows que hacen uso de l, como puede ser BitBlt.
Un mtodo ms simple y recomendable para trabajar sobre un form consiste en usar el valor de la
propiedad Canvas, que es un objeto que representa todo el espacio interior de la ventana y que
cuenta con una serie de mtodos que nos permitirn escribir texto, dibujar, etc.

Forms MDI
Un form tambin cuenta con una serie de propiedades que facilitan el trabajo con ventanas MDI,
conteniendo ventanas hijas en su interior. Mediante la propiedad MDIChildCount podremos saber el
nmero de ventanas hijas existentes en un determinado momento, dato que nos servir para
acceder a los elementos de la matriz MDIChildren, cada uno de los cuales representa a una
ventana hija.

2.IV. Eventos de TForm


Eventos generados por el ratn
Hay varios eventos posibles:
OnMouseMove. Este evento es recibido por un componente a medida que el cursor del
ratn se mueve sobre l. Este evento lleva asociados varios parmetros, como son X e Y,
que representan la posicin actual del cursor expresada en puntos, y Shift, un conjunto
que puede contener valores dependiendo de qu teclas y botones estn pulsados mientras
el ratn se mueve.
Valor

Corresponde a...

ssShift

Una de las teclas de mayscula.

ssAlt

La tecla <ALT>.

ssCtrl

La tecla <Control>.

ssRight

El botn derecho del ratn.

ssLeft

El botn izquierdo del ratn.

ssMiddle

El botn central del ratn.

ssDouble Los botones izquierdo y derecho del ratn.

OnMouseDown. Se genera cuando se pulsa cualquiera de los botones del ratn,


recibindolo aquel control que en ese momento se encuentra bajo el cursor. Adems de los
parmetros X,Y y Shift, con el mismo significado que en OnMouseMove, el mtodo de
respuesta a este evento tambin recibir el parmetro Button, que nos permitir saber
qu botn ha sido el que ha producido el evento. Los valores posibles son mbRight, mbLeft
y mbMiddle, segn se trate del botn derecho, izquierdo o central.
OnMouseUp. Cada vez que se libera un botn del ratn sobre un control, ste recibe el
evento OnMouseUp, cuyos parmetros son idnticos a los del evento anterior.
OnClick. Aunque este evento tambin puede venir producido por la pulsacin de la barra
espaciadora sobre un control o la pulsacin de la tecla <Intro> o <Escape>, en la mayora
de las ocasiones denota una pulsacin en el botn izquierdo del ratn sobre algn control.
OnDblClick. Este evento lo recibir un control cuando se realice una doble pulsacin con el
botn izquierdo del ratn, teniendo el cursor situado sobre dicho control.

Eventos de teclado

Aunque generalmente un form no recibe directamente las pulsaciones de teclado, sino que stas
van directamente a alguno de los controles, es posible interceptarlas. Los eventos que nos
permitirn hacerlo son:
OnKeyDown. Se produce al pulsarse una tecla, cuyo cdigo es facilitado en el parmetro
Key. Al igual que los eventos de ratn, tambin se recibe el parmetro Shift, mediante el
cual podremos saber si hay pulsadas otras teclas o botones de ratn. Tengamos en cuenta
que el cdigo recibido no es el cdigo ASCII, sino el cdigo virtual de la tecla pulsada.
OnKeyUp. Este evento se genera al liberar una tecla. El mtodo de respuesta
correspondiente recibir los mismos parmetros descritos en el evento OnKeyDown.
OnKeyPress. A diferencia de lo que ocurre con OnKeyDown, que se genera con cualquier
tecla alfanumrica, de funcin, control, etc., este evento slo se produce por la pulsacin
de las teclas "normales", excluyendo de este conjunto las de funcin, edicin y, en general,
todas aquellas que no dispongan de cdigo ASCII. El parmetro Key que se recibe como
parmetro corresponde precisamente al cdigo ASCII de la tecla pulsada.
Tanto OnKeyDown como OnKeUp reciben un cdigo de tecla y no un cdigo ASCII del carcter
pulsado. Esto les permite detectar la pulsacin de aquellas teclas que no tienen asociado un
carcter, como puedan ser las de funcin o las de edicin. Los cdigos de teclas estn
representados por una serie de constantes que comienzan con las iniciales VK_.
Constante
VK_0,VK_1, ..., VK_9

Tecla que representa


Los dgitos del 0 al 9.

VK_NUMPAD0, VK_NUMPAD1 Los dgitos del 0 al 9 de parte numrica


VK_A, VK_B, ..., VK_Z

Las teclas de la A a la Z.

VK_BACK

Borrado hacia atrs

VK_TAB

Tabulador

VK_RETURN

Intro

VK_SHIFT

Maysculas

VK_CONTROL

Control

VK_MENU

Alt

VK_PAUSE

Pausa/Inter

VK_CAPITAL

Fija Mayscula

VK_ESCAPE

Escape

VK_SPACE

Barra Espaciadora

VK_PRIOR

RePg

VK_NEXT

AvPg

VK_END

Fin

VK_HOME

Inicio

VK_LEFT

Flecha hacia izquierda

VK_RIGHT

Flecha hacia derecha

VK_UP

Flecha hacia arriba

VK_DOWN

Flecha hacia abajo

VK_INSERT

Insert

VK_DELETE

Supr

VK_ADD

+ en teclado numrico

VK_SUBSTRACT

- en teclado numrico

VK_MULTIPLY

* en teclado numrico

VK_DECIMAL

. en teclado numrico

VK_DIVIDE

/ en teclado numrico

VK_F1, VK_F2, ..., VK_F12

Teclas de funcin

VK_NUMLOCK

BloqNum

VK_SCROLL

BloqDespl

Arrastrar y soltar
Relacionados con esta operacin un form puede recibir los dos siguientes eventos:
OnDragOver. Se produce cuando sobre un determinado control se desplaza un elemento
que est siendo "arrastrado". Adems del parmetro Sender se recibe otro parmetro del
tipo TObject; Source, que nos permitir acceder al componente que est siendo objeto de
la operacin de arrastrar y soltar. Mediante los parmetros X e Y podremos conocer la
posicin actual del evento. Mediante el parmetro State obtendremos informacin acerca
del estado de la operacin. Dicho parmetro puede tomar los valores dsDragEnter,
dsDragMove o dsDragLeave, segn que el objeto arrastrado acabe de entrar sobre el
control, se est moviendo sobre l o lo acabe de abandonar, respectivamente. Por ltimo
encontramos el parmetro Accept, una variable de tipo Boolean a la que tendremos que
asignar el valor True si el objeto arrastrado puede ser soltado sobre el control, o False en
caso contrario.
OnDragDrop. A diferencia del evento anterior, que puede recibirse mltiples veces a medida
que el objeto arrastrado se mueve por el control, el evento OnDragDrop slo se recibe
cuando dicho objeto es "soltado" sobre el control, liberando la pulsacin del botn izquierdo
del ratn. El mtodo de respuesta a este evento recibir los parmetros X, Y y Source,
conteniendo respectivamente las coordenadas donde el objeto ha sido soltado y una
referencia del mismo.

Otros eventos de TForm

OnCreate. Se genera cuando el form va a ser creado, permitiendo as establecer valores


iniciales en las propiedades, variables del objeto o cualquier otra operacin previa a la
creacin.
OnActive. Este evento se produce en el momento en que el form se convierte en la ventana
activa en el entorno.
OnShow. Antes de que un form se haga visible, siempre se genera el evento OnShow,
permitiendo as realizar cualquier operacin previa a la visualizacin.
OnHide. De forma similar al evento anterior, ste se produce justo antes de que el form sea
ocultado.
OnDeactivate. Este evento se genera cuando el form se vuelve inactivo, porque se haya
cambiado a otra ventana o aplicacin.
OnClose. Cuando un form ha dejado de ser til en pantalla, lo habitual es cerrarlo, bien
mediante uno de los controles de la ventana o utilizando un mtodo del objeto. Antes de
realizar el cierre de la ventana se generar este evento, que recibe como parmetro una
variable llamada Action, a la cual asignaremos uno de estos valores.
Valor
caFree

Significado
El form es cerrado

caMinimize El form no se cierra, simplemente se minimiza

caHide

El form no se cierra, se oculta

caNone

No se permite el cierre del form

OnCloseQuery. Al igual que el anterior, este evento se genera cuando se va a cerrar el


form, recibindose como parmetro la variable CanClose, a la que daremos el valor True o
False, dependiendo de que se permita o no dicho cierre, respectivamente.
OnDestroy. Generalmente un form que no va a ser utilizado ms en el programa, depus
de cerrarse ocultndose se destruye, liberando la memoria que ocupaba. Este evento se
produce en ese momento.
OnEnter y OnExit. A medida que los distintos componentes de un form se van haciendo
activos o inactivos, por el desplazamiento entre ellos, se irn generando porque es su
primera visualizacin o bien porque se activa cuando tena otras ventanas encima que
ocultaban parte de su contenido.

OnResize. Cada vez que el tamao de un form sea modificado durante la ejecucin se
generar este evento, que podemos aprovechar para modificar la disposicin de los
controles en su interior segn el nuevo tamao.

2.V. Mtodos de TForm


Mostrar y ocultar el form
El form principal de una aplicacin se muestra automticamente cuando sta se ejecuta, a no ser
que hayamos dado durante el diseo el valor False a la propiedad Visible. Otros forms que puedan
existir en el proyecto no se visualizan hasta que nuestro programa no las necesita.
Para hacer visible un form haremos uso del mtodo Show, que lo visualizar habitualmente
disponindolo sobre las dems ventanas que en ese momento estn abiertas. En caso de que el
form ya est visible y lo que deseemos sea disponerla en esa posicin, sobre las dems, porque
est oculto en parte, en lugar de Show podemos usar el mtodo BringToFront. El mtodo
SendToBack tiene la funcionalidad contraria, enviar la ventana al fondo de la pantalla, debajo de
todas las dems ventanas.
Cualquier form, incluido el principal, puede ser ocultado hacindolo no visible. Para ello bastar con
llamar al mtodo Hide. Al ocultar el form de esta forma conseguiremos que no sea accesible por
parte del usuario de la aplicacin, ya que no aparecer en la barra de tareas. El form en realidad no
se ha cerrado, por lo que es perfectamente vlido el acceso a sus componentes, propiedades y
mtodos.
Cuando un form no vaya a ser utilizado ms en el programa, en lugar de ocultarlo podemos
cerrarlo, llamando al mtodo Close. Este previamente generar el evento OnCloseQuery, para
asegurarse de si la ventana puede cerrarse, y depus proceder a minimizarla, ocultarla o
destruirla, dependiendo del valor obtenido del evento OnClose. En caso de que se desee destruir la
ventana, se usar el mtodo Destroy, que tiene esa finalidad. Una vez que el form ha sido
destruida no ser posible volver a acceder a sus miembros, ya que en realidad la referencia al form
habr dejado de ser vlida.

Imagen del form


Mediante el mtodo Print podemos obtener una copia impresa del form, que tendr las
caractersticas que se hayan fijado previamente en la propiedad PrintScale.
Si lo que deseamos es almacenarla o manipularla, deberemos usar el mtodo GetFormImage, una
funcin que nos devolver un objeto del tipo TBitmap conteniendo los puntos que forman el form.

3.I. Etiquetas de texto: Label


En al paleta de componentes Standard tenemos un control representado por el botn
cuyo
nombre es Label. Mediante este control podremos mostrar un texto esttico en el form, fijando su
posicin, color de letra, tamao y, obviamente, el texto a mostrar.

Valores Iniciales
Al insertar un control Label en el form, mediante cualquiera de los mtodos que vimos en los
captulos anteriores, algunas propiedades tomarn un valor inicial por defecto, que generalmente
tendremos que modificar. Por ejemplo, la propiedad Name tomar el valor Label1, Label2,, etc., al
igual que la propiedad Caption. Otras propiedades, como Left y Top, tomarn su valor dependiendo
de la posicin en la que situemos el control. Por ltimo encontramos un tercer grupo de
propiedades cuyo valor por defecto habitualmente no modificaremos, por ejemplo, la propiedad
Visible de una etiqueta por regla general siempre ser True, ya que de lo contrario el texto no sera
visible.

Tras insertar la etiqueta, lo primero que tendremos que hacer es asignarle un nombre al control,
para lo que modificaremos el valor de la propiedad Name mediante el Inspector de objetos.
El valor almacenado en la propiedad Caption ser el texto que se mostrar en la etiqueta y que,
inicialmente, coincide con el nombre del control, es decir, por defecto Name y Caption tienen el
mismo valor. Al modificar el nombre de este control, el valor de Caption tambin se modificar
automticamente tomando el mismo valor, pero esto no volver a ocurrir desde el momento en que
manualmente asignemos un nuevo valor a Caption.

Posicin, tamao y alineacin


La posicin que inicialmente tenga un control en el form depende directamente del mtodo que
hayamos usado para insertarlo. Realizando un doble click con el ratn sobre el control, en la Paleta
de componentes, la posicin inicial ser el centro de la form, pero tambin podemos pulsar el
control y posteriormente "pinchar" en la posicin del form donde deseamos situarlo. Tambin es
posible mover posteriormente el control, "arratrndolo" sobre la superficie del form. La posicin de
un control en el form estar determinada por los valores de la propiedades Left y Top, que
contienen las coordenadas horizontal y vertical, respectivamente, expresadas en puntos relativos a
la posicin de origen del form. Esto quiere decir que si Left tiene valor 0, el control estar pegado
al margen izquierdo del form y, de forma similar, si el valor de Top es 0, el control estar en la
parte superior del form.
El tamao o dimensiones de un control se almacenan en las propiedades Width (ancho) y Height
(alto), existiendo tambin unos valores por defecto. El valor de estas propiedades puede tambin
ser modificado mediante el Inspector de objetos, introduciendo el nmero de puntos de ancho y
alto que deseamos que tenga el control, o bien visualmente, tomando uno de los mrgenes del
control con el cursor del ratn y estirndolo o encogindolo.
Cuando el contenido de una etiqueta de texto va a ser establecido durante el diseo, no hay
problemas en fijar las dimensiones adecuadas, pero el caso es distinto cuando el texto a mostrar se
va a fijar durante la ejecucin; en este caso puede servirnos de ayuda la propiedad AutoSize, a la
que dndole el valor True provocar que las dimensiones del control se ajusten con exactitud a su
contenido, en este caso al texto. Otro mtodo para controlar la posicin y dimensiones de un
control lo obtenemos a partir de la propiedad Align, que puede tomar los valores de la tabla que
vemos a continuacin. Segn el valor asignado, el control se ajusta al margen correspondiente,
incluso si posteriormente el form se redimensiona. La propiedad Align controla la alineacin de un
control en el contenedor en el que se encuentra. En este caso, el control, una etiqueta de texto,
est en el interior de un form que acta como contenedor.
Valor

El control se ajusta a...

alNone

Conserva la posicin y dimensiones originales

alTop

Margen superior del contenedor

alBottom Margen inferior del contenedor


alLeft

Margen izquierdo del contenedor

alRight

Margen derecho del contenedor

alClient

Todo el espacio disponible en el contenedor

En caso de que las dimensiones del control sean superiores a las necesarias para mostrar el texto
asignado a Caption, ste puede aparecer alineado a la izquierda, derecha o bien centrado. Esta
alineacin depender del valor que se asigne a la propiedad Alignment, que habr de ser:
Valor
taLeftJustify

Ajuste de texto
A la izquierda

taRightJustify A la derecha
taCenter

Centrado

Si la cantidad de texto a mostrar en la etiqueta hace necesaria la distribucin en varias lneas, en


lugar de utilizar varios controles Label, podemos dar el valor True a la propiedad WordWrap; as se
consigue que el texto asignado a la propiedad Caption se divida en las lneas que sean necesarias,
dependiendo de la anchura que hayamos dado al control.
En cualquier momento podemos obtener las coordenadas correspondientes a las cuatro esquinas
de una etiqueta de texto, consultando el valor de la propiedad BoundRect. Esta propiedad es un
registro del tipo TRect, conteniendo en su interior cuatro miembros: Left, Top, Right y Bottom, que
almacenan la columna izquierda, la fila superior, la columna derecha y la fila inferior
respectivamente.

Familia, Estilo y Tamao de Letra


El texto de una etiqueta puede aparecer en pantalla usando cualquiera de las familias de letras de
Windows, en cualquier tamao y con los estilos que estn disponibles. Todas estas caractersticas
de una etiqueta de texto se encuentran almacenadas en la propiedad Font, que es en realidad un
objeto del tipo TFont. Como tal objeto, la propiedad Font tiene a su vez sus propias propiedades,
eventos y mtodos, que son los que nos permitirn modificar los atributos del texto.
Para establecer los atributos del texto durante el diseo, en realidad no tenemos por qu
preocuparnos de las propiedades de Font, ya que bastar con pulsar los puntos suspensivos que
aparecen a la derecha de esta propiedad elegir el tipo de letra, su tamao, estilo y color. Estos
valores sern pasados posteriormente, cuando pulsemos el botn OK, al objeto Font, mostrndose
el nuevo aspecto de la etiqueta de texto.
Sin embargo, si deseamos modificar los atributos del texto durante la ejecucin del programa,
tendremos que conocer las particularidades del tipo TFont.

El tipo de letra
Como sabemos, en Windows, a cada familia o tipo de letra se le conoce mediante un nombre, como
puede ser Courier o Roman, por poner dos ejemplos. El tipo de letra de un objeto TFont se
almacena en la propiedad Name, en forma de cadena de caracteres, por lo que si queremos que en
el texto aparezca una cadena con el tipo Courier, lo nico que debemos hacer es asignar a la
propiedad Name una cadena con ese nombre.

Tamao de letra
Con la propiedad Size facilitaremos el tamao de letra asignando un nmero con el que
especificaremos el tamao en puntos de la propia letra, sin contar con el espacio adicional que es
necesario para su visualizacin. El tamao en puntos es el mtodo ms utilizado habitualmente, ya
que es la tcnica que emplean la mayora de los programas de dibujo, diseo y procesadores de
texto.
El contenido de la propiedad Height, por el contrario, se refiere a la altura del tipo de letra ms el
espacio adicional necesario para su visualizacin. Siempre que para fijar el tamao de letra usemos
la propiedad Size, el valor de Height ser negativo y viceversa.

El estilo
Para conocer y modificar el estilo de lerta de un objeto TFont usaremos la propiedad Style, que es
un conjunto que puede contener los siguientes valores:
Constante Estilo correspondiente
fsBold

Negrita

fsItalic

Cursiva Itlica

fsUnderline Subrayada
fsStrikeOut Tachada

Para poder determinar si una de estas constantes se encuentra o no en el conjunto tendremos que
utilizar el operador Is.

Color del texto


Tambin mediante la propiedad Font de la etiqueta de texto se podr controlar el color con que
ste aparecer, gracias a la propiedad Color del tipo Font. Esta propiedad puede tomar cualquiera
de los valores del tipo TColor.
Constante

Color

clBlack

Negro

clMaroon

Marrn

clGreen

Verde

clOlive

Verde oscuro

clNavy

Azul marino

clPurple

Prpura

clTeal

Verde agua

clGray

Gris

clSilver

Gris claro

clRed

Rojo

clLime

Verde claro

clBlue

Azul

clFuchsia

Fucsia

cAqua

Azul celeste

clWhite

Blanco

Anchura de carcter
Ciertas familias de letras son de espacio fijo, es decir, sus caracteres tienen todos el mismo ancho,
mientras que otras son de espacio variable. Mediante la propiedad Pitch del tipo TFont, podemos
asignar cualquiera de los valores mostrados en la siguiente tabla.
Constante

Tipo de espacio

fpDefault

El usado por defecto por el tipo de letra

fpVariable

De anchura variable

fpFixed

De anchura fija

El color de fondo
Mediante la propiedad Color de la etiqueta de texto nosotros podemos seleccionar otro color
distinto, sobre el que aparecer dibujado el texto.
Al tener la etiqueta de texto un fondo opaco, ya sea del color del form o de cualquier otro que
queramos fijar, cualquier control que quede bajo la extensin del texto no ser visible, a no ser que
demos el valor True a la propiedad Transparent.

Asociacin a otros controles


Uno de los usos ms frecuentes del control Label es el de servir de ttulo para otros controles,
como pueden ser campos de edicin, listas, etc., que se caracterizan por no tener una propiedad
Caption, a diferencia de un etiqueta de texto o de un botn.

Cuando utilicemos una etiqueta para esto, en el texto podemos incluir una tecla de acceso rpido,
similar a la de los botones, de tal forma que al pulsarla se active el control asociado a la etiqueta.
Para hacer esto lo primero que tendremos en cuenta es el valor de la propiedad ShowAccelChar,
que por defecto es True. Esto permite la inclusin en el texto y de otro control, que habr de existir
ya en el form. Si accedemos en el inspector de objetos a la propiedad FocusControl veremos que
en la columna de valor aparece una lista, conteniendo los nombres de todos los controles que
puedan ser activados.

Otras propiedades del control label


Es posible establecer etiquetas de ayuda a las etiquetas de texto, al igual que a la mayora de los
componentes Delphi. Para ello lo primero que tendremos que hacer ser dar el valor True a la
propiedad ShowHint, activando as la visualizacin de la etiqueta de ayuda, cuyo texto
introduciremos en la propiedad Hint.
La visualizacin de la etiqueta de ayuda tambin se llevar a cabo si el valor de la propiedad
ParentShowHint es True y la propiedad ShowHint del componente en el que se haya incluida la
etiqueta tiene el mismo valor.
Una etiqueta de texto puede ser visible o no visible, y estar o no activa. Estos estado dependen de
los valores que asignemos a las propiedades Visible y Enabled, respectivamente, que pueden ser
True o False.
Mediante la propiedad Cursor podemos fijar la apariencia que tomar el cursor del ratn al
desplazarlo sobre la etiqueta de texto. Esta prpiedad puede tener uno de estos valores:
Constante

Forma del cursor

crDefault

La que tenga actualmente

crArrow

El puntero habitual en forma de flecha inclinada

crCross

Una cruz

crBeam

El cursor de texto

crSize

Cuatro flechas unidas indicando reposicionamiento

crSizeNESW Flecha doble indicando cambio de tamao


crSizeNS

Flecha doble indicando cambio de tamao

crSizeNWSE Flecha doble indicando cambio de tamao


csSizeWe

Flecha doble indicando cambio de tamao

crUpArrow

Flecha vertical con la punta hacia arriba

crHourglass Reloj de arena


crDrag

Flecha con documento indicando arratrar y soltar

crNoDrop

Seal de prohibido

crHSplit

Doble flecha horizontal

crVSplit

Doble flecha vertical

Al igual que la mayora de los componentes Delphi, las etiquetas de texto cuentan tambin con la
propiedad Tag, que podemos usar para almacenar cualquier dato asociado al control.
Mediante la propiedad ComponentIndex que tienen todos los componentes, por lo tanto tambin
las etiquetas de texto, podremos conocer el ndice de un determinado control en una matriz.

Mtodos de label
Una etiqueta de texto adems de con propiedades, tambin cuenta con mtodos, que son
procedimientos y funciones.

Dos de estos mtodos son BringToFront y SendToBack, que nos permiten alterar el orden de
profundidad del control en el form, haciendo que aparezca por encima o por debajo de los dems
respectivamente.
Para ocultar un control o mostrarlo podemos usar mtodos Show y Hide, respectivamente, que al
igual que los anteriores no necesitan parmetro alguno. Una llamada al mtodo Show equivale a
darle el valor True a la propiedad Visible, mientras que la llamada a Hide sera equivalente a
asignar el valor False.
Anteriormente hemos visto las propiedades que nos permiten modificar durante la ejecucin la
posicin y dimensiones de un control. En caso de que necesitemos modificar varias de estas
propiedades podemos usar el mtodo SetBounds, que nos permite realizar las modificaciones en un
solo paso. Al llamar a este mtodo pasaremos cuatro parmetros, especificando los valores
correspondientes a las propiedades Left,Top,Width y Height.

3.II. El control Edit


Uno de los controles que nos permiten la entrada de datos por teclado es el que aparece en el
botn

que recibe el nombre de Edit.

Propiedades Generales
El nombre del control lo fijaremos en la propiedad Name, al igual que en cualquier otro
componente. La posicin y dimensiones de un control Edit vienen determinadas por las
propiedades Left,Top,Width y Heigth, ya conocidas.
Las propiedades Visible y Enabled controlan el estado del control, que puede ser visible o no y
estar activado o no. Para facilitar una etiqueta de ayuda usaremos la propiedad Hint, junto con
ShowHint si es necesario. El color de fondo del campo de entrada ser fijado mediante la propiedad
Color, mientras que los atributos del texto los estableceremos mediante la propiedad Font. Es
posible fijar una determinada figura para el cursor del ratn al pasar sobre el campo de edicin,
asignando el valor apropiado a la propiedad Cursor. Al igual que el resto de componentes
insertados en una ficha, un control Edit es un elemento de la matriz Components del form, cuyo
ndice podemos obteber mediante la propiedad ComponentIndex.
En el control Edit, la propiedad AutoSize, que puede tomar los valores True o False, controla el
ajuste automtico del control a las dimensiones del tipo de letra que se vaya a utilizar. Si damos a
esta propiedad el valor False y modificamos posteriormente el tipo o tamao de letra, podremos
ver cmo el control queda parcialmente vaco o bien no es suficiente grande como para mostrar el
contenido.
A diferencia de lo que ocurre con el control Label, en un campo de edicin la propiedad Align no
est disponible en tiempo de diseo, por lo que si deseamos ajustar el control en una determinada
posicin de la ficha tendremos que hacerlo en tiempo de ejecucin, asignando el valor
correspondiente a esta propiedad.

Contenido del Campo Edicin


El control Edit no tiene una propiedad Caption, ya que no dispone de un ttulo esttico. El texto
que aparece en ese control se puede editar en tiempo de ejecucin y se almacena en la propiedad
Text. Podemos asignar cualquier valor inicial que nos interese a esta propiedad, valor que
aparecern en el campo de edicin al ejecutar el programa, siendo posible su modificacin. La
longitud mxima del texto que es posible introducir en este control la podemos establecer
asignando a la propiedad MaxLength el mximo nmero de caracteres que deseamos admitir.
Inicialmente esta propiedad tiene el valor cero, indicando que en principio no existe un lmite. En
cuanto el valor sea distinto de cero, el mximo nmero de caracteres ser ese valor introducido.
Para editar el contenido de un control Edit durante la ejecucin, utilizaremos las teclas habituales
en cualquier aplicacin Windows (podemos movernos con los cursores, podemos usar la tecla de
borrar, etc).

Control de la Entrada
Adems de controlar la longitud mxima del texto mediante MaxLength, tambin podemos
convertir automticamente todas las letras introducidas en maysculas a minsculas, o en
minsculas a maysculas, segn el valor que asignemos a la propiedad CharCase. Estos valores
pueden ser:
Constante
ecNormal

Conversin realizada
No se realiza conversin alguna

ecLowerCase Todas las maysculas a minsculas


ecUpperCase Todas las minsculas a maysculas
Mediante la propiedad Modified podemos saber si el contenido del campo de edicin ha sido
modificado o no. Cuando el control se crea inicialmente, esta propiedad tiene el valor False. Esta
propiedad, en cualquier momento en que el usuario introduzca cualquier carcter o edite el valor
inicial del campo tomar el valor True. Podemos dar el valor False a esta propiedad en cualquier
momento que nos interese, de tal forma que en una posterior comprobacin sepamos si se ha
modificado o no.
Inicialmente la finalidad de un control Edit es permitir la entrada o edicin de un texto, pero puede
darse el caso de que nos interese utilizar este tipo de control slo para mostrar una informacin,
permitiendo desplazarse por ella pero no permitiendo modificarla. Para conseguir esto lo nico que
tenemos que hacer es dar el valor True a la propiedad ReadOnly, que inicialmente tiene el valor
False.
En caso de que utilicemos un campo de edicin para pedir algn dato confidencial, como pueda ser
un nmero secreto o palabra de acceso, podemos hacer que la informacin introducida por teclado
no se refleje en pantalla, sustituyendo cada uno de los carcteres por un cierto carcter, que
deberemos asignar a la propiedad PasswordChar.

Selecin de Texto
Podemos conocer la posicin a partir de la cual se ha marcado un texto consultando la propiedad
SelStart, que contendr la posicin del primer carcter que se haya marcado, teniendo en cuenta
que el primer carcter por la izquierda es el 0, el siguiente el 1, etc. Tambin podemos conocer la
longitud del texto marcado, o lo que es lo mismo, el nmero de carcteres existentes en la
seleccin, mediante la propiedad SelLength. Una tercera propiedad, SelText, nos servir tanto para
obtener el texto que se encuentra seleccionado en el control, como para cambiarlo por otro
simplemente asignndolo a esta propiedad.
Cuando en un control se ha marcado una porcin de texto, esta seleccin permanece hasta que
realiza un movimiento del cursor, permaneciendo an cuando nos desplacemos de este control a
otro que exista enl form. Cuando esto ocurre, el texto que tenamos marcado puede permanecer
as o bien mostrarse normal, volviendo a visualizarse marcado al volver a entrar en el campo. Este
comportamiento es controlado mediante la propiedad HideSelection, que puede tomar el valor
True, ocultando la seleccin cuando se sale del control, o False, dejndola visible. Por defecto esta
propiedad tiene el valor True.
En principio, cada vez que se pasa el control a un campo de edicin, hacindolo activo, todo el
contenido de ste se selecciona automticamente, independientemente del ltimo texto que se
hubiese marcado. Esto es debido a que la propiedad AutoSelect tiene por defecto el valor True,
indicando al control que cada vez que se active seleccione todo el contenido. Si damos a esta
propiedad el valor False, al volver a un campo en el que anteriormente se haba marcado una
porcin de texto, podremos ver que sigue activa la misma seleccin.

Activacin de los Controles


Por regla general, para pasar de un control a otro en un form utilizaremos la tecla <Tabulador>.
Tambin puede usarse la combinacin <Maysculas>+<Tabulador> para ir en sentido inverso.
Obviamente se puede activar un cierto control situando el puntero del ratn sobre l y pulsando el
botn izquierdo. En caso de que nos interese que un cierto control se active mediante la pulsacin

de la tecla <Tabulador>, formando parte del recorrido de controles del form, tan slo hemos de
darle el valor False a la propiedad TabStop, que por defecto es True. Al hacer esto no podremos
acceder a ese control usando el <Tabulador>, pero siempre podemos activarlo mediante el ratn.
Delphi nos permite establecer el orden de acceso. Seleccionamos la opcin Tab Order del men
emergente que aparecer al pulsar el botn derecho del ratn sobre el form, o bien elegimos esa
misma opcin del men Edit en la ventana principal. En ambos casos veremos aparecer una
ventana conteniendo el nombre y tipo de cada uno de los controles que pueden ser activados.
En esta ventana podemos establecer el orden de acceso de una forma visual. Si queremos
modificar la posicin de un cierto control en la lista, lo nico que hemos de hacer es "pincharlo" con
el cursor del ratn y "arrastrarlo" hasta su nueva posicin.

Otras Propiedades de Edit


Al insertar un campo de edicin en un form, por defecto aparece con un cierto aspecto
tridimensional y un recuadro alrededor. Estos elementos son controlados mediante las propiedades
Ctl3D y BorderStyle, respectivamente. La primera de ellas puede tomar los valores True o False,
dependiendo de lo cual el control aparecer o no con aspecto tridimensional. La propiedad
BorderStyle puede tomar dos valores distintos, bsNone o bsSingle. El primero de ellos har
aparecer el control sin borde alrededor, mientras que el segundo, que es el valor tomado por
defecto, establece un borde simple delimitando la extensin del control.
Adems de la propiedad ShowHint, que ya conocemos, el control Edit cuenta tambin con las
propiedades ParentColor, ParentCtl3d y ParentFont, cada una de las cuales puede tomar los valores
True o False. La finalidad de estas opciones es permitir que el control tome parte de sus atributos,
como el color de fondo, aspecto tridimensional y tipo de letra, de las propiedades del componente
en que se haya incluido, al que se le llama padre.

Mtodos del Control Edit


Hemos visto anteriormente cmo mediante las propiedades SelStart, SelLength y SelText podemos
controlar desde el cdigo de nuestro programa la seleccin de texto. Adems de estas propiedades
tambin disponemos de los mtodos SelectAll, que selecciona todo el texto existente en el control,
y ClearSelection, que elimina el texto seleccionado en ese momento. Si deseamos dejar el control
vaco, borrando todo el texto que contiene, podemos hacerlo usando el mtodo Clear.
Las operaciones con el portapapeles las llevaremos a cabo mediante los mtodos CopyToClipboard,
que copiar el texto seleccionado en el portapapeles, CutToClipboard, que adems de copiarlo lo
borrar del campo en que se encuentra editado, y PasteFromClipboard, que tomar el texto
existente en el portapapeles y lo pegar a partir de la posicin en la que actualmente se encuentra
el cursor, insertndolo.

Eventos del control Edit


Como casi todos los dems controles que pueden residir en un form, un campo de edicin recibe
eventos generados por el ratn, OnMouseMove, OnMouseDown y OnMouseUp, y por el teclado,
OnKeyPress,OnKeyDown y OnKeyUp.
El evento OnEnter se generar en el momento en que el campo de edicin se convierta en el
control activo del form, mienrtas que OnExit se producir cuando deje de serlo.
Cada vez que se realice una modificacin en el contenido del control, insertando un nuevo carcter
o borrando parte del contenido, se producir un evento OnChange.

3.III. El control Memo


Las posibilidades del control Edit a veces no son suficientes para cubrir todas las necesidades de
entrada de datos, especialmente cuando lo que se solicita al ususario del programa es un texto que
puede ser ms o menos extenso, ya que dicho control slo facilita la edicin de una lnea.

Para dar cabida a estas necesidades, existe el control llamado Memo, cuyo botn en la paleta de
componentes es
Podemos tratar este control de forma casi idntica a un control Edit, con la
diferencia de que es posible trabajar con una mayor extensin de texto, que puede estar
distribuido en mltiples lneas.

Contenido del Control


El texto existente en un control Memo se estructura en mltiples cadenas, que son almacenadas
en la propiedad Lines. Es posible dar un valor inicial a un control de este tipo, utilizando para ello el
editor de cadenas de Delphi.
Tambin puede cargarse dentro del campo Memo el contenido de un archivo de texto, as como
salvar el texto actual del control a un archivo.
En tiempo de ejecucin podemos usar la propiedad Lines como si se tratase de una matriz, en la
que cada uno de los elementos corresponde a una lnea de texto.
En realidad, la propiedad Lines es un objeto de tipo TStrings, que por lo tanto cuenta con sus
propios mtodos y propiedades. Para conocer el nmero de lneas que existen actualmente en el
control, no tenemos ms que consultar el valor de la propiedad Count. A partir de este dato no
tendremos problemas en acceder a cada una de las lneas, teniendo en cuenta que la primera tiene
como ndice de elemento el cero.
Podemos aadir una lnea al final del contenido actual mediante el mtodo Add de la propiedad
Lines, que tomar como parmetro la cadena de caracteres a aadir. Si no deseamos aadirla al
final sino insertarla en una cierta posicin, entonces usaremos el mtodo Insert, al que indicaremos
como primer parmetro la posicin en que se ha de insertar la cadena que se pasa como segundo
parmetro.
Para eliminar una de las lneas utilizaremos el mtodo Delete, al que indicaremos el ndice
correspondiente a la lnea a borrar. Tambin puede moverse una determinada lnea de una posicin
a otra, indicando en el mtodo Move el ndice actual de la lnea y el nuevo ndice que deseamos
asignar. El mtodo Exchange es similar al anterior, tomando como parmetros dos ndices, pero en
este caso lo que se hace es intercambiar la posicin de las dos cadenas de texto.
El contenido de un control Memo puede ser tomado de un archivo de texto, utilizando el mtodo
LoadFromFile, de la propiedad Lines, que nos permitir salvar el contenido actual del control en un
archivo. Tambin podemos guardar el contenido del Memo en un archivo de texto, usando para
ello el mtodo SaveToFile de la propiedad Lines. En ambos casos slo hay que pasar un parmetro,
el nombre del archivo del que se va a leer o en el que se va a escribir.

Visualizacin del Texto


En principio, al introducir un texto en el control el cursor se desplazar a la lnea siguiente en el
mismo momento en el que lleguemos al margen derecho, dividiendo automticamente la lnea por
la ltima palabra. Este comportamiento se debe al valor asignado a la propiedad WordWrap, que es
True. Dando a esta propiedad el valor False, al llegar al margen derecho del control el contenido
actual se ir desplazando hacia la izquierda, de tal forma que la lnea no se dividir, pudiendo ser
tan extensa como necesitemos. Algo similar ocurre al llegar al lmite inferior del control, cuando
hayamos introducido tantas lneas de texto que el control aparezca lleno. Al introducir la siguiente
lnea, el contenido actual se desplazar hacia arriba, dando cabida a tantas cadenas como sea
necesario.
Con el fin de facilitar el desplazamiento por el texto contenido en el control, podemos hacer
aparecer una barra de desplazamiento vertical, una horizontal o ambas. Para ello, asignaremos uno
de los siguientes valores a la propiedad ScrollBars:
Constante

Barra de desplazamiento

ssNone

Ninguna

ssHorizontal Horizontal
ssVertical

Vertical

ssBoth

Ambas

Tabulaciones y avances de lnea


Para poder introducir un tabulador en el texto de un control Memo, podemos utilizar la
combinacin <Control>+<Tabulador>, mientras que para avanzar a otra lnea la combinacin a
usar ser <Control> e <Intro> de forma normal, lo nico que hemos de hacer es dar el valor True
a las propiedades WantTabs y WantReturns. Por defecto la primera tiene el valor False y la segunda
el valor True.

3.IV. El control Button


Un botn aparece como un rea rectangular que contiene un texto en su interior y que, al pulsarlo,
lleva a cabo una determinada accin. En Delphi este control aparece en la paleta de componentes
con el icono

y recibe el nombre Button.

Ttulo del botn


El ttulo que aparece en el interior de un botn corresponde al valor asignado a la propiedad
Caption, que al igual que ocurra con las etiquetas de texto, pueden contar con un carcter
precedido de un &. Este carcter, que aparecer en el botn subrayando a la letra que le sigue, nos
permitir realizar la accin indicada por el botn usando las teclas ALT+LetraSubrayada.
En el caso de que la propiedad Enable del botn tome el valor False, el ttulo aparecer en un color
ms difuminado, y el botn no podr ser pulsado. Tanto el color como el aspecto del ttulo pueden
ser controlados mediante la propiedad Font.

Botn por defecto y de cancelacin


El evento Onclick de un botn se produce cuando, siendo el control activo, se pulsa la barra
espaciadora, o bien utilizando el cursor del ratn para pulsar sobre l, existiendo la posibilidad de
usar tambin una tecla de acceso rpido. A estos tres mtodos, generales a todos los botones que
podamos insertar en un form, hay que aadir la pulsacin de las teclas <Intro> y <Escape>. Al
pulsar la tecla <Intro> se generar el evento OnClick del botn por defecto, que es aquel cuya
propiedad Default tiene el valor True. De igual forma, la pulsacin de la tecla <Escape> genera el
mismo evento en el botn de cancelacin, siendo ste el que tiene la propiedad Cancel con el valor
True.
Inicialmente las propiedades Default y Cancel de todos los botones tienen el valor por defecto
False.

Cuadros de dilogo
Un cuadro de dilogo modal se caracteriza por no permitir el acceso a ninguna otra ventana de la
aplicacin mientras l se encuentre abierto, y al cerrarlo generalmente se devuelve un valor
indicando la causa de salida.
Habitualmente, un cuadro de dilogo se cierra por la pulsacin de algn botn, que se encarga de
establecer el cdigo de salida. En lugar de tener que escribir un gestor para el evento Onclick de un
botn cuya nica finalidad sea esa, podemos asignar a la propiedad ModalResult del control Button
el valor de salida. Al pulsarse este botn el cuadro de dilogo ser cerrado automticamente,
devolviendo el cdigo almacenado en ModalResult. Aunque esta propiedad puede tomar cualquier
valor que nos interese, existen una serie de constantes con valores predefinidos que son los ms
usados:

Constantes Valor devuelto


mrNone

mrYes

idYes

mrNo

idNo

mrOk

idOk

mrCancel

idCancel

mrAbort

idAbort

mrRetry

idRetry

mrIgnore

idIgnore

3.V. El control CheckBox


Mediante los controles CheckBox, o Cajas de Seleccin, podemos obtener una entrada de datos.
Este componente aparece en la Paleta de componentes como el siguiente botn:
que se llama
CheckBox. Este control permite al usuario activar o desactivar una cierta opcin sin necesidad de
escribir nada, bastar con que realice una pulsacin sobre el control.
El ttulo que aparecer junto a la caja de seleccin ser el que asignemos a la propiedad Caption,
pudiendo existir una tecla de acceso rpido como en los botones y etiquetas de texto.
Habitualmente, este control puede aparecer en dos estados distintos, marcado o sin marcar. El
estado actual lo podremos conocer mediante la propiedad Checked, que tomar el valor True si
est marcado o el valor False en caso contrario.
Si lo deseamos, tambin podemos activar un tercer estado, en el cual el control no aparecer ni
marcado ni sin marcar, un estado indeterminado. Para permitir este tercer estado habremos de
darle el valor True a la propiedad AllowGrayed y en lugar de la propiedad Checked usaremos la
propiedad State para conocer el estado del control. Esta propiedad puede tomar los siguientes
valores:
Constante
cbCheked

Estado del Control


Marcado

cbUnchecked Desmarcado
cbGrayed

Indeterminado

Los eventos y mtodos disponibles para el control CheckBox son los generales a la mayora de los
controles, al igual que para los botones. Esto quiere decir que existen los eventos de teclado y
ratn y los mtodos Show, Hide, etc.

3.VI. El control RadioButton


A veces es necesario dar al usuario a elegir slo una de las opciones disponibles, creando un grupo
de opciones exclusivas entre s.
Nuestras necesidades sern cubiertas con el control RadioButton, que aparece en la Paleta de
componentes como
. El aspecto de este control es circular, en lugar de un cuadrado, y slo
uno de los controles que insertemos en el form podr estar activo.
El ttulo que aparecer a la derecha del control ser facilitado como siempre en la propiedad
Caption. El estado actual del botn, seleccionado o no, lo conoceremos mediante la propiedad
Checked, que ser True en caso afirmativo o False en caso negativo.

Grupo de botones de radio


Si lo que necesitamos nosotros es disponer de dos grupos con tres botones de radio, lo que en
realidad tenemos son seis botones exclusivos entre s. Para crear estos grupos tendremos que
utilizar un nuevo control llamado GroupBox, representado en la Paleta de componentes como

La nica finalidad de este control es actuar como padre de otros controles agrupndolos y no
dispone de ninguna propiedad especial. Al insertar un control GroupBox en el form, ste
aparecer como un recuadro con un ttulo en la parte superior izquierda. Este ttulo lo podremos
establecer modificando el valor de la propiedad Caption, como es habitual. Aunque los controles
que normalmente se agrupan son los botones de radio, realmente mediante este control podremos
agrupar cualquier conjunto de controles, sin importar su tipo.
Cuando insertemos en un control GroupBox cualquier otro componente, su posicin ser relativa a
la del control que est actuando como contenedor, en este caso el GroupBox. Otra diferencia entre
un control insertado directamente en el form y otro insertado en un GroupBox ser el valor de la
propiedad Parent, de la que disponen todos los componentes. Esta propiedad contiene el nombre
del control padre, es decir, el control que acta como contenedor.
Para que un control pertenezca a un determinado grupo, es necesario que sea insertado en l. En
caso de que dispongamos de un determinado componente en el form y lo desplacemos al interior
de un control GroupBox, lo nico que habremos hecho ser modificar la posicin, pero realmente
dicho control no estar contenido en el grupo. En caso de que los controles a incluir en el
GroupBox ya existan en el form, tenemos una alternativa, que es cortarlos al portapapaeles,
activar el grupo y pegarlos.

Otras relaciones padre-hijo


Adems de la posicin de un control, relativa al contenedor en que est incluido, y la pertenencia a
dicho contenedor, indicada por el valor de la propiedad Parent, los controles que se incluyen en un
contenedor tambin "heredan" otras propiedades, como puede ser la propiedad Font, el color de
fondo, etc.
Si insertamos en un form un control GroupBox, modificamos su propiedad Font, establecidos un
determinado tipo y tamao de letra y, a continuacin, insertamos en su interior una etiqueta, un
campo de edicin o un botn, se ver que estos controles automticamente aparecen con el mismo
tipo de letra. Es ms, si durante la ejecucin del programa se altera alguna de las caractersticas de
la propiedad Font del contenedor, automticamente los controles que hay en su interior tambin
sern modificados. Esto es as porque las propiedades ParentFont, ParentColor, ParentCtld3D y
ParentShowHint toman el valor True, indicando as que los valores de las propiedades Font, Color,
Clt3D y ShowHint de un determinado control sern tomados del contenedor en que se halle
insertado.
Dando el valor False a cualquiera de estas propiedades desactivaremos esta caracterstica.
Puesto que la posicin de los controles es relativa al componente, cualquier desplazamiento de ste
ltimo resultar en un desplazamiento de todos los controles que haya en su interior.

Grupo de botones de radio


Para facilitar el tratamiento de grupos de botones de radio, Delphi dispone del control que recibe el
nombre de RadioGroup, con el siguiente icono en la Paleta de componentes:
Para indicar los botones de radio que debern existir en el grupo, tendremos que editar la
propiedad Items, que al igual que ocurra con la propiedad Lines del control Memo es una lista de
cadenas. Por lo tanto en tiempo de diseo podremos modificar el contenido de esta propiedad
mediante el editor de cadenas de Delphi, mientras que en tiempo de ejecucin tendremos que usar
los mtodos Add e Insert de la propiedad Items si deseamos aadir un botn de radio al grupo.

Por defecto los botones de radio se reparten en una sola columna, que tendr tantas filas como
botones. Podemos modificar el valor de la propiedad Columns, especificando el nmero total de
controles que se reparte proporcionalmente entre ellas.
La propiedad ItemIndex nos servir tanto para saber que botn est seleccionado actualmente
como para modificar dicha seleccin. El valor de esta propiedad ser un nmero entero,
comprendido entre 0 y el nmero de botones existentes menos 1. El valor -1 indica que no hay
ninguno seleccionado actualmente.

3.VII. El componente ListBox


En ocasiones, el nmero de datos que debe introducir el usuario de un programa o la cantidad de
opciones distintas entre las que seleccionar es tan amplia, que el uso de mltiples controles de
edicin, botones de radio, etc., es poco prctico. En estos casos es mucho ms comodo usar una
lista, que es un control capaz de contener cadenas de caracteres, cada una de las cuales aparece
como elemente de la lista.
En caso de que el nmero de elementos exceda las dimensiones de la lista, en sta aparecern las
barras de desplazamiento correspondientes. En Delphi la lista est representada por el control
ListBox, seleccionando el botn

de la Paleta de componentes.

Contenido de la lista
Los elementos contenidos en cada momento en la lista pueden ser gestionados mediante la
propiedad Items, que es en realidad un objeto del tipo TStrings. Ya hemos conocido anteriormente
este tipo en los controles Memo y RadioGroup, por lo que no tendremos problema alguno en
aadir elementos a la lista, con los mtodos Add e Insert, eliminarlos con Delete, moverlos con
Move, o intercambiarlos con Exchange.
La visualizacin de los elementos en la lista se dividir en tantas columnas como indique la
propiedad Columns, siendo el valor por defecto de una sola columna. Si lo deseamos, podemos
mostrar los elementos de la lista ordenados alfabticamente, simplemente dando el valor True a la
propiedad Sorted.
Dando el valor True a la propiedad IntegralHeight, haremos que visualice un elemento completo,
no de forma parcial.

Seleccin de elementos
El hecho de que en la lista slo pueda haber seleccionado un elemento simultneamente, est
determinado por la propiedad MultiSelect, dndole el valor True a esta propiedad, conseguiremos
una lista en la que es posible seleccionar mltiples elementos. Para ello podemos usar dos mtodos
distintos, dependiendo del valor de la propiedad ExtendedSelect. Por defecto el valor que tiene es
True, de tal forma que para seleccionar mltiples elementos tendremos que utilizar las teclas
<Mayscula> y <Control> junto con la pulsacin del botn izquierdo del ratn, como se hace
habitualmente. Si damos el valor False a esta propiedad podremos seleccionar varios elementos
simplemente marcndolos, pulsando sobre ellos con el cursor del ratn.
Cuando en una lista es posible seleccionar varios elementos, tendremos que utilizar la propiedad
SelCount para saber cuntos hay marcados actualmente, y la propiedad Selected para conocer qu
elementos estn marcados. Esta propiedad es en realidad una matriz, con tantos elementos como
cadenas existan en la lista.
Cada elemento de esta matriz puede tener el valor True, si dicho elemento est seleccionado, o
False, en caso de que no lo est.

Listas especiales
Aunque por regla general los elementos de una lista son cadenas de texto, todas ellas de un mismo
tipo de letra, es posible utilizar este control para presentar otros objetos, como elementos grficos.

Para ello lo primero que tendremos que hacer es modificar el valor de la propiedad Style,
asignando una de las siguientes constantes:
Constante

Estilo de la lista

lbStandard

Todos los elementos son cadenas

lbOwnerDrawFixed

Cada elemento es distinto pero con una altura fija

lbOwnerDrawVariable CadaElemento tiene una altura variable


En caso de que el estilo seleccionado sea lbOwnerDrawFixed, la altura de cada uno de los
elementos de la lista vendr determinado por el valor de la propiedad ItemHeight, que la
indicaremos en puntos.
Si el estilo seleccionado es lbOwnerDrawVariable, entonces al ir a dibujar cada uno de los
elementos se generar un evento OnMeasureItem. El mtodo de respuesta a este evento recibir
tres parmetros: la lista que ha generado, el evento, el nmero de elemento que se va a dibujar y
una variable entera, Height, en la que tendremos que devolver la altura necesaria para dibujar el
elemento en cuestin.
Si el estilo de una lista no es lbStandard, cada vez que sea necesario dibujar uno de los elementos
se generar un evento OnDrawItem, que nos permitir dar salida al elemento que deseamos
mostrar en la lista. El gestor de este evento recibir los siguientes parmetros:

ListBox. Una referencia a la lista que ha generado el evento.


Index. Un entero indicando el elemento que se ha de dibujar.
Rect. Un registro del tipo TRect, conteniendo las coordenadas del recuadro en que ha de
ser dibujado el lemento.
State. Estado actual del elemento que se ha de dibujar. Se trata de un conjunto que puede
contener los siguientes valores:
Constante

Estado actual del elemento

odSelected El elemento est seleccionado


odDisabled La lista no est actualmente activa
odFocused

El elemento es el elemento actual de la lista

Para dibujar el elemento se deber utilizar la propiedad Canvas, que representa la superficie del
rea cliente de la lista. Esta propiedad es un objeto del tipo Tcanvas, que cuenta con una serie de
propiedades y mtodos que facilitan el trabajo con entidades grficas.

Listas combinadas
En Windows existe un control que es una mezcla de ListBox y Edit, al que se conoce como lista
combinada. Su nombre en Delphi es ComboBox:

Estilo de la lista combinada


Un control ComboBox puede actuar de varias formas distintas, dependiendo del estilo que
seleccionemos. Para elegir el estilo que nos interese tendremos que asignar a la propiedad Style
uno de los siguientes valores.
Constante

Estilo

csDropDown

Lista con campo de edicin asociado

csSimple

Campo de edicin sin lista

csDropDownList

Elementos distintos con altura fija

csOwnerDrawVariable Elementos distintos con altura variable

El estilo seleccionado por defecto es csDropDown, que en el form aparece como un control Edit con
una flecha en la parte derecha. Pulsando sobre dicha flecha se desplegar automticamente la
lista, en la que podremos seleccionar cualquiera de los elementos existentes, que pasar a
mostrarse en el campo de edicin. En lugar de desplegar la lista para elegir un elemento, tambin
podemos introducir los primeros caracteres en el campo de edicin, pulsando despus la tecla del
cursor hacia arriba o hacia abajo, lo que provocar la aparicin del primer elemento que comience
por esa secuencia.
Tanto el estilo csSimple como el csDropDownList son versiones simplificadas de csDropDown. En el
primer caso la lista aparecer como un campo de edicin normal, sin lista asociada. Sin embargo,
en ese campo podremos utilizar las teclas de desplazamiento del cursor para seleccionar uno de los
elementos de la lista, as como introducir las iniciales para su bsqueda. En el segundo caso nos
encontraremos con una lista que no tiene asociado un campo de edicin, aunque podremos seguir
usando las teclas del cursor para elegir un elemento. En la parte derecha del control aparecer una
flecha, que nos servir tambin para desplegar la lista.

Dimensiones de la lista
Una lista combinada, a diferencia de una lista normal, slo muestra permanentemente el elemento
que est seleccionado en cada momento, mientras que el resto de los elementos slo aparecen
cuando la lista se despliega. La extensin de la lista en ese momento, al ser desplegada,
depender del valor que demos a la propiedad DropDownCount, que contendr el nmero de lneas
que se mostrarn simultneamente como mximo.

Otras consideraciones
Al igual que una lista normal, es posible saber qu elemento est seleccionado en una lista
combinada mediante la propiedad ItemIndex, que contendr un nmero comprendido entre 0 y el
nmero de elementos existentes menos 1. Puesto que el elemento que est seleccionado en cada
momento se muestra en el rea de edicin del control, podemos obtener el texto mediante la
propiedad Text, como si se tratase de un control Edit. A diferencia de las listas normales, en una
lista combinada no es posible seleccionar mltiples elementos. Por ello no existen las propiedades
MultiSelect, ExtendedSelect, SelectCount y Selected.

3.VIII. Barras de desplazamiento


Supongamos que hemos creado un programa capaz de reproducir discos musicales, una barra de
desplazamiento nos podra servir para representar y permitir modificar el volumen. Este es slo un
ejemplo de las utilidades que podemos encontrar en el control ScrollBar:

Tipo de barra
Una barra de desplazamiento puede aparecer en sentido vertical y horizontal, siendo el primero el
estado por defecto. El tipo de barra representada por el control ScrollBar viene determinado por el
valor que demos a la propiedad Kind, que ser sbHorizontal o sbVertical, segn deseemos una
barra de desplazamiento horizontal o vertical respectivamente.

Rango de desplazamiento
Los valores extremos de la barra de desplazamiento, que determinan el rango de valores posibles,
los tendremos que facilitar en las propiedaddes Min y Max. El valor correspondiente a la posicin
actual del cursor en la barra lo obtendremos en la propiedad Position, que podemos modificar para
posiciones del cursor en un determinado punto de la barra. Tanto la posicin actual en la barra
como los valores extremos, mnimo y mximo, pueden fijarse en un solo paso, utilizando el mtodo
SetParams, al que facilitaremos los tres parmetros en ese mismo orden.
El factor de incremento o decremento pequeo se asigna a la propiedad SmallChange. Este valor
habitualmente es 1, permitiendo as recorrer el rango de valores representado por la barra unidad.
El factor de desplazamiento grande se asigna mediante la propiedad LargeChange. El
desplazamiento pequeo es el que se produce al pulsar sobre las propias flechas cursor de la barra,

y el desplazamiento grande es aquel que se produce cuando pinchamos en el interior de la barra,


para avanzar ms deprisa.

Eventos de ScrollBar
Cada vez que el valor de la propiedad Position es modificado por una accin sobre la barra de
desplazamiento, se genera un evento OnChange, que nosotros podemos aprovechar para llevar a
cabo la accin que corresponda segn la nueva posicin del cursor en la barra.
Tambin al manipular la barra de desplazamiento, modificando la posicin del cursor, se genera el
evento OnScroll, que podemos aprovechar para actuar en consecuencia segn la operacin que se
haya efectuado. El mtodo que acte como gestor de este evento recibir un primer parmetro
representando a la barra de desplazamiento que ha generado el evento, un segundo parmetro
mediante el cual podremos conocer la accin que se ha efectuado sobre la barra y que vendr
representado por una de las constantes mostradas en la siguiente tabla. Por ltimo recibiremos la
variable ScrollPos, que podemos modificar para reflejar la nueva posicin en la barra.
Constante

Operacin de desplazamiento

scLineUp

Ir al paso anterior, arriba o a la izquierda

scLineDown

Ir al paso siguiente, abajo o a la derecha

scPageUp

Ir a la pgina siguiente

scPageDown Ir a la pgina siguiente


scTop

Ir a la posicin de inicio

scBottom

Ir a la posicin de fin

scPosition

Se ha desplazado el cursor a una posicin absoluta

scTrack

Se est desplazando el cursor

scEndScroll

Se ha terminado de desplazar el cursor

3.IX. El control Bevel


En la pgina Additional de la Paleta de componentes podremos encontrar el control cuyo nombre
es Bevel:
. Mediante l podremos insertar en el form lneas, recuadros y bordes, que pueden
aparecer hundidos en el form o sobresalir de l.

Forma y estilo
Mediante la propiedad Shape podemos seleccionar la figura que deseamos que tome el control,
pudiendo ser cualquiera de los mostrados en la tabla siguiente. Cada uno de estos elementos
puede aparecer hundido en el form o sobresaliendo de l, dependiendo de que a la propiedad Style
le demos el valor bsLowered o bsRaised, respectivamente.
Constante

Forma

bsBox

Rectngulo

bsFrame

Borde rectangular

bsTopLine

Lnea horizontal superior

bsBottomLine Lnea horizontal inferior


bsLeftLine

Lnea vertical izquierda

bsRightLine

Lnea vertical derecha

3.X. El componente Timer

Mediante el componente Timer, que encontramos en la pgina System de la Paleta de


componentes:
, podremos programar un evento que se generar peridicamente en dos
supuestos: cuando necesitemos repetir un mismo cdigo cclicamente, o bien para dividir un
proceso muy extenso, no bloqueando as el programa.
Este es el primer componente no visual que vamos a conocer. Timer no tiene un elemento de
interfaz, en tiempo de ejecucin no aparece en el form, por lo que no es un control. Debido a esto
el nmero de propiedades de este componente es mucho ms reducido.

Frecuencia del evento


Para determinar el tiempo que transcurrir entre dos eventos consecutivos generados por el
componente Timer, tendremos que utilizar la propiedad Intervel. La magnitud de tiempo que
indiquemos deber ir expresada en milisegundos, siendo el valor por defecto 1000, es decir, el
evento se generara una vez por segundo.
Cada vez que transcurra el tiempo indicado en Interval, se generar un evento Ontimer, en el que
podremos escribir el cdigo que deseamos ejecutar.
La propiedad Enabled tiene un significado especial en el componente Timer. Si tiene el valor True,
que es por defecto, el evento se generar segn la frecuencia especificada.
Dndole el valor False, el evento dejar de producirse. De esta forma podemos activar y desactivar
el funcionamiento del componente segn nos interese.

3.XI. El control MaskEdit


Delphi dispone de un campo de edicin que nos permite aplicar un mayor control sobre los datos a
introducir, sin necesidad de tener que escribir cdigo para interceptar la pulsacin de cada carcter.
Este control aparece en la pgina Additional de la Paleta de componentes con el icono
y
recibe el nombre de MaskEdit. Las propiedades de este nuevo control coinciden en gran parte con
las del control Edit.

Mscara de entrada
La entrada de datos en un control MaskEdit ser idntica a la de un control Edit, a no ser que
establezcamos una mscara de control. Dicha mscara es una cadena de caracteres, en la cual
algunos tienen un significado especial. Esta cadena tendr que asignarse a la propiedad EditMask.
En tiempo de ejecucin, la mscara que hayamos aplicado condicionar tanto la introduccin de
datos en el campo, como la visualizacin de stos. Todos los caracteres, alfabticos, alfanumricos
y smbolos, pueden formar parte de una mscara. Aquellos que tienen un significado especial, se
muestran en la siguiente tabla; limitan la entrada de la informacin, mientras que todos los dems
aparecen en el campo en tiempo de ejecucin como parte fija de la informacin.
Carcter

Significado

Requiere la entrada de un carcter

Permite la entrada de un carcter

Requiere la entrada de un carcter alfanumrico

Permite la entrada de un carcter alfanumrico

Requiere la entrada de un carcter alfabtico

Permite la entrada de un carcter alfabtico

Requiere la entrada de un carcter numrico

Permite la entrada de un carcter numrico

Permite la entrada de un carcter numrico o de signo

<

Los carcteres siguientes aparecern en maysculas

>

Los carcteres siguientes aparecern en minsculas

<>

Desactiva la funcin de los dos carcteres anteriores

Interpreta el carcter siguiente como no especial

Representa un espacio en blanco

Separador de horas y minutos

Separador de fechas

Separador interno de la mscara

Para componer la mscara de edicin en tiempo de diseo, bastar con que realicemos una doble
pulsacin sobre la propiedad EditMask, o bien pulsamos el botn con los puntos suspensivos que
aparece en la parte derecha.

Contenido del control


Al igual que un control Edit, el control MaskEdit cuenta con la propiedad Text, en la que podemos
encontrar el contenido actual del campo. En realidad el contenido depender de que la mscara sea
salvada o no junto con la informacin introducida. Si marcamos la opcin Save Literal
Characters, o bien aadimos al final de la mscara un punto y coma y un 1, en la propiedad Text
podremos encontrar el contenido actual, pero incluyendo el formato correspondiente a la mscara
que hayamos utilizado.

4.I El control RichEdit


Una de las grandes limitaciones del control TMemo, que usamos para permitir la entrada de texto
por parte del usuario, es que no permite usar atributos diferentes para el texto, como tamaos o
estilos, ni dispone de capacidad alguna de alineacin, sangrado de prrafos, etc. Entre los controles
de Windows 95 nos encontramos con uno, llamado TRichEdit, situado en la paleta de componentes
con este botn:
, que en cierta manera funciona como un TMemo, con la diferencia de que
permite editar texto en formato Rich Text Format, o RTF, en ql que es posible utilizar atributos en el
texto, ajustar prrafos, etc.
En el inspector de objetos podremos apreciar la existencia de algunas propiedades y eventos
exclusivos de este control. En la siguiente tabla se enumeran las propiedades.
Nombre

Tipo

Comentario

DefAttributes

TTexAttributes

Atributos para el texto por defecto

HideScrollBars

Boolean

Ocultar las barras de desplazamiento

HideSelection

Boolean

Ocultar la seleccin actual de texto

Paragraph

TParaAttributes

Atributos del prrafo actual o seleccionado

PlainText

Boolean

Indica si el contenido es texto normal o RTF

SelAttributes

TTextAttributes

Atributos del texto seleccionado

Atributos de texto
Tanto la propiedad DefAttributes, que establece los atributos por defecto para el texto, como la
propiedad SelAttributes, que nos permite conocer y modificar los atributos del texto actualmente,
son de tipo TTextAtributes.
Mediante las propiedades Name, Style, Size y Pitch podemos conocer y modificar los atributos
generales del texto. Estas propiedades son del mismo tipo y contienen la misma informacin que
las propiedades del mismo nombre de un objeto TFont. Mediante la propiedad Color podremos
manipular el color del texto, siendo de tipo TColor.

El texto seleccionado en un TRichEdit puede estar protegido contra escritura, atributo que podemos
conocer y modificar mediante la propiedad Protected del objeto TTextAttributes, de forma similar a
como podemos establecer el tipo o tamao de letra.

Atributos de prrafo
Tambin la propiedad Paragraph es una referencia a un objeto, en este caso del tipo
TParaAttributes. Mediante este objeto podemos conocer y modificar los atributos del prrafo actual
o los prrafos seleccionados en un determinado momento.
El texto de un prrafo puede estar ajustado a la izquierda, centrado o ajustado a la derecha,
dependiendo del valor que demos a la propiedad Alignment, que puede ser uno de estos:
Valor

Tipo de ajuste

taLeftJustify

Izquierda

taCenter

Centrado

taRightJustify

Derecha

Un prrafo se ajusta, segn la propiedad anterior, dentro de los lmites actuales del control y de los
mrgenes que se hayan establecido. Estos mrgenes se definen mediante tres propiedades:
FirstIndent, LeftIndent y RightIndent, pudiendo contener cada una de ellas un nmero entero cuya
unidad de medida es el punto de pantalla. LeftIndent establece el margen izquierdo para la primera
lnea del prrafo, que ser el relativo a FirstIndent. Mediante la propiedad RightMargin definiremos
el margen derecho.
En caso de que sea posible utilizar el tabulador en el control, porque hayamos dado el valor True a
la propiedad WantTabs del TRichEdit, la propiedad TabCount del objeto TParaAttributes contendr
el nmero de puntos de tabulacin y la propiedad Tab, que es una matriz de enteros, almacenar
las posiciones correspondientes a cada uno de esos puntos.
Cada inicio de prrafo del texto que se introduce en un TRichEdit puede ir precedido de lo que
normalmente se denomina un bolo, una marca que resalta el comienzo del prrafo. La existencia o
no de este elemento depender del color que asignemos a la propiedad Numbering, que ser
nsNone o nsBullet, siendo ste segundo el valor a usar para activar el uso de bolos.

Salvar, cargar e imprimir texto


Al igual que el control TMemo, un TRichEdit dispone de una propiedad Lines, en la que se
almacenan las lneas que actualmente contiene el control. Se ha de tener en cuenta que estas
lneas no contienen slo el texto que nosotros vemos en el control sino que, adems existen una
serie de secuencias o controles especiales, que son los que establecen los atributos del texto y
prrafo. Si queremos tener nicamente el texto, sin los caracteres especiales, hemos de acudir a la
propiedad Text del TStrings que tiene las lneas del texto. Esta propiedad es una cadena que
contiene todo el texto del TRichEdit.
La propiedad Lines es un objeto TStrings, por lo que disponemos de los habituales mtodos
SaveToFile y LoadFromFile, que nos facilitan las operaciones de entrada y salida a archivos en
disco.
Adems, este control incorpora un mtodo Print, que se encarga de enviar a la impresora el texto
contenido en l. Al llamar a este mtodo deberemos facilitar una cadena de carcteres como nico
parmetro, que ser el ttulo del trabajo de impresin.

Eventos de TRichEdit
Adems de los eventos habituales de los controles de esta categora, generados por el ratn, el
teclado y otros elementos, el control TRichtEdit cuenta tambin con un evento, OnSelectionChange,
que se produce cada vez que se desplaza el cursor por el contenido actual del control, o bien
cuando se modifica la seleccin actual de texto. Esto nos da una oportunidad para obtener
informacin acerca de los atributos del texto y el prrafo, mediante las propiedades SelAttributes y

Paragraph, actualizando los indicadores, botones y, en general cualquier control cuyo estado o
valor dependa de estos parmetros.

4.II El control StatusBar


Se denomina barra de estado a un rea de la ventana, normalmente situada en la parte inferior,
que sirve para mostrar mensajes e indicadores de estado.
Se puede construir una barra de estado mediante un control TPanel, por ejemplo, dando un valor
adecuado a la propiedad Align para que ste se site en el lugar apropiado.
Delphi, sin embargo, incorpora en la pgina Win95 de la Paleta de componentes un control
llamado TStatusBar:
. Al colocarlo en un form, automticamente se situar en la parte inferior
del form, ocupndolo de izquierda a derecha. En el extremo derecho inferior de la barra de estado,
que tiene la altura precisa para mostrar una lnea de texto, existe una esquina con varias lneas en
diagonal, que indican que el form se puede coger por ese punto para ser redimensionado. Esta
caracterstica y algunas ms, las podemos establecer mediante las propiedades de control
TStatusBar. En la siguiente tabla se pueden ver algunas de ellas.
Propiedades

Tipo

Contenido

Panels

TStatusPanels Referencia a un objeto TStatusPanels

SimplePanel

Boolean

Indica si la barra de estado contiene slo una


lnea de texto

SimpleText

String

Texto a mostrar en la barra de estado

SizeGrip

Boolean

Indica si existe la esquina de cambio de tamao

Una barra de estado simple


Si vamos a usar el control TStatusBar para crear una barra de estado simple, en la que slo se
muestra un mensaje, tan slo hemos de dar el valor True a la propiedad SimplePanel, asignando el
texto a mostrar a la propiedad SimpleText. En tiempo de ejecucin bastar con modificar el valor
de esta ltima propiedad para mostrar un texto diferente. Tambin podemos hacer desaparecer el
mensaje que est actualmente visualizando simplemente asignando el valor False a la propiedad
SimplePanel, hacindolo aparecer de nuevo devolviendo a esta propiedad el valor True.
La propiedad SizeGrip es la que establece la existencia o no en la barra de estado de la esquina con
lneas en diagonal, que indica que es posible el cambio de tamao del form. Por defecto esta
propiedad tiene el valor True, indicando que s es posible esa accin. Debemos dar el valor False a
SizeGrip en caso de que la ventana que estamos usando sea de tamao fijo.

Mltiples paneles en la barra de estado


Un control TStatusBar puede contener una o ms secciones, a las que se denomina paneles.
La propiedad Panels del control TStatusPanel es un objeto de tipo TStatusPanels. Este objeto, en
realidad, es una coleccin de objetos TStatusPanel y cuenta con una propiedad Count, que nos
sirve para saber cuntos paneles existen, y los mtodos precisos para poder aadir nuevos
paneles, Add, y eliminar los existentes, Clear.
Adems, el objeto TStatusPanels dispone de una propiedad indexada, llamada Items, que es la que
permite acceder a cada uno de los elementos de la coleccin.
Por lo tanto cada uno de los elementos TStatusPanels define una seccin de la barra de estado,
basndose en las propiedades que se comentan en la siguiente tabla. Si la propiedad Style contiene
el valor psText, ser alineado segn indique la propiedad Alignment, que como en otros controles
puede tomar los valores taLeftJustify, taCenter y taRightJustify. El ancho del panel se especificar
en puntos en la propiedad Width, pero el ltimo panel, el que quede en el extremo derecho,

siempre ocupar el resto de la barra. Mediante la propiedad Bevel indicaremos si el panel debe
aparecer hundido en la barra, pbLowered resaltado, pbRaised, o al mismo nivel, pbNone.
Propiedad

Tipo

Contenido

Alignment

TAlignment

Alineacin del texto en el panel

Bevel

TStatusPanelBevel

Apariencia del panel en la barra

Style

TStatusPanelBevel

Estilo del panel

Text

String

Texto a mostrar en el panel

Width

Integer

Anchura del panel

En caso de que asignemos el valor psOwnerDraw a la propiedad Style de un TStatusPanel, ese


panel no contendr un texto, sino que deber ser dibujado por nuestro propio programa.
Cada vez que el panel deba ser dibujado, el control TStatusBar generar un evento OnDrawPanel,
pasando tres parmetros al procedimiento correspondiente.
El primero de estos parmetros ser de tipo TStatusBar y har referencia al control TStatusBar que
ha generado el evento. El segundo ser de tipo TStatus, conteniendo una referencia al panel que
debe ser dibujado. Por ltimo encontramos un parmetro de tipo Rect, conteniendo los lmites de la
zona de dibujo.

Definir paneles en tiempo de diseo


En la mayora de las ocasiones es posible definir los paneles de un control TStatusBar en tiempo de
diseo, para lo cual deberemos hacer una doble pulsacin sobre la propiedad Panels, abriendo el
correspondiente editor.
En la ventana que aparece, tendremos que pulsar el botn Add por cada nuevo panel que
deseemos crear, indicando a continuacin el estilo, su anchura, aspecto y texto, en el Inspector de
Objetos como cualquier otra propiedad.

Definir paneles en tiempo de ejecucin


La creacin de los paneles de una barra de estado en tiempo de ejecucin, en lugar de hacerlo en
tiempo de diseo, tiene la ventaja de que el usuario puede configurar la barra de estado. Para ello
disponemos de dos mtodos, Add y Clear. Cada vez que llamemos al mtodo Add se crear un
nuevo objeto de tipo TStatusPanel en la barra de estado. Si llamamos al mtodo Clear, se
eliminarn todos los paneles existentes en ese momento.

4.III El control TrackBar


En muchas ocasiones, los valores que solicita un programa al usuario son numricos y se
encuentran entre unos ciertos lmites conocidos. Aunque podemos utilizar un control TEdit para
pedir datos de este tipo, existen bastantes posibilidades ms, entre las que se encuentra el control
TTrackBar
. Mediante este control, adems, es posible seleccionar rangos de valores en lugar
de un slo valor. En apariencia un control TTrackBar es bastante similar a una barra de
desplazamiento y de hecho su funcionamiento es muy parecido. Este control cuenta con unos
lmites y una posicin actual, mostrada visualmente mediante un cursor. En el interior del control
es posible disponer unas marcas a intervalos regulares, entre el mnimo y el mximo. Estas
caractersticas y algunas ms las podremos establecer mediante las propiedades de TTrackBar,
algunas de las cuales las enumeramos en la siguiente tabla.
Propiedad

Tipo

Contenido

Frecuency

Integer

Frecuencia de las marcas de medida

LineSize

Integer

Incremento o decremento pequeo

Max

Integer

Valor mximo

Min

Integer

Valor mnimo

Orientation TrackBarOrientation Orientacin del control


PageSize

Integer

Incremento o decremento grande

Position

Integer

Posicin actual del cursor en el punto de


control

SelEnd

Integer

Punto de inicio de la seleccin actual

SelStart

Integer

Punto de fin de la seleccin actual

TickMarks

TTickMark

Posicin de las marcas de medida

TickStyle

TTickStyle

Estilo de las marcas de medida

Lmites y posicin actual


Mediante las propiedades Min y Max fijaremos el valor mnimo y mximo de la medida, pudiendo
tambin asignar una posicin inicial modificando el valor de la propiedad Position, que por defecto
tomar el mismo valor que asignemos a Min. El valor de la propiedad Position ser lo nico que
cambie por una actuacin del usuario en tiempo de ejecucin, cuando el cursor del control se
desplace a otro punto, ya sea mediante o con el teclado. En cualquiera de estos casos el TTrackBar
generar un evento OnChange, que podemos aprovechar para actualizar cualquier parmetro que
sea dependiendo de la posicin actual en este control.

Apariencia del control


Un control TTrackBar puede aparecer en el form en sentido horizontal, que es el estado por
defecto, o vertical, segn el valor que asignemos a la propiedad Orientation, que ser tbHorizontal
o tbVertical.
A la izquierda y derecha o arriba y abajo, dependiendo de la orientacin, el control puede mostrar
unas marcas intermedias, que permitirn tener una idea aproximada del valor actual que se est
usando. Mediante la propiedad TickMarks podemos determinar la situacin de esas marcas en el
control, pudiendo ser las siguientes:
Constante

Posicin de las marcas

tmBottomRight

Abajo o a la izquierda dependiendo de la orientacin

tmTopLeft

Arriba o a la izquierda

tmBoth

Abajo y arriba o a la izquierda y derecha

La propiedad TickStyle nos servir para fijar el estilo de las marcas, pudiendo tomar los siguientes
valores:
Constante

Estilo de las marcas

tsAuto

Automtico, es el estilo por defecto

tsNone

Sin marcas

tsManual

Manual

El estilo tsAuto distribuye las marcas existentes entre los puntos de inicio y fin de una forma
regular, segn el valor que se haya asignado a la propiedad Frecuency, que por defecto es uno, lo
que quiere decir que existir una marca por cada unidad.
Si asignamos el valor 100 a la propiedad Max, veremos que las marcas estn tan juntas que
forman una lnea. Modificando el valor de Frecuency, asignndole por ejemplo 10, conseguiremos
que se muestre una marca cada diez unidades.

En caso de que asignemos a la propiedad TickStyle el valor tsManual, el control slo dispondr de
dos marcas, una en cada extremo. Cualquier otra marca que deseemos deberemos establecerla
nosotros mismos, mediante el mtodo SetTick, al que pasaremos como nico parmetro un entero
indicando la posicin en la que deseamos disponer la marca.

Seleccin de rangos
Adems de para mostrar o fijar una posicin del cursor, lo que en definitiva se traduce en un cierto
valor que obtendramos de la propiedad Position, el control TTrackBar tambin nos permite
seleccionar un rango o intervalo de valores, mediante las propiedades SelStart y SelEnd.
Inicialmente estas dos propiedades tienen el valor cero, lo que indica que no hay seleccionado un
intervalo.
Al asignar a SelStart y SelEnd un valor, podremos ver que en el control aparece de un color
diferente el rango seleccionado y que, adems aparecen dos marcas especiales, dos pequeos
tringulos, que se delimitan perfectamente el intervalo.

4.IV Los controles ProgressBar, SpinButton, SpinEdit y


UpDown
El control ProgressBar
Entre los componentes de Delphi encontramos uno llamado TProgressBar
, cuya finalidad es
mostrar de forma grfica el estado actual del curso de un proceso. En apariencia este control es
parecido a un TPanel, contando con propiedades similares a las de un control TTrackBar.
Antes de iniciar el proceso cuyo curso vamos a reflejar mediante el TProgressBar, deberemos
asignar a las propiedades Min y Max de este control un valor mnimo y un valor mximo, que
correspondern al estado de inicio y fin del proceso.
A medida que el curso del proceso vaya avanzando, deberemos actualizar en consecuencia el valor
de la propiedad Position, lo que tendr un reflejo inmediato en el aspecto del control, que se ir
llenando de bloques de color que indicarn la parte que ya se ha completado. En lugar de
manipular directamente un valor de la propiedad Position, podemos asignar previamente un valor
de incremento a la propiedad Step, llamando posteriormente, en cada paso, al mtodo StepIt, que
se encargar de realizar la actualizacin. Tambin tenemos a nuestra disposicin el mtodo StepBy,
que acepta como parmetro un valor de incremento, valor que se sumar al contenido que tenga
en ese momento en la propiedad Position.

Los controles SpinButton y SpinEdit


En la hoja Samples de la paleta de componentes Delphi existen dos controles, TSpinButton

TSpinEdit
, que utilizan dos pequeos botones con unas flechas en su interior para facilitar el
incremento y decremento de un valor, que en el segundo caso se almacena en un campo de
edicin.
En el caso del TSpinButton, podemos asociarlo a un control TEdit mediante su propiedad
FocusControl. Adems, si pulsamos el botn de la flecha hacia arriba se generar un evento
OnUpClick, y si pulsamos el botn de la flecha hacia abajo se generar un evento OnDownClick. En
respuesta a estos eventos podemos poner el cdigo conveniente, por ejemplo, podemos poner
cdigo para aumentar o disminuir el valor del campo Edit al que est asociado.
Si se trata de aumentar o disminuir valores numricos, puede ser ms conveniente usar el control
TSpinEdit, pues viene con el campo de edicin incorporado. Si cambiamos el valor de la propiedad
MinValue cambiaremos el valor mnimo que puede tomar el campo de edicin; por contra, si
cambiamos el valor de la propiedad MaxValue cambiaremos el valor mximo que puede tomar el
campo de edicin (hablamos siempre de valores numricos). El valor de la propiedad Increment

nos dice de cunto en cunto se incrementarn los valores del campo de edicin. Adems, el valor
del campo de edicin lo tenemos en la propiedad Value.

El control UpDown
En en la pgina Win95 de la paleta de componenetes Delphi hay un control, llamado TUpDown
, que funciona de forma similar, con la diferencia de que puede ser asociado a cualquier otro
control y dispone de alguna posibilidad ms.
Mediante la propiedades del control TUpDown, que en parte se enumerarn en la siguiente tabla,
podremos establecer los lmites para el valor que se gestiona, as como el incremento o
decremento que sea aplicar al pulsar el botn, su aspecto, control al que est asociado, etc.
Propiedad

Tipo

Contenido

AlignButton

TUDAlignButton

Posicin del control

ArrowKeys

Boolean

Indica si se puede usar las flechas del teclado

Associate

TWinControl

Control al que est asociado

Increment

Integer

Incremento a aplicar

Max

Integer

Valor mximo

Min

Integer

Valor mnimo

Orientation

TUDOrientation

Orientacin del control

Thousands

Boolean

Indica si se utilizan separadores de miles

Position

Integer

Posicin del cursor en el control

Wrap

Boolean

Indica si se pone a cero al superar el mximo

Control del valor


Para usar un control TUpDown, uno de los primeros pasos que deberemos dar ser el
establecimiento del valor mnimo y mximo permitido, en las propiedades Min y Max,
respectivamente. El valor actual ser el contenido en la propiedad Position, que se ver
incrementado o decrementado, segn la flecha que se pulse, en una magnitud determinada por el
valor de la propiedad Increment.
Si damos el valor True a la propiedad Wrap conseguiremos que el control funcione de forma
circular, de tal manera que al pulsar el botn de incremento encontrndonos ya en el lmite
superior, el valor pase a ser el mnimo y viceversa.

Estilo y control asociado


Los botones de un control TUpDown, que tienen dibujadas unas flechas en su interior, pueden
aparecer situados sobre el otro, o bien uno a la izquierda del otro, segn el valor que se asigne a la
propiedad Orientation. Por defecto esta propiedad tiene el valor udVertical, por lo cual los botones
aparecen situados uno sobre otro. Asignando a Orientation el valor udHorizontal conseguiremos
modificar el estilo del control, de tal forma que los botones se siten uno a la izquierda del otro.
En caso de que el valor que va a contener este control supere los tres dgitos, podemos dar el valor
True a la propiedad Thousands para conseguir que se utilice un separador de miles.
Asignando el valor True a la propiedad ArrowKeys, indicaremos al TUpDown que estando el control
asociado activo se pulsen las flechas arriba y abajo del teclado, se incremente o decremente
automticamente el valor. Esto es posible cuando el control asociado procesa estas pulsaciones de
la tecla, como un TEdit, en lugar de pasar a otro control, como hace un TButton.

4.V El control HotKey

La tecla de acceso rpido a una opcin de men se almacena en la propiedad ShortCut del objeto
TMenuItem que representa a cada opcin de men,la cual puede ser modificada en cualquier
momento, incluso en tiempo de ejecucin. El problema que nos encontramos es cmo saber cul es
el cdigo a asignar a esta propiedad dependiendo de la combinacin de teclas que se desee utilizar.
Una posibilidad es utilizar la funcin TShortCut, que podemos asignar a la propiedad ShortCut. Sin
embargo, an deberemos llevar a cabo algn proceso complejo, ya que tendremos que preguntar
al usuario qu combinacin es la que desea establecer, detectando la pulsacin de teclas como
<Alt>, <Control>, teclas de funcin, etc. La solucin al problema que se nos plantea la
encontramos en el control THotKey, cuya finalidad bsica es facilitar la entrada, por parte del
usuario del programa, de una tecla de acceso rpido. La apariencia de este control es la de un
TEdit, pero en l no es posible teclear texto, ya que en el momento en que se pulsa una tecla o
combinacin de teclas, lo que aparece en el control es una cadena descriptiva de esa combinacin.

Uso de un control THotkey


Adems de las propiedades habituales de todos los controles, que ya conocemos, un control
THotKey
cuenta con tres propiedades clave, que le diferencian del resto. Estas propiedades
son HotKey, InvalidKeys y Modifiers. La primera de ellas es de tipo TShortCut y contendr el cdigo
correspondiente a la combinacin de teclas que se hayan pulsado.
Esta propiedad puede ser modificada tanto en tiempo de diseo como en ejecucin, pero lo
habitual es que sea el usuario el que la modifique de forma indirecta.
Generalmente una tecla de acceso rpido es una combinacin compuesta por una tecla normal,
letra, nmero o de funcin, y una tecla modificadora, como puede ser <Control>, <Alt>, <Shift> o
cualquier combinacin de estas. Mediante la propiedad InvalidKey podemos establecer aquellos
modificadores que no deseamos que sean vlidos, impidiendo que el usuario los utilice.
En la siguiente tabla se muestran los valores posibles para asignar:
Constante

Tecla representada

hcAlt

<Alt>

hcCtrl

<Control>

hcCtrlAlt

<Control> + <Alt>

hcNone

Ninguna

hcShift

<Mayscula>

hcShiftAlt

<Mayscula> + <Alt>

hcShiftCtrl

<Mayscula> + <Control>

hcShiftCtrlAlt

<Mayscula> + <Control> + <Alt>

Podemos saber qu teclas modificadoras se han usado en la combinacin introducida por el


usuario, o establecerlas mediante la propiedad Modifiers. Esta propiedad es de tipo THKModifiers,
un conjunto que puede contener uno o ms valores, enumerados en la siguiente tabla. En la
prctica, suponiendo que usemos este control para personalizar un men, ser el valor de la
propiedad HotKey el que nos interese.
Constantes

Tecla a la que representa

hkAlt

<Alt>

hkCtrl

<Control>

hkShift

<Mayscula>

hkExt

<Extra>

4.VI El control HeaderControl

Heredado de versiones anteriores de Delphi, existe un control, que ahora lo encontramos en la


pgina Win 3.1, llamado THeader, que permite crear cabeceras para listas y elementos similares.
Delphi cuenta, adems, con el control TheaderControl, que es parecido a THeader, aunque cuenta
con algunas posibilidades ms. Lo encontramos en la pgina Win 95 de la paleta de componentes,
bajo la apariencia
. Este control dispone de las propiedades habituales de todos los
componentes visuales, contando, adems, con la propiedad Align, que nos permite situarlo en el
lugar del form que ms nos convenga, y de la propiedad Sections, que nos servir para definir las
diferentes secciones en que se dividir el control.
La propiedad Sections de este control es de tipo THeaderSection, que al igual que ocurre con la
propiedad Panels del control TStatusBar, hace referencia a un objeto, que contiene un elemento
por cada seccin de la cabecera. Las propiedades de cada uno de estos elementos definen el texto
que se mostrar en esa seccin, su ajuste, lmites, etc. En la siguiente tabla se enumeran algunas
propiedades de un objeto THeaderSection:
Propiedad

Tipo

Contenido

Alignment

TAlignment

Alineacin del texto en la seccin

AllowClick

Boolean

Indica si la seccin puede ser pulsada

MaxWidth

Integer

Anchura mxima de la seccin

MinWidth

Integer

Anchura mnima de la seccin

Style

THeaderSectionStyle

Estilo de la seccin

Width

Integer

Anchura actual de la seccin

Al igual que ocurre con los paneles de una lnea de estado, las secciones de un control
THeaderControl pueden contener un texto, si la propiedad Style tiene asignado el valor hsText, o
bien ser dibujadas por el programa, si el estilo es hsOwnerDraw. El texto a mostrar lo facilitaremos
en la propiedad Text. Si hemos optado por el estilo hsOwnerDraw deberemos responder
adecuadamente al evento OnDrawSection, en el que recibiremos una referencia al THeaderControl,
otra a la seccin a dibujar, un objeto TRect con las coordenadas del rea de dibujo y un parmetro
de tipo Boolean que nos indicar si el botn est pulsado o no.
El ancho de cada una de las secciones de una cabecera es establecido por la propiedad Width de
cada objeto THeaderSection. Este valor habr de encontrarse entre los lmites fijados por las
propiedades MinWidth y MaxWidth.

Definir secciones de la cabecera


Las secciones de un control THeaderControl pueden ser definidas tanto en tiempo de diseo como
durante la ejecucin del programa. En el primer caso tendremos que usar la propiedad Sections,
haciendo un doble clic sobre ella en el Inspector de Objetos, para acceder a la ventana de edicin
de secciones. Esta ventana es similar a la usada para definir paneles de una barra de estado. Tras
pulsar el botn Add, podremos seleccionar el estilo de la seccin, introducir el texto que deseamos
mostrar en ella, establecer la anchura y sus lmites o fijar la alineacin del texto. Tambin
podremos indicar si es posible pulsar las secciones como si fuesen botones, generando el evento
OnSectionClick correspondiente. Durante la ejecucin del programa tambin es posible definir las
secciones de una cabecera, de forma similar a como definamos los paneles de un TStatusBar, ya
que el funcionamiento de ambos controles es muy parecido.

4.VII El control PageControl


A veces, la cantidad de informacin que es necesario solicitar o mostrar excede la capacidad
habitual de una ventana, siendo preciso usar varias para poder gestionar todos los controles
requeridos. Una alternativa a la creacin de mltiples ventanas consiste en definir varias pginas
en la misma ventana, lo cual es posible mediante varios de los controles incluidos en Delphi. Entre
ellos existe uno que nos permite gestionar varias pginas en un form, en este caso con el nuevo

aspecto de Windows 95. Este control se llama TPageControl


propiedades:
Propiedades

Tipo

y dispone de las siguientes


Contenido

ActivePage

TTabSheet

Pgina actualmente activa

MultiLine

Boolean

Indica si se permiten varias lneas

PageCount

Integer

Nmero de pginas existentes

Pages

TTabSheet

Matriz con las pginas existentes

TabHeight

SmallInt

Altura de las pestaas de las pginas

TabWidth

SmallInt

Anchura de las pestaas de las pginas

Cada una de las pginas contenidas en un control TPageControl es un objeto de tipo TTabSheet.
Podemos acceder o modificar la pgina activa mediante la propiedad ActivePage y acceder a cada
una de las pginas a travs de la propiedad Pages, que es una matriz de objetos TTabSheet. Esta
matriz contendr tantos elementos como indique la propiedad PageCount, que est disponible slo
en tiempo de ejecucin y, adems, es de slo lectura.

Definir las pginas de un TPageControl


Al insertar un control TPageControl en el form tan slo tendremos una superficie con un borde,
similar a un TPanel, pero en principio no existir pgina alguna. Cada vez que deseemos aadir una
pgina al control deberemos abrir el men emergente, pulsando el botn derecho del ratn con el
puntero sobre el control, y seleccionar la opcin New Page. Al hacerlo aparecer una pgina vaca
con un ttulo por defecto en la pestaa y en el Inspector de objetos podremos ver las propiedades
del objeto TTabSheet que acabamos de crear.
Mediante las propiedades del TTabSheet podemos establecer el ttulo que aparecer en la pestaa
(Caption), el tipo de letra (Font), su estado actual (Enabled y Visible), etc. Adems de estas
propiedades, habituales en todos los componentes visibles, al actuar como un contenedor para los
controles, un TTabSheet cuenta tambin con las propiedades ComponentCount, Components,
ControlCount y Control.
Por defecto la pestaa de acceso a una pgina est visible, lo que permite en tiempo de ejecucin
que el usuario pueda pulsarla activando esa pgina. Podemos dar el valor False a la propiedad
TabVisible del TTabSheet para ocultar la pestaa correspondiente, desactivando as el acceso a esa
pgina.

Propiedades comunes a todas las pginas


Por defecto, cada una de las pestaas ajusta su tamao al necesario para contener el ttulo que se
haya asignado a la propiedad Caption. Esto es as porque inicialmente las propiedades TabHeight y
TabWidth tienen el valor cero, pero asignando el valor que a nosotros nos interese podremos
establecer un alto y ancho comn para todas las pestaas.
Por regla general el nmero de pginas existentes en una ventana no es muy grande, por lo que
todas las pestaas se pueden alinear en una sola fila. En caso de que esto no sea posible,
automticamente aparecer en el extremo derecho un control con dos botones, que permitirn el
desplazamiento de las pestaas a izquierda y derecha. Si no deseamos este funcionamiento,
podemos dar el valor True a la propiedad MultiLine, lo que har que las pestaas se distribuyan en
tantas filas como sea necesario.

Mtodos de TPageControl
Ya sabemos que en tiempo de ejecucin el usuario puede cambiar la pgina activa de un
TPageControl con tan solo una pulsacin de ratn. Nosotros, desde el cdigo de nuestro programa,
tambin podemos cambiar de una pgina a otra, simplemente asignando a la propiedad ActivePage
el nombre del TTabSheet correspondiente.

Otra forma de cambiar de una pgina a otra en utilizar el mtodo SelectNextpage, que nos permite
desplazarnos a la pgina siguiente o anterior, dependiendo de que pasemos como parmetro el
valor True o False, respectivemente. Tambin podemos usar el mtodo FindNextPage, que facilita el
desplazamiento a la pgina siguiente o anterior a una dada. Al llamar a este mtodo pasaremos
tres parmetros: el nombre de la pgina de referencia, un valor de tipo Boolean indicando si se
desea ir a la siguiente, True, o a la anterior, False y por ltimo otro valor de tipo Boolean, que en
caso de ser True indicar al control que slo devuelva pginas que estn activas.

TTabControl
El control TTabControl
, es por el contrario un control simple, que muestra con una apariencia
prcticamente idntica a un TPageControl. Las diferencias, sin embargo, son muchas, ya que el
TTabControl no acta como un contenedor, ni intercambia automticamente pginas. Su finalidad
es, por lo tanto, servir simplemente como un conjunto de opciones que se muestran en forma de
pestaas, de las cuales se puede seleccionar una en cada momento.

4.VIII El componente TImageList


Algunos de los controles que veremos en los captulos siguientes, como TListView y TTreeView,
utilizan para visualizar sus elementos pequeas imgenes, que deben estar accesibles mediante un
tercer componente, llamado TImageList, que acta como contenedor. Puesto que es necesario
disponer de este contenedor de imgenes antes de poder utilizar los dos controles citados, vamos a
tratar en primer lugar el funcionamiento de TImageList. Podemos encontrarlo en la pestaa 'Win95'
de la paleta de componentes, siendo el de la imagen:
propiedades:
Nombre

Tipo

En la tabla siguiente vemos sus


Contenido

AllocBy

Integer

Incremento cada vez que sea necesario aumentar


el nmero de imgenes

BkColor

TColor

Color de fondo a usar al dibujar una imagen

BlendColor

TColor

Color de combinacin

Count

Integer

Nmero de imgenes contenidas

DrawingStyle TDrawingStyle Estilo para el dibujo de una imagen


Height

Integer

Altura de las imgenes

ImageType

TImageType

Tipo de imagen a utilizar para dibujar

Masked

Boolean

Indica si la ImageList contiene imgenes


transparentes o no

ShareImages Boolean

Indica si las imgenes son compartidas con otro


control

Width

Anchura de las imgenes

Integer

Todas las imgenes que se almacenan en un TImageList deben tener exactamente el mismo
tamao, por lo que si pretendemos tener disponibles imgenes de distinto tamao, tendremos que
usar varios componentes TImageList, uno por cada tamao.

Asignacin de imgenes en tiempo de diseo


Tras insertar un componente TImageList en un form, haz doble clic sobre l, o bien despliega el
men emergente y selecciona la opcin ImageList Editor, en la que podremos ir aadiendo
imgenes mediante el botn Add, estableciendo algunos parmetros como el color que ser
transparente, o si la imagen se ajusta a las dimensiones por defecto, se corta o aparece centrada.

Asignacin de imgenes en tiempo de ejecucin

En caso de que la imagen a cargar est almacenada en un archivo en forma de icono, archivos que
normalmente usan la extensin ICO, deberemos crear un objeto TIcon y cargar dicho archivo,
mediante el mtodo LoadFromFile, aadiendo la imagen a continuacin al TImageList mediante el
mtodo AddIcon, que toma como nico parmetro una referencia al TIcon, devolviendo un entero
indicando el ndice, en la lista de imgenes, de la imagen recin aadida.
Cuando se dibuja un icono, adems de los colores habituales de la paleta existe un color
transparente, con el que se pueden pintar aquellas zonas del icono que no deseamos que alteren el
fondo sobre el que posteriormente sern dibujados. Este "color" no existe en una imagen de mapa
de bits normal, que se almacena en un archivo BMP. Por ello, al aadir una imagen de este tipo al
TImageList, mediante el mtodo AddMasked, adems de una referencia al objeto TBitmap que
contiene la imagen, tambin debemos facilitar, como segundo parmetro, un TColor, indicando el
color de la imagen "mscara", que se usar a la hora de dibujar la imagen para evitar el borrado de
aquellas zonas del fondo que sean ocupadas por el color transparente de la imagen.
Otra opcin, a la hora de aadir una imagen, consiste en crear u obtener nosotros mismos la
mscara para la imagen, pasando los dos parmetros, imagen original y mscara, al mtodo Add,
que al igual que los dos anteriores devolver un entero facilitando el ndice de la imagen aadida.
Ciertos recursos de una aplicacin, como son las imgenes o iconos, pueden distribuirse de forma
conjunta con el ejecutable, en lugar de en archivos separados. Para ello se debe crear un archivo
de recursos cuyo nombre se facilita mediante la directiva $R al proyecto. Estos recursos pueden ser
cargados posteriormente mediante diversas funciones, siendo una de ellas el mtodo LoadResource
del componente TImageList. Al llamar a este mtodo debemos pasar tres parmetros: mediante el
primero indicamos el tipo de recurso que se va a cargar, que ser rtBitmap para una imagen de
mapa de bits, rtCursor para un cursor o rtIcon para un icono; el segundo parmetro ser un String
con el nombre que tiene el recurso en el archivo y el tercero un TColor que servir para crear la
mscara correspondiente.

Uso de las imgenes de un TImageList


Podemos recuperar una imagen usando el mtodo GetBitmap, pasando como primer parmetro el
ndice de dicha imagen, comprendido entre cero y el nmero de imgenes existentes menos uno, y
como segundo una referencia a un objeto TBitmap, en el que obtendremos la imagen con su
correspondiente mscara ya aplicada. En caso de que deseemos obtener la imagen en forma de
icono y no de mapa de bits simple, el mtodo a usar ser GetIcon y los parmetros el ndice de la
imagen y un objeto TIcon.
Si lo que pretendemos es utilizar la imagen para dibujarla, por ejemplo en el Canvas del form, en
lugar de obtenerla en un TBitmap y dibujarla a continuacin, podemos usar el mtodo Draw, al que
pasaremos los parmetros siguientes: una referencia al objeto TCanvas en el que se va a dibujar,
las coordenadas del punto a partir del cual se va a dibujar y, por ltimo, un entero especificando
cul de las imgenes contenidas en el TImageList es la que se va a dibujar.
Mediante un objeto TImageList es fcil superponer una imagen a otra, usando dos de sus mtodos.
Lo primero que hemos de tener en cuenta es que las dos imgenes han de existir en el TImageList.
El primer paso consistir en llamar al mtodo Overlay, pasando como primer parmetro un entero
indicando el ndice de la imagen que se va a superponer, y como segundo un TOverlay, que es un
nmero comprendido entre 0 y 3, que servir para identificar a esta imagen posteriormente. A
continuacin llamaremos al mtodo DrawOverlay, pasando los primeros cuatro parmetros que se
han citado para el mtodo Draw y como quinto el ndice, entre 0 y 3, que se utiliz en la llamada
Overlay.

Otros mtodos de TImageList


Adems de las propiedades y mtodos que hemos visto en los puntos anteriores, que son los
habituales y seguramente los que nos sern ms tiles, este componente cuenta con bastantes
ms mtodos. Entre ellos existen varios mtodos Insert, que funcionan de forma similar a Add pero
que en lugar de aadir la nueva imagen al final la insertan en una determinada posicin. Tambin
contamos con varios mtodos Replace, que nos permiten reemplazar unas imgenes ya contenidas
en el TImageList por otras nuevas.

5I. El control Main Menu


Todos hemos usado mens en los programas: son las barras de opciones que suelen aparecer
debajo de la barra de ttulo de los programas, justo encima del rea de trabajo del form. En Delphi
podremos encontrarlo bajo el icono
, en la pestaa Standard de la paleta de componentes. Con
l, podremos insertar un componente Main Menu en el form.
La propiedad principal de este componente es Items, una matriz de objetos TMenuItem, cada uno
de los cuales representa una opcin del men. La propiedad Items cuenta a su vez con una
propiedad Count, mediante la cual podremos saber el nmero de opciones que tiene el men. Cada
uno de los elementos de la matriz Items tiene a su vez una propiedad Count, que nos servir para
saber el nmero de opciones existentes en cada lista pues, como sabemos, dentro de una opcin
podemos tener ms subopciones y as sucesivamente.
Para facilitarnos la edicin de un men, Delphi dispone del Diseador de mens. Podremos acceder
a l haciendo doble click sobre el componente, o bien pulsando sobre la propiedad Items.
Aparecer una ventana en la que podremos ir introduciendo los ttulos de las opciones,
simplemente teclendolas, y componiendo la estructura del men desplazndonos, bsicamente,
mediante las teclas del cursor.

Edicin de un Men
Veamos un ejemplo de creacin del men. Para ello, partimos de un men vaco recin insertado
en el form. Introducimos la cadena &Bloque uno, que se ir mostrando en el inspector de objetos
junto a la propiedad Caption, y pulsamos la tecla RETURN. Con esto ya tenemos la primera opcin,
cuya primera letra, la 'B' est subrayada, denotando as que adems se trata de una tecla de
acceso rpido.
A la derecha de esta opcin y en la misma barra, aparecer un borde punteado, que nos indicar la
posicin en la que se introducir la siguiente opcin principal, mientras que justo debajo de la
opcin que acabamos de crear tambin aparece un borde punteado en vdeo inverso indicndonos
que podemos teclear la primera opcin del men Bloque uno. Si tras varias opciones queremos
mostrar una separada del resto por una lnea, tan slo habr que introducir un guin y pulsar
<RETURN>. Aparecer as en la ventana una lnea horizontal separando las anteriores opciones de
la siguiente.

Elementos del men


Cada una de las opciones que hemos insertado en el men anterior representa a un objeto del tipo
TMenuItem. Este tipo cuenta con las propiedades necesarias para, adems de conservar el ttulo,
activar o desactivar la opcin, mostrarla como marcada o desmarcada, asociar teclas de acceso
rpido, etc. En la siguiente tabla enumeramos algunas de sus propiedades.
Propiedad

Tipo

Comentario

Break

TMenuBreak

Tipo de divisin en el men

Caption

String

Ttulo de la opcin

Checked

Boolean

Indican si la opcin est marcada o no

Count

Integer

Nmero de opciones en este men

Enabled

Boolean

Indica si la opcin est activa

GroupIndex Byte

Facilita la unin de mltiples mens

Items

TMenuItem[] Matriz con las opciones

RadioItem

Boolean

Permite crear grupos de opciones exclusivas

ShortCut

TShortCut

Tecla de acceso rapido

Teclas de acceso rpido

Para crear teclas de acceso rpido a cada una de las opciones, desplegaremos la lista de
posibilidades correspondiente a la propiedad ShortCut, en el inspector de objetos, y
seleccionaremos la combinacin de teclas que queramos, que aparecer a la derecha de la opcin.

Opciones con ms opciones


Aunque una opcin puede dar paso a una cierta accin en el programa, tambin puede abrir una
nueva lista de opciones. La finalidad de la propiedad Items con la que cuenta cada objeto
TMenuItem es precisamente esa, contener las opciones correspondientes a una cierta opcin.
Puesto que las opciones de ese nuevo men tambin son objetos TMenuItem, cualquiera de ellas
puede dar paso a otro men, proceso que se puede repetir nivel tras nivel.
Para crear estas nuevas opciones pulsaremos sobre la opcin que queramos que tenga las otras
opciones las combinacin de teclas <Control> + <Cursor derecho>. Aparecer una nueva ventana,
en la que podremos aadir las nuevas opciones.

Mens multicolumna
En caso de que la lista cuente con un gran nmero de opciones, resultando demasiado larga,
podemos dividirla en dos o ms columnas, mediante la propiedad Break. Esta propiedad puede
tomar los valores que se muestran en la siguiente tabla.
Constante

Tipo de divisin

mbNone

Ninguna divisin. Es el valor por defecto

mbBreak

Divisin separada por un espacio

mbBarBreak Divisin separada por una lnea vertical

Insertar y eliminar opciones en tiempo de diseo


La disposicin de las opciones en un men no es algo esttico. As, si en un momento nos interesa,
podemos insertar una nueva opcin entre otras ya existentes, eliminar alguna e incluso cambiar el
orden de las ya existentes.
Para insertar una nueva opcin seleccionaremos aquella que queramos desplazar hacia abajo o
hacia la derecha y a continuacin pulsaremos la tecla <Insert>. Podremos ver cmo se abre un
espacio vaco, en el cual introduciremos la nueva opcin.
Si lo que queremos es eliminar una opcin de las ya existentes, lo nico que hemos de hacer es
seleccionarla y pulsar la tecla <Supr>. En caso de que la opcin que borremos tenga otras en un
nivel inferior, stas tambin sern borradas.
Por ltimo, tambin podemos alterar el orden de las opciones, tanto en la barra principal como en
una lista de submen. El mtodo es muy simple, utilizando el cursor del ratn y el botn izquierdo
para arrastrar y soltar la opcin en su nueva posicin.

El men emergente del Diseador de Mens


El Diseador de mens cuenta con un men emergente, al que podemos acceder mediante la
pulsacin del botn derecho del ratn. En l encontraremos algunas opciones que ya conocemos,
como la de insertar o borrar una opcin e insertar un nuevo men. La opcin Select menu nos
permite pasar a editar otro que exista en el form, sin necesidad de salir del Diseador de mens y
volver a entrar. La opcin Save as template nos permite salvar el men que estamos diseando
como si fuese una plantilla, de tal forma que, posteriormente, podamos insertarlo en cualquier otro
mediante la opcin Insert from template. En ltimo lugar encontramos la opcin Insert from
resource, que nos permite importar un men que haya sido diseado con cualquier otra
herramienta de edicin de recursos (siempre que se haya salvado en el formato habitual de los
archivos de recursos de Windows).

Finalizar la edicin

Cuando hayamos terminado el diseo de nuestro men, tendremos que cerrar el Diseador de
mens para volver a la edicin del form. Al hacerlo nos encontramos de nuevo con el componente
MainMenu y sus propiedades, as como el men que hemos diseado situado en la parte superior
del form. Si queremos acceder a las propiedades de cualquiera de los opciones existentes en el
men tenemos dos opciones: abrir de nuevo el Diseador de mens, realizando un doble clic sobre
el componente, o bien abrir la lista de componentes del Inspector de objetos, seleccionando el
objeto TMenuItem correspondiente a la opcin que deseamos manipular.

5II. El control PopUp Menu


Las similitudes entre un men del form y un men emergente son muchas, ya que en ambos casos
se trata de listas de opciones, que pueden tener asociada una tecla de acceso y dar paso a otras
opciones. La forma de disear un men emergente es tambin muy similar, con la diferencia de
que las opciones principales aparecen como una lista en el interior de una ventana, y no
distribuidas en una barra como un men del form.
Para crear un men emergente tendremos que insertar en el form un componente PopupMenu,
representado en la Paleta de componentes con el icono
, dentro de la pestaa Standard. En la
siguiente tabla vemos las propiedades del componente PopupMenu.
Propiedad

Tipo

Comentario

Alignment

TPopupAlignment Determinar la posicin de men

AutoPopup

Boolean

PopupComponent TComponent

Indica si el men se abrir automticamente


Componente que ha hecho aparecer el men

Activacin del Men


Podemos insertar en un form mltiples componentes PopupMenu, asociando cada uno de ellos al
control que nos interese, mediante la propiedad PopupMenu de que disponen la mayora de
controles.
El mtodo de activacin del men depender del valor que asignemos a la propiedad AutoPopup. Si
le damos el valor True, el men aparecer automticamente cuando se pulse el botn derecho del
ratn sobre el componente al que est asociado. Si dicha propiedad tiene el valor False, para
mostrar el men tendremos que utilizar el mtodo Popup del componente PopupMenu.
Si AutoPopup tiene el valor True, el men aparecer en la posicin especificada por la propiedad
Alignment, que puede tomar uno de los valores mostrados en la siguiente tabla:
Constante

Posicin del men

paLeft

Esquina superior izquierda en el puntero del ratn

paRight

Esquina superior derecha en el puntero del ratn

paCenter

Parte central superior en el puntero del ratn

En el caso de que la activacin del men se produzca mediante el mtodo Popup, se visualizar en
la posicin determinada por los parmetros pasados a dicho mtodo.
Si estamos utilizando un determinado men emergente para varios componentes, al producirse la
activacin necesitaremos saber cul de ellos es el afectado por las acciones del men. Para ello
tenemos a nuestra disposicin la propiedad PopupComponent, que es una referencia a dicho
componente.

Opciones visibles, activas y marcadas

Cuando no queramos que el usuario pueda elegir una determinada opcin tenemos dos
posibilidades: desactivarla o hacerla no visible. Para ello utilizaremos las mismas propiedades
Enabled y Visible que ya conocemos, asignndoles el valor True o False segn nos interese.
Si alguna de las opciones de nuestro men pueden tomar dos estados, activa o desactiva, podemos
mostrar el estado actual mediante la propiedad Checked. Si damos el valor True a esta propiedad,
a la izquierda de la opcin aparecer una pequea marca, indicando que en ese momento est
activada.
Dando el valor True a la propiedad RadioItems, que por defecto es False, conseguiremos que las
marcas anteriores aparezcan como pequeos crculos, al estilo de los botones de radio. Adems,
tan slo podr estar marcada en un determinado momento una opcin del grupo. Los grupos de
opciones se forman mediante la propiedad GroupIndex, de tal forma que todas aquellas opciones
que tienen un mismo valor en esta propiedad, forman un grupo.

El cdigo de las opciones


Para acceder al mtodo que actuar como gestor del evento de cada opcin, lo nico que tenemos
que hacer es elegirla en el men, en tiempo de diseo. En caso de que estemos tratando con un
men emergente, primero tendremos que hacer aparecer en el Inspector de objetos la opcin, para
a continuacin realizar un doble click sobre el evento OnClick.

Combinacin de mens
Como sabemos, en un proyecto pueden existir mltiples forms, uno de los cuales acta como
principal. Cada uno de los forms existentes puede contar con su propio men, que se mostrar en
la parte superior del form al que corresponda.
Si lo queremos, podemos combinar automticamente el men del form principal y cualquiera de los
forms secundarios, el que est activo en cada momento, de tal forma que el men de ste ltimo
sustituya en todo o en parte al men de la ventana principal. Para ello nos serviremos bsicamente
de dos opciones: AutoMerge y GroupIndex.
Mediante la propiedad AutoMerge, con la que cuenta todo componente MainMenu,
determinaremos qu mens se combinarn con el men del form principal y cules no. Si
disponemos en un form de un men que nosotros queremos combinar con el del form principal,
habr que dar el valor True a esta propiedad. Si, por el contrario, queremos que el men aparezca
en su propio form, dejaremos el valor por defecto, que es False.
En principio, el men del form secundario que est activo sustituir totalmente al men del form
principal, a no ser que nosotros indiquemos lo contrario, para lo cual tendremos que utilizar la
propiedad GroupIndex.
Esta propiedad est presente en todos los objetos TMenuItem, aunque slo es habitual utilizarla en
aquellas opciones que forman parte de la barra principal. La norma general de funcionamiento es la
siguiente: una opcin del men del form secundario que tenga un valor en GroupIndex igual al de
una opcin del form, sustituir a dicha opcin.
Aquellas opciones cuyo valor de GroupIndex no tengan correspondencia en el men del form
principal sern insertadas, en las posiciones que le correspondan segn el orden establecido por el
valor de esa propiedad. De igual forma, todas aquellas opciones del men principal cuyo valor de
GroupIndex no tenga correspondencia con ninguna opcin del form secundario, permanecern en
el men.

Aadir opciones en tiempo de ejecucin


El primer paso que tendremos que dar ser la creacin del objeto TMenuItem. Para ello usaremos
el constructor Create, que tomar como nico parmetro una referencia al componente al que
pertenecer la opcin. El siguiente paso ser el establecimiento adecuado de las propiedades del
nuevo objeto, fijando el ttulo, estado inicial, el gestor del evento, etc. Por ltimo aadiremos la
nueva opcin al men que nos interese, para lo cual tenemos a nuestra disposicin dos mtodos:
Add aadir la nueva opcin, cuyo objeto se pasa como parmetro, al final del men

correspondiente, e Insert, que nos permite insertar la nueva opcin en una determinada posicin,
para lo cual el primer parmetro indicar dicha posicin, sabiendo que el primer elemento del men
tiene ndice cero. Podemos conocer el ndice correspondiente a una opcin dada mediante el
mtodo IndexOf, que tomar como parmetro la referencia a la opcin cuya posicin deseamos
determinar.

6I. Algunas ventanas predefinidas


Es bastante corriente necesitar en la aplicacin de alguna ventana para solicitar datos, o para
mostrar algn mensaje de error, de confirmacin... segn lo que el programa requiera. Podramos
disearnos nosotros los forms adecuados para cada caso, y luego usarlos en la aplicacin, pero si
se trata de entrada de datos bsica o de un simple mensaje de informacin, puede ser ms
cmodo utilizar algunas de las funciones que pone Delphi a nuestra disposicin para tal efecto, y
que son las que comentamos en este apartado. Para usarlas, tendremos que asegurarnos de incluir
la unit Dialogs en la clsula uses.

ShowMessage(Cadena);
Tal y como su nombre indica, muestra el mensaje 'Cadena', que debe ser un string, en una
pequea ventanita que se muestra en el centro de la pantalla, como la del dibujo:

Si no queremos que aparezca en el centro de la pantalla, podemos utilizar


ShowMessagePos(Cadena, x, y);
cuya nica diferencia con el anterior es que toma dos parmetros adicionales, mediante los cuales
especificaremos la posicin de la esquina superior de la ventana. Estas coordenadas sern relativas
a la pantalla y no a un form de la aplicacin.

MessageDlg(Mensaje, Tipo, Botones, Ayuda): Word;


Esta funcin permite un poco ms de juego que la simple ShowMessage, en el sentido de que nos
permite especificar algunos detalles, y nos devuelve un valor que nos dice qu botn ha sido
pulsado. Los parmetros que necesita la funcin son:
Una cadena conteniendo el mensaje que queremos visualizar en el interior de la ventana,
con un mximo de 255 carcteres.
Una constante indicando el tipo de ventana que queremos mostrar. Las constantes
disponibles son:
Constante
mtCustom

mtWarning
mtError
mtInformation

Icono que aparecer en el


interior
Ninguno. El ttulo de la
ventana ser el nombre del
programa

mtConfirmarion

Dependiendo de la que seleccionemos, en la ventana aparecer un icono distinto y el ttulo


utilizado ser acorde con dicho icono.
El tercer parmetro ser un conjunto (un set), en el que indicaremos los botones que
queramos que aparezcan en el interior de la ventana. Dicho conjunto puede estar vaco,
contener un botn o ms de un botn. En la siguiente tabla se enumeran las constantes
que representan a cada uno de los botones. Cuando se quiera ms de un botn, las
constantes deben estar separadas por comas.
Constante Botn correspondiente

mbYes

mbOk

OK

mbNO

No

mbCancel

Cancelar

mbHelp

Ayuda

mbAbort

Abortar

mbRetry

Reintentar

mbIgnore

Ignorar

mbAll

Todo

Por ltimo podremos facilitar un identificador asociado a una pgina de ayuda, que
aparecer en caso de que se pida ayuda estando activa la ventana mostrada por
MessageDlg. Si no vamos a poner ayuda, simplemente escribiremos un 0.

Una vez que el usuario pulsa cualquiera de los botones existentes en la ventana, sta se cierra y la
funcin MessageDlg devuelve un valor que nos servir para conocer qu botn ha sido el pulsado y,
por lo tanto, qu accin tenemos que llevar a cabo. En la siguiente tabla se muestran las
constantes que representan los distintos valores de retorno.
Constante

Botn que se ha pulsado

mrNone

Ninguno, la ventana ha sido cerrada

mrOk

mbOk

mrYes

mbYes

mrNo

mbNo

mrCancel

mbCancel

mrAbort

mbAbort

mrRetry

mbRetry

mrIgnore

mbIgnore

mrAll

mbAll

Al igual que ocurre con ShowMessage, la ventana mostrada con MessageDlg aparecer en el centro
de la pantalla. Si queremos visualizarla en una cierta posicin utilizaremos la funcin
MessageDlgPos, que adems de los parmetros descritos anteriormente, toma dos enteros
especificando las coordenadas en la que se situar la ventana.

Application.MessageBox(Texto, Caption, Tipo): Integer;


Es una funcin similar a MessageDlg. En Texto le pasamos el texto que queremos que aparezca en
la ventana, en Caption el que ser el ttulo de la ventana, y en Tipo le pasaremos una constante
que definir el tipo de la ventana, icono y botones. Si Texto o Caption son variables de tipo string
ser necesario convertirlas a PChar, si son constantes introducidas directamente en la funcin no.
La funcin nos devolver un entero, 0 si no ha conseguido abrir la ventana, o una de las siguientes
constantes:

Constante Valor

Significado

IDABORT

El usuario pulsa el botn Abort

IDCANCEL

El usuario pulsa el botn Cancel

IDIGNORE

El usuario pulsa el botn Ignorar

IDNO

El usuario pulsa el botn No

IDOK

El usuario pulsa el botn Ok

IDRETRY

El usuario pulsa el botn Reintentar

IDYES

El usuario pulsa el botn Yes

Algunos de los valores posibles para Tipo son:


MB_ABORTRETRYIGNORE
MB_ICONEXCLAMATION
MB_ICONINFORMATION
MB_ICONQUESTION
MB_ICONSTOP
MB_OK
MB_OKCANCEL
MB_RETRYCANCEL
MB_YESNO
MB_YESNOCANCEL

La ventana contiene tres botones:


Abortar, Reintentar e Ignorar.
Aparece un icono de exclamacin en la ventana.
Se trata de un icono con una 'i' en un bocadillo.
Es un icono con una interrogacin.
Se trata de un icono con un signo de STOP.
La ventana contiene un botn de Aceptar.
La ventana contiene dos botones: Aceptar y Cancelar.
La ventana contiene dos botones: Reintentar
y Cancelar.
La ventana contiene dos botones: S y No.
La ventana contiene tres botones:
S, No, y Cancelar.

Si, por ejemplo, queremos una vetana con un icono de exclamacin y los botones correspondientes
a la constante MB_YESNOCANCEL, pondremos en el parmetro Tipo de la funcin lo siguiente:
MB_ICONEXCLAMATION + MB_YESNOCANCEL

InputBox(Titulo, Mensaje, ValorPorDefecto): String;


Si lo que necesitamos es solicitar datos, tenemos disponible esta funcin. Los parmetros Titulo y
Mensaje son dos cadenas en las que especificaremos el ttulo de la ventana y el mensaje para
solicitar los datos, respectivamente. El tercer parmetro es un valor por defecto como respuesta. Si
se pulsa el botn Aceptar, la funcin devolver una cadena con la respuesta introducida. Si se
pulsa el botn Cancelar o la tecla <ESC>, el valor por defecto ser la cadena que devuelva la
funcin.

InputQuery(Titulo, Mensaje, VariableRespuesta): Boolean;


Si necesitamos saber cmo se ha cerrado la ventana, entonces usaremos esta funcin. Al igual que
la anterior, esta funcin tambin toma tres parmetros, siendo los dos primeros idnticos en tipo y
finalidad. Sin mebargo, el tercer parmetro habr de ser necesariamente una variable de tipo
String, en la que ser devuelto el dato introducido por el usuario. A diferencia de InputBox,
InputQuery devuelve True o False, dependiendo de que el usuario haya pulsado <Intro> o <Esc>
respectivamente (o bien Aceptar o Cancelar).

6II. Uso de varios forms en la aplicacin


A pesar de que en el captulo anterior vimos algunas funciones que nos facilita Delphi para no
construir un form adrede pidiendo un dato o mostrando un mensaje, a buen seguro en nuestra
aplicacin vamos a necesitar tener ms de un form, constituyendo cada uno las distintas pantallas
de las que consta. En este punto vamos a ver cmo llevar a cabo una aplicacin que gestione
varios forms, como crearlos en tiempo de ejecucin y como tenerlos accesibles desde el resto de
los forms.

Los forms de un proyecto pueden ser creados al inicio del programa, cuando ste se carga en
memoria, de tal forma que podamos hacer referencia a ellos desde cualquier punto en que nos
convenga. La creacin automtica de los forms se determina en la pgina Forms de las opciones
del proyecto. Inicialmente, todos los forms aparecern en la lista de la izquierda, Auto-create
forms, indicando as que sern creados al inicio de la ejecucin sin intervencin nuestra.
Sirvindonos de los botones situados en la parte central, entre las dos listas, podremos mover
forms de una lista a otra. Los forms que desplacemos a la lista Avaible forms no sern creados al
inicio de la aplicacin, por lo que antes de poder usarlos en el programa habr que crearlos.

Crear un form
Antes de poder hacer referencia a un form desde otra Unit, habr que aadir a la clusula Uses de
dicha Unit la referencia, es decir, el nombre de la Unit asociada al form.
Vamos a suponer que tenemos un proyecto con dos forms y sus dos Units, UPrincipal y
USecundaria. Para poder hacer referencia al segundo form desde el cdigo del primero,
aadiramos a la clusula Uses de sta el mdulo USecundaria. Esta operacin se puede realizar
automticamente, mediante la opcin Use Unit del men File. Al seleccionarla aparece una lista
con los mdulos disponibles en el proyecto, slo aquellos que no estn ya en uso en el mdulo
actual, pudiendo seleccionar cualquiera de ellos.
Dada por supuesta la resolucin de referencia anterior, para crear un form (que no est en AutoCreate Forms, sino que est en Available Forms) tendremos que utilizar el constructor Create, que
acta como el de cualquier otro componente, tomando un parmetro que ser una referencia al
objeto que se convertir en padre del nuevo form.
Otro mtodo que nos permite crear un form en tiempo de ejecucin viene dado por el objeto
Application, del tipo TApplication y que se crea al comenzar el programa. Este objeto cuenta con
un mtodo, llamado CreateForm, al que pasndole como parmetro el tipo del form a crear y ua
variable donde almacenar la referencia, crear el form de forma similar a como lo hara el
constructor Create.
Cuando el form que hemos creado no nos vaya a servir ms, tendremos que liberar la memoria que
se asign al crearlo, para lo cual llamaremos al mtodo Free con el que cuentan todos los forms.
Vamos a aclarar un poco el punto del tipo del form. Cuando estamos creando un form, en tiempo
de edicin, ese form tiene asociado un Name, que es como se le distingue de otros objetos. Ahora
bien, si nos fijamos en el inspector de objetos, cuando tenemos seleccionado el form, supongamos
que con Name=FrmPrincipal, veremos que pone FrmPrincipal: TFrmPrincipal. Precisamente,
TFrmPrincipal es el tipo del form que estamos creando. As, en el caso que estamos describiendo,
para crear dinmicamente el form va el mtodo de TApplication, escribiremos:
Application.CreateForm(TFrmPrincipal, FrmPrincipal);
siendo TFrmPrincipal el tipo del form, y FrmPrincipal el nombre del form concreto que es de ese
tipo.

Ventajas y desventajas
Si en una aplicacin se cuenta con muchos forms y todos ellos son creados al inicio, est claro que
el programa consumir una cantidad de memoria muy superior a la que sera necesaria si los forms
se fuesen creando y liberando a medida que fuesen precisos.
Otra de las desventajas que tiene la creacin automtica de todos los forms al inicio de la
aplicacin, es el tiempo que sta tarda en cargarse y mostrarse activa. Obviamente, cuantos ms
forms se tengan que crear, el programa tardar ms en ponerse en funcionamiento.
Ahora bien, si se trata de una aplicacin con pocos forms, tres o cuatro, entonces es ms
recomendable que se creen automticamente al principio, pues minimizaremos los riesgos de que
se nos olvide liberar los forms cuando ya no vayamos a usarlos.

Mostrar un form

Independientemente del mtodo que hayamos seleccionado para crear un form, a la hora de
utilizarlo en nuestro programa tendremos que hacerlo visible, para lo cual podemos utilizar varios
mtodos. Uno de ellos consiste en dar el valor True a la propiedad Visible, lo que causar la
aparicin inmediata del form. El efecto ser similar si llmamos al mtodo Show, ya que ste
bsicamente lo que hace es dar el valor True a esa propiedad, aunque, adems, se asegura de que
el form est sobre los dems, llamando si es necesario al mtodo BringToFront.
Al mostrar el form mediante cualquiera de los dos mtodos anteriores, estaremos visualizando una
ventana no modal, lo que quiere decir que si el programa mantiene abiertas otras ventanas,
podemos activarlas sin cerrar necesariamente aquella en la que nos encontramos actualmente.
Para ocultar una ventana no modal podemos tambin utilizar dos mtodos: llamar al mtodo Hide,
o bien damos el valor False a la propiedad Visible.

Cuadros de dilogo modales


Hay ocasiones en las que, al mostrar una ventana, lo que se persigue es que el usuario introduzca
o tome alguna informacin y la cierre antes de continuar, no permitiendo el acceso a ninguna otra
parte de la aplicacin mientras tanto. A este tipo de ventanas se les llama cuadros modales, para lo
que tendremos que mostrarla usando el mtodo ShowModal.
Un form que se muestra como modal suele tener unas caractersticas que le diferencian de una
ventana normal. Por ejemplo, la inexistencia de los botones para minimizar y maximizar, la
imposibilidad de modificar su tamao en tiempo de ejecucin o la incorporacin de algunos botones
generales, como OK o Cancel. A las ventanas que cuentan con estas caractersticas y se muestran
como modales se les conoce como cuadros de dilogo.
Para conseguir que cualquiera de nuestros forms se convierta en un cuadro de dilogo, tendremos
que seguir por tanto las indicaciones anteriores. Para evitar la aparicin de los botones de
minimizar y maximizar y no permitir el cambio de tamao durante la ejecucin, bastar con que
demos el valor bsDialog a la propiedad BorderStyle. Con el fin de hacerlo modal y que la aplicacin
no contine su curso mientras no se cierre esta ventana, deberemos hacerla visible usando el
mtodo ShowModal. Por ltimo, un cuadro de dilogo para cerrarse y ocultarse no utiliza el mtodo
Hide ni la propiedad Visible, sino que da un valor distinto de cero (o bien de la constante mrNone,
que se define precisamente con el valor 0) a la propiedad ModalResult. Esto provoca la
desaparicin inmediata de la ventana y el valor asignado a la propiedad ModalResult ser el mismo
que devuelva la llamada al mtodo ShowModal, que es una funcin. De esta forma al mostrar un
cuadro de dilogo, el cdigo que lleva a cabo esta operacin puede obtener un valor de retorno que
le servir de informacin, de forma similar a como utilizbamos el valor de retorno devuelto por la
funcin MessageDlg.

7I. Los cuadros OpenDialog y SaveDialog


Los llamados Common Dialogs son una serie de cuadros de dilogo muy habituales en las
aplicaciones bajo Windows (de ah el nombre), que ya vienen, digamos, prefabricados, porque es
tan comn usarlos que no vale la pena obligar al programador a que los reinvente cuando tuviera
la necesidad de utilizarlos en su programa. Estos cuadros son los tpicos de abrir un archivo,
guardarlo, imprimir, impresora, fuentes... y son los que vamos a ver en este ltimo bloque de
captulos del curso.
Todos estos cuadros aparecen en la pestaa Dialogs de la paleta de omponentes, y tienen unas
caractersticas comunes, como no disponer de un tamao ni un elemento de interfaz en tiempo de
diseo. Se trata de componentes que en tiempo de ejecucin no son visibles en el form, de forma
similar a lo que ocurra con el componente Timer.
Para hacer visible el cuadro de dilogo representado por uno de los controles, hemos de utilizar el
mtodo Execute, que no toma parmetro alguno y puede devolver True o False, indicando que el
cuadro de dilogo se ha cerrado por la pulsacin del botn OK o bien por otro mtodo distinto,
respectivamente.
Las caractersticas del cuadro de dilogo en el momento de la visualizacin dependern de los
valores que hayamos asignado previamente a sus propiedades.

El componente OpenDialog

Este componente aparece en la Paleta con el icono


que disponemos para l.

. Veamos algunas de las propiedades de las

Ttulo de la ventana
Por, defecto el cuadro de dilogo tendr un ttulo genrico, que nosotros podemos personalizar
utilizando la propiedad Title. La cadena que asignaremos a esta propiedad ser la que aparezca
como ttulo en la parte superior de la ventana. La propiedad Title del componente OpenDialog
sera equivalente a la propiedad Caption de un form.
Archivo seleccionado
El nombre de archivo que aparezca inicialmente seleccionado, en el apartado Nombre de archivo,
depender del valor que asignemos a la propiedad FileName. Asignando una cadena vaca dicho
apartado aparecer en blanco, mientras que si facilitamos una cadena conteniendo el nombre de
un archivo ste aparecer como el archivo elegido por defecto.
Una vez que el usuario haya seleccionado el archivo que desea abrir, tecleando su nombre o
eligindolo de la lista, y cerrado el cuadro de dilogo, podremos obtener el nombre y todo el
camino completo mediante la propiedad FileName.
Archivos que aparecen en la lista
Podemos facilitar una lista de tipos de archivos que deben aparecer en el cuadro de dilogo,
mediante la propiedad Filter, a la que asignaremos una cadena que contiene una descripcin del
tipo de archivo y la referencia correspondiente, que normalmente se compone de un asterisco, un
punto y la extensin. Estos dos componentes los separamos mediante el smbolo | (ASCII 124). Si
queremos, podemos dar varios tipos de archivo, separando los datos de uno de los del siguiente
mediante ese mismo carcter. En caso de que un determinado tipo de archivo est asociado con
varias extensiones distintas, stas se facilitarn separndolas por punto y coma.
Por ejemplo, si asignamos la cadena
Archivos de texto | *.txt | Pginas web | *.htm; *.html
a la propiedad Filter de este cuadro de dilogo, apareceran en la lista de archivo dos elementos,
Archivos de texto y Pginas web.
Cuando se facilitan varios filtros para un cuadro de dilogo, por defecto aparece seleccionado el
primero. Si queremos, podemos hacer aparecer cualquier otro modificando el valor de la propiedad
FilterIndex, que por defecto es 1. Por ejemplo, si antes de mostrar el cuadro de dilogo en el que
hemos establecido el filtro anterior damos el valor 2 a FilterIndex, en la lista aparecern por
defecto las Pginas web.
Extensin por defecto
La propiedad DefaultExt nos puede servir para aadir una extensin por defecto cuando el usuario
no la haya especificado. Por defecto el valor de la propiedad DefaultExt es una cadena vaca, lo que
indica que no se aadir extensin alguna a los nombres de archivo.
Directorio inicial
Si lo queremos, podemos especificar una carpeta inicial mediante la propiedad InitialDir, a la que
asignaremos una cadena conteniendo la unidad y camino completo de la carpeta que aparecer
inicialmente abierto.
Otras opciones

El aspecto y comportamiento del cuadro de dilogo OpenDialog puede ser modificado segn las
opciones que activemos en la propiedad Options, que es un conjunto del tipo TOpenOptions. Por
defecto esta propiedad tiene como valor el conjunto vaco. Veamos las propiedades:

ofHideReadOnly: Oculta la caja de seleccin Abrir como slo lectura, impidiendo as que
el usuario abra un archivo en este modo.
ofFileMustExist: Aunque el cuadro de dilogo que estamos tratando tiene como finalidad
solicitar un nombre de archivo a abrir, se permite introducir el nombre de un archivo
inexistente, suponiendo que es posible crearlo. Activando esta accin forzaremos al usuario
a que elija un archivo existente, avisndole si es necesario mediante un mensaje que el
archivo que especifica no existe.
ofPathMustExist: Funciona de forma similar a la opcin anterior, avisando al usuario
mediante un mensaje en caso de que introduzca un camino de acceso inexistente.
ofNoChangeDir: Durante la seleccin de un archivo el usuario puede alterar el directorio
establecido como actual, haciendo actual cualquier otro. Activando esta opcin
conseguiremos que al cerrar el cuadro de dilogo el directorio actual vuelva a ser el que era
al principio, al mostrar la ventana.
ofCreatePrompt: En caso de que el archivo especificado no exista, se mostrar una ventana
preguntando si se desea crear.
ofExtensionDifferent: Cuando antes de visualizar el cuadro de dilogo se ha establecido una
extensin por defecto, mediante la propiedad DefaultExt, y el usuario posteriormente ha
introducido un nombre de archivo con una extensin distinta, esta opcin se activa.
Comprobando la existencia de ofExtensionDiferent en la propiedad Options, mediante el
operador Is, podremos por lo tanto saber si la extensin del archivo es la establecida por
defecto o no.
ofShowHelp: Activando esta opcin forzaremos la aparicin en el cuadro de dilogo de un
botn de ayuda.
ofNoValidate: Por defecto el cuadro de dilogo comprueba que los caracteres introducidos
por el usuario sean vlidos en un nombre de archivo, avisando mediante un mensaje en
caso contrario. Si activamos esta opcin evitaremos la citada comprobacin, permitiendo al
usuario introducir cualquier carcter.
ofAllowMultiSelect: Mediante esta opcin daremos al usuario la posibilidad de seleccionar
varios archivos a abrir, utilizando el mtodo habitual de seleccin mltiple de una lista. Para
obtener los nombres de los archivos seleccionados, en lugar de usar la propiedad FileName
tenemos a nuestra disposicin la propiedad Files, que es un objeto del tipo TStrings de slo
lectura, en el cual cada elemento contiene un nombre junto con su camino completo.

Al utilizar cualquiera de estas opciones hay que recordar que la propiedad Options es un conjunto y
que, por lo tanto, hemos de facilitar la lista de componentes de esas opciones entre corchetes.

El Componente SaveDialog
La operacin complementaria a la carga de un archivo es su grabacin, para la que dispone de un
componente llamado SaveDialog, que podemos encontrarlo bajo el icono
. La apariencia y el
funcionamiento de este cuadro de dilogo es muy similar al que acabamos de ver. De hecho, el
componente SaveDialog tiene exactamente con las mismas propiedades que OpenDialog.
La propiedad Options
No todas las opciones que hemos visto para la propiedad Options tienen sentido cuando lo que se
desea es salvar un archivo en lugar de cargarlo, por ejemplo la opcin OfFileMustExit, pues
perfectamente podemos grabar un archivo si no existe, lo crearamos en primer lugar.
Adems de las opciones vistas para el componente OpenDialog, en un cuadro de dilogo para
salvar un archivo tambin podemos utilizar ofOverwritePrompt. Al hacerlo, el cuadro de dilogo
comprobar si el archivo en el que se desea grabar ya existe y, en caso afirmativo, preguntar al
usuario si desea o no sobreescribir el contenido actual de ese archivo.

7II. Los cuadros FontDialog, ColorDialog y PrintDialog

FontDialog
Para facilitar la seleccin de un tipo y estilo de letra disponemos de l componente FontDialog, que
aparece en la Paleta de componentes como

Tipo inicial y elegido


Al mostrar el cuadro de dilogo, el tipo de letra, estilo, tamao y color seleccionados por defecto
dependern de los valores actuales de la propiedad Font, que como puede suponerse es un objeto
del tipo TFont. Por tanto, esta propiedad cuenta con otro conjunto de propiedades, como Name,
Size, Color y Style, que son las que nos permiten fijar las caractersticas de la fuente.
Una vez que el cuadro de dilogo es visualizado, el usuario puede alterar cualquiera de los
componentes: tipo, tamao, color y estilo. Al cerrar la ventana podremos obtener todos los datos
del tipo seleccionado mediante la misma propiedad Font.
Dispositivo destino
Bsicamente existen dos dispositivos que pueden ser destino de un texto: la pantalla y la
impresora. Estos dos dispositivos no funcionan de igual forma, por lo que puede ocurrir que un
cierto tipo de letra que est disponible en uno no lo est en otro y viceversa. Obviamente tambin
existen tipos de letra que estn definidos para ambos dispositivos.
Utilizando la propiedad Device podremos indicar el dispositivo que ser destino del tipo de letra,
limitando as las fuentes que se listarn en el cuadro de dilogo a slo aquellas que existan para
ese dispositivo. Los valores que puede tomar esta propiedad son:
Constante Dispositivo destino
fdScreen

Pantalla

fdPrinter

Impresora

fdBoth

Ambos

Opciones
Al igual que en los cuadros de dilogo vistos anteriormente, en este tambin existe una propiedad
Options que puede contener una o ms opciones, siendo el valor por defecto [fdEffects]. Las
opciones posibles y su finalidad son las siguientes:

fdTrueTypeOnly: En la lista aparecern slo fuentes TrueType, que se caracterizan por ser
escalables y poder utilizarse tanto en pantalla como en impresora.
fdScalableOnly: En la lista de tipos slo aparecern fuentes que sean escalables, ya sean
TrueType o no.
fdAnsiOnly: No se mostrarn en la lista aquellas fuentes que sean de smbolos, slo
aparecern las que tengan el conjunto de caracteres estndar.
fdFixedPitchOnly: En la lista slo apareceran tipos de letra de espaciado fijo.
fdNoVectorFonts: En al lista no aparecern los tipos de letra construidos con vectores.
fdWysiwyg: En la lista slo aparecern aquellos tipos de letra que estn disponibles tanto
para pantalla como para la impresora.
fdEffects: Esta opcin est activa por defecto, haciendo aparecer en el cuadro de dilogo
los apartados de efectos, en los cuales es posible elegir el color de letra y si est aparecer
subrayada o tachada.
fdForceFontExist: Al activar esta opcin no se permitir la entrada directa de un nombre de
tipo de letra que no exista.
fdNoFaceSel: Al mostrar el cuadrado de dilogo normalmente aparece seleccionado uno de
los tipos de letra disponibles, cuyos nombres se muestran en la parte superior de la lista.
Activando esta opcin conseguiremos que ese campo de edicin aparezca vacio.

fdNoSizeSel: Esta opcin es similar a la anterior aplicndola al tamao, de tal forma que al
activarla no aparecer preseleccionado un tamao.
fdNoStyleSel: Similar a las dos anteriores, no mostrando un estilo seleccionado por defecto.
fdLimitSize: El tamao de letra a elegir por el usuario puede ser limitado, activando esta
opcin y facilitando en las propiedades MinFontSize y MaxFontSize el tamao mnimo y
mximo permitidos.
fdShowHelp: Fuerza la aparicin en el cuadro de dilogo de un botn de ayuda.

Una vez hayamos establecido todas las propiedades del cuadro de dilogo, bien en tiempo de
diseo o en tiempo de ejecucin, no tendremos mas que usar el mtodo Execute para mostrarlo.

ColorDialog
Este cuadro de dilogo lo tendremos a nuestra disposicin gracias al componente ColorDialog, que
en la Paleta de componentes aparece como

Color seleccionado
La propiedad Color de este componente nos servir para obtener el color que el usuario haya
seleccionado en el cuadro de dilogo, pudiendo tambin usarla, antes de mostrar la ventana, para
fijar un color por defecto. Adems, podemos facilitar una serie de colores definidos a medida,
aparte de los colores del sistema Windows. Para ello tendremos que utilizar la propiedad
CustomColors, que es un objeto de tipo TString. A ella aadiremos una cadena por cada color que
deseemos definir, conteniendo la palabra Color seguida de una letra, de la A a la P, un signo igual
y una secuencia en hexadecimal, especificando los componentes BGR del color. Por ejemplo,
podemos escribir algo as dentro del editor de lneas de la propiedad:
ColorA=FCDDDA
ColorB=BC875C
ColorC=E7BEAF
Opciones
Al igual que los anteriores componentes, ste tambin cuenta con una propiedad Options, que es
un conjunto, en principio vaco, y puede contener una o ms opciones de las siguientes:

cdPreventFullOpen: Cuando el cuadro de dilogo se muestra inicialmente, cuenta con un


botn llamado Definir colores personalizados, que abre una extensin del cuadro, a la
derecha, donde es posible seleccionar un color a partir de sus componentes RGB. Activando
esta opcin provocaremos que dicha extensin no sea accesible para el usuario.
cdFullOpen: En principio la parte derecha, citada antes, no aparece abierta, a no ser que
utilicemos esta opcin, lo cual causar que el cuadro de dilogo se muestra ya inicialmente
completamente abierto.
cdShowHelp: Fuerza la aparicin en la ventana de un botn de ayuda.

Impresin
Para dar las opciones comunes de imprimir algo podemos usar el cuadro que encontraremos en la
Paleta de componentes bajo el icono
. El comportamiento de ste est controlado en parte por
la propiedad Options, que en este caso puede tomar los valores:
poPageNums: Permite que el usuario seleccione una pgina de inicio y otra de fin de
impresin. Podemos poner lmites a los nmeros de pgina posibles mediante las
propiedades MinPage y MaxPage.
poSelection: Permite que el usuario elija imprimir la seleccin actual en el documento.
poWarning: En caso de que no haya una impresora instalada, al especificar esta opcin el
cuadro de dilogo avisar al usuario de esta circunstancia.
poPrintToFile: Visualiza una opcin por la cual el usuario puede elegir imprimir en un
archivo, en lugar de en la impresora.

poHelp: Hace aparecer un botn de ayuda en el cuadro de dilogo.

Informacin a imprimir
El usuario puede elegir, si nosotros lo permitimos, entre imprimir la seleccin actual, un
determinado nmero de pginas o bien todo el documento. Mediante la propiedad PrintRange
podremos conocer cul ha sido la opcin elegida. En la tabla siguiente se muestran los posibles
valores:
Constante
prSelection

Informacin a imprimir
La seleccin actual

prPageNums Las pginas especificadas


prAllPages

Todo el documento

Si una de las opciones del cuadro es poPageNums, en las propiedades FromPage y ToPage
encontraremos la pgina de inicio y fin, respectivamente.
Por defecto, el nmero de copias a imprimir es uno, aunque nosotros podemos modificar este valor
por defecto estableciendo el nuevo nmero en la propiedad Copies. En caso de que el usuario
indique un nmero distinto de copias en el cuadro, esta misma propiedad nos servir para conocer
dicho nmero. El orden en que habrn de imprimirse las copias vendr determinado por el valor de
la propiedad Collate, que puede ser True o False, dependiendo de lo cual las copias sern
consecutivas, de cada pgina, o bien se imprimir una copia completa cada vez.
Por ltimo nos encontramos con la propiedad PrintToFile, que tomar el valor True en caso de que
el usuario haya elegido realizar la impresin en un archivo, en lugar de en la impresora.
Debe quedar claro que este componente simplemente nos facilita la edicin de las opciones que
queremos dar al imprimir, y que nos va a devolver los valores adecuados para saber cmo hemos
de imprimir, pero la tarea especfica de imprimir el documento/imagen/etc la debemos realizar
nosotros, no se imprime automticamente por el mero hecho de usar este cuadro, slo es una
ayuda.
Configuracin de la impresora
Aunque el cuadro de dilogo que contiene las opciones de impresin cuenta con un botn que
permite el acceso a las propiedades de la impresora, nuestro programa tambin puede contar con
una opcin que d acceso directamente a la ventana de configuracin de impresin. Para ello existe
el componente que es una impresora con una herramienta encima, y que recibe el nombre de
PrintSetupDialog, siendo este el icono que encontraremos en la Paleta de componentes
.
Este componente no cuenta con ninguna propiedad especfica, por lo que para utilizarlo tan slo
habremos de llamar al mtodo Execute.

7III. Los cuadros FindDialog y ReplaceDialog


Para ayudarnos con las opciones que dar cuando queremos que el usuario pueda realizar una
bsqueda en un texto, o una sustitucin, tenemos dos cuadros de dilogo, el cuadro FindDialog,
que es el que nos sirve para las opciones de bsqueda, y el cuadro ReplaceDialog, que es el que
tambin nos da las opciones de bsqueda y sustitucin.

El cuadro FindDialog

Podemos encontrarlo en la paleta de componentes bajo el icono


opciones.
Opciones de bsqueda

, y cuenta con las siguientes

La propiedad Options de este componente nos permitir configurar las opciones que estarn
disponibles en el cuadro de dilogo, antes de mostrarlo, as como conocer cules ha seleccionado el
usuario, despus de haberlo mostrado. Se trata de un conjunto que puede tomar los siguientes
valores:

frHideMatchCase: Oculta la opcin Match Case, cuya finalidad es indicar que la bsqueda
se ha de realizar respetando el orden de maysculas y minsculas.
frDisableMatchCase: Desactiva la misma opcin anterior, de tal forma que aunque es visible
el usuario no puede seleccionarla.
frMatchCase: Indica que la opcin Match Case ha sido activada por el usuario.
frHideWholeWord: Oculta la opcin Match Whole Word Only, cuya finalidad es indicar
que la bsqueda se ha de realizar sobre palabras completas.
frDisableWholeWord: Desactiva la opcin anterior, dejndola visible pero inaccesible para el
usuario.
frWholeWord: Indica que el usuario ha seleccionado la opcin Match Whole Word Only
en el cuadro de dilogo.
frHideUpDown: Oculta la opcin Direction, cuya finalidad es facilitar la indicacin de la
direccin de bsqueda.
frDisableUpDown: Desactiva la opcin anterior, no permitiendo que el usuario la seleccione.
frDown: Cuando est activa inidica que el usuario ha seleccionado el botn Down,
mientras que si no lo est el botn elegido ser Up.
frFindNext: Indica que se ha pulsado el botn Find Next del cuadro de dilogo.
frShowHelp: Fuerza la aparicin de un botn de ayuda en la ventana.

Cada vez que el usuario pulse el botn Find Next, el componente generar un evento OnFind, en
cuyo manejador podemos aadir el cdigo necesario para obtener el texto a buscar, de la
propiedad FindText, y poner en marcha el proceso segn las opciones seleccionadas. El cuadro de
dilogo no se oculta, de tal forma que el usuario puede volver a pulsar el botn Find Next para
repetir la bsqueda, o bien modificar el texto y las opciones a buscar. Si lo deseamos podemos
cerrar el cuadro de dilogo desde nuestro programa, utilizando el mtodo CloseDialog, si no lo
hacemos ser el usuario el responsable de cerrarlo, para lo cual tendr que pulsar el botn Cancel.
Mientras est en marcha el proceso de bsqueda, en caso de que el cuadro de dilogo pueda
interferir con la visualizacin de nuestro programa, podemos utilizar la propiedad Position para
desplazarlo a otro punto. Esta propiedad toma como parmetro un TPoint, que es un registro
conteniendo dos miembros, X e Y, correspondientes a la coordenada horizontal y vertical,
respectivamente, del punto en el que deseamos posicionar la ventana.
Sustituciones
La apariencia y funcionamiento del cuadro de dilogo para bsqueda y sustitucin es similar al
anterior. El componente est representado en la Paleta de componentes como el icono

En este existe un campo adicional, en el que se introduce el texto que sustituir al texto buscado, y
otros dos botones, cuya finalidad es sustituir una vez o todas las veces que el texto aparezca.
Al igual que ocurre con el cuadro de dilogo de bsqueda, cada vez que el usuario pulsa el botn
Find Next se genera un evento OnFind. De forma similar, al pulsar el botn Replace o Replace
All se producir un evento OnReplace. Para saber cul de los dos botones ha sido pulsado nos
servir la propiedad Options, ya que dependiendo de ello en esta propiedad encontraremos activa
la constante frReplace o frReplaceAll.
Tenemos en la ayuda de Delphi sobre estos componentes un ejemplo sobre cmo realizar la
bsqueda de la palabra que nos hayan introducido. Hay que recordar que estos componentes no
nos buscan la palabra, simplemente nos facilitan mostrar las opciones que hay que dar al usuario y
la recogida de datos correspondiente.

También podría gustarte