You are on page 1of 26

Programacin visual

Capitulo 1 : Introduccin y entorno de trabajo.


Comenzaremos a programar en forma visual, para ello utilizaremos un compilador, el
Borland C++ Builder. Este compilador respeta las mismas teclas rpidas que los compiladores que
venamos usando tanto en Pascal como en C++ (dado que todos son del mismo fabricante,
Borland. Este compilador genera aplicaciones para entornos visuales (en esta versi!n "indo#s $%
o superior, otras versiones del mismo compilador nos permitirn compilar nuestro programa para
entornos grficos de &inu' sin tocar una sola lnea de c!digo.
Para comenzar debemos saber como pensar los programas de aqu en mas. Comenzaremos a
utilizar la Programaci!n (rientada a (b)etos (P.(.(.. Pensemos en una ventana clsica de
"indo#s. *entro de la venta tendremos botones, cuadros de edici!n, etiquetas, barras de
desplazamiento, un men+ principal, etc. Cada una de
estas ,cosas, son ob)etos (incluso la ventana misma es un ob)eto. El concepto de ob)eto lo iremos
aclarando en el transcurso del a-o, pero por a.ora ser suficiente con el concepto intuitivo que
tienes de lo que es un ob)eto. Cualquier ,cosa, que /o quiera agregar en mi programa es un ob)eto.
0a/ tres aspectos importantes que nos interesaran sobre los ob)etos1
Propiedades
Eventos
23todos
1) Propiedades: Como su nombre lo indica, son las caractersticas de los ob)etos (4ama-o,
posici!n etc.. 5i el ob)eto fuese una estructura, las propiedades serian los campos de la estructura.
*e .ec.o, utilizaremos las propiedades como campos de una estructura, /a que veremos que tienen
tipos (6nt, C.ar, 5tring, etc.
2) Eventos: 7n evento es un mensa)e que el ob)eto enva al programa de que ,algo, a sucedido. 5i
.acemos clic8 sobre un ob)eto, eso es un evento, si cambiamos el tama-o de un ob)eto (por e)emplo
la ventana es un evento si modificamos el te'to de un cuadro de edici!n .a/ un evento, si tocamos
una tecla, .a/ un evento.
*e a.ora en adelante, en lugar de pensar el programa como un solo bloque, lo pensaremos
como peque-os bloques de programa que se e)ecutaran cuando suceda un determinado evento. Por
e)emplo, si quiero que al tocar un bot!n aparezca un mensa)e, en el evento (nClic8 del bot!n
escribo una lnea de c!digo que diga1
5.o#2essage(,0ola, que tal,9 (Evidentemente 5.o#2essage muestra un mensa)e, pero esto lo
veremos en despu3s con ma/or detalle.
3) Mtodos: &os (b)etos son de una determinada clase. Podramos decir que una clase (class es
una estructura me)orada.
2as e'actamente, es una estructura que adems de tener campos, tiene funciones relacionadas a
ella. Estas funciones se llaman 23todos.
: veces es com+n confundir las propiedades con los m3todos, sin embargo son cosas
totalmente diferentes. 7na propiedad es una cualidad que esta e'presada con alg+n tipo de dato
(enteros, caracteres, etc.. 7n m3todo en cambio es una acci!n que puede realizar el ob)eto. Por
e)emplo la ventana tiene el m3todo Close( que obviamente cierra la ventana.
Entonces1
&as propiedades son datos a los cuales podemos acceder en tiempo de e)ecuci!n / (algunas en
tiempo de edici!n. Por e)emplo el anc.o de una ventana lo definimos cuando estamos editando
nuestra aplicaci!n, pero lo podemos cambiar en tiempo de e)ecuci!n.
&os eventos son sucesos. ;osotros programaremos los bloques de programaci!n (tambi3n llamados
cpsulas dentro de los eventos que nos interesen.
&os m3todos son acciones que nosotros invocamos en tiempo de e)ecuci!n.
*ebemos tomar algunos recaudos antes de comenzar a programar. Pensemos en un programa de
"indo#s, muc.as veces los programas tiene mas de una ventana (ventanas de configuraci!n,
cuadros de dialogo, etc. : cada <entana le corresponderan dos arc.ivos (un =.CPP / un =.0 a su
vez, e'iste un arc.ivo que re+ne a todas las ventanas en un mismo pro/ecto (en nuestra versi!n es
>
un arc.ivo =.2:?, en versiones posteriores, =.BP@. :dems de estos arc.ivos, el compilador
creara nuevos arc.ivos de recursos, arc.ivos temporales, etc.
Importante:
Nuestro programa (de ahora en adelante ser un proyeto) esta !ormados por muhos
arhivos" Es por eso #ue antes de esri$ir un sola l%nea de &digo' lo #ue haremos ser
guardar el proyeto en una arpeta nueva a la #ue le pondremos un nom$re onveniente'
rein entones omen(aremos a esri$ir nuestro programa (aordate' siempre gra$aremos y
a$riremos proyetos)" )uando #ueramos salvar nuestro tra$a*o utili(aremos la opi&n save
all #ue guardar todos los arhivos de nuestro proyeto" +i tomamos esta medida de
seguridad nos ahorraremos pro$lemas"
)a$e alarar #ue el ompilador genera algunos arhivo temporales #ue agili(an el proeso de
ompilai&n pero #ue son grandes (varios mega) por lo #ue es muy inomodo de trasladarlos
en dis#uetes" Estos arhivos no son neesarios' y podemos $orrarlos pues el ompilador los
generara automtiamente en la pr&,ima ompilai&n' los arhivos #ue de$emos guardar (y
los #ue de$emos a opiar a un dis#uete en aso de #uerer trasladar un proyeto de un lado a
otro) son:
=.2:? =.CPP =.@E5 =.0 =.0PP =.@C =.*EA =.*A2
Caractersticas del compilador:
:l abrir el compilador nos encontramos (en principio con tres ventanas1
Estas ventanas son1
B
-arra de herramientas
Es#uema de la ventana Inspetor de o$*etos
Barra de Herramientas:
:qu encontramos las opciones del compilador, ((pciones de arc.ivos, de edici!n, configuraci!n,
etc.,
as como tambi3n lo controles de compilaci!n (e)ecutar, compilar, detener etc., / lo mas novedoso
para nosotros, la barra de componentes.
&a barra de componentes es una pagina de pesta-as en donde estn clasificados los distintos
componentes (ob)etos que podremos colocar en nuestra aplicaci!n. Por e)emplo, si queremos
poner un bot!n, seleccionamos de la pesta-a 5tandar el ob)eto con forma de bot!n (que dice (8 /
lo arrastramos a la <entana Esquema en el lugar de la ventana que deseamos colocarlo (como si se
tratase del PaintBrus..
El esuema de la ventana:
Es el aspecto (apro'imado que tendr la ventana de nuestro pro/ecto al comenzar su e)ecuci!n (si
nuestro pro/ecto tuviese mas de una ventana .abr ms de un esquema, por supuesto podremos
cerrar las ventanas que no estemos modificando.
Este aspecto podra cambiar en tiempo de e)ecuci!n por e)emplo por redimensionamientos de la
ventana. &os puntos que vemos dibu)ados tienen la funci!n de grilla (o imn para facilitar la
colocaci!n de los ob)etos, esta grilla puede desactivarse, o modificarse, pero en general nos a/uda
muc.simo. *e todo modos esos puntos no se vern en la aplicaci!n terminada.
Es en esta ventana donde colocaremos los ob)etos desde la barra de componentes.
5i ocultramos accidentalmente esta ventana, reaparecer al pulsar A>C .
El Inspector de !bjetos:
Es una ventana con dos pesta-as, Properties (Propiedades / Events (eventos. En estas pesta-as
figuran las propiedades / los eventos de los ob)etos que tenemos en nuestra aplicaci!n.
Es importante que sepas que los valores que le asignamos a las propiedades los podremos modificar
luego en tiempo de e)ecuci!n.
5i ocultramos accidentalmente esta ventana, reaparecer al pulsar A>>.
En un principio puede resultarte incomodo el .ec.o de que estas ventanas est3n ,flotando, en el
escritorio, /a que estamos acostumbrados a programas que tienen una ventana madre / que
contiene todas las ventanas de la aplicaci!n ("ord, E'cel, etc. 5in embargo no tardaras en
acostumbrarte a este entorno de traba)o.
:ntes de terminar con este capitulo debemos tener en cuenta algo1 Cuando programbamos en
Pascal o en C, estbamos dentro de una aplicaci!n (el compilador. :l probar nuestro programa el
compilador quedaba en segundo plano mientras nuestro programa se e)ecutaba, / al terminar
volvamos automticamente al compilador. :.ora en cambio nos encontramos en un entorno
"indo#s, que es multitarea, es decir, puede e)ecutar varias aplicaciones al mismo tiempo (si
tenemos suerte, entonces cuando estemos probando nuestro programa el compilador estar
accesible en todo momento, adems nuestro programa no terminar a menos que nosotros lo
cerremos e'plcitamente (como todo los programas de "indo#s.
*ebemos tener cuidado de cerrar el programa en e)ecuci!n / no el compilador. Este es un error es
mu/ com+n, /a que la ventana esquema del compilador es mu/ parecida a la aplicaci!n en uso, de
.ec.o, solo se diferencia por los puntos de la grilla. 5i nosotros no cerramos la aplicaci!n en
prueba, podremos pasar el control al compilador / seguir programando tranquilamente, pero no nos
permitir recompilar el pro/ecto .asta que la aplicaci!n no este cerrada.
D
Capitulo ":#entana Principal$ Botones$ Cuadros de Edicin.
Creacin de un nuevo proyecto:
Estamos en condiciones de crear nuestra primera aplicaci!n, para ello, lo primero que
.aremos es guardar el proyeto como se e'plico en el capitulo >.
5i en estas condiciones, / sin tocar absolutamente compilamos (presionamos A$ o .acemos
clic8 en el bot!n de Pla/ el programa realizara las tareas necesarias / luego aparecer nuestra
aplicaci!n, que no es otra cosa que una ventana completamente vaca. 5in embargo podremos ver
que esta ventana es funcional, es decir, podemos moverla, ma'imizarla, minimizarla, / por
supuesto cerrarla. Esto significa que los ob)etos que nosotros colocamos en la aplicaci!n no
necesitamos ,programarlos, solo necesitamos indicar que deseamos .acer con ellos.
Podemos a.ora realizar nuestro primer programa, el clsico mensa)e de bienvenida.
E)emplo1 @ealizaremos un programa que muestre una ventana con un bot!n, al presionar el
bot!n aparecer un mensa)e que diga1 EAelicitaciones, .a realizado su primer programaF
Para ello colocaremos en la ventana esquema un bot!n, este ob)eto se encuentra en la barra
de componentes en la pesta-a 5tandar (El ob)eto con forma de bot!n que dice (8. :.ora iremos al
6nspector de (b)etos, donde figuran las propiedades del bot!n que acabamos de crear.
:tenci!n, en el inspector de ob)etos figuran dos posibles ob)etos, la ventana (Aorm> / el
bot!n (Button>. ;o olvidemos, la ventana es tambi3n un ob)eto. 5eleccionamos el ob)eto Button>
(nuestro bot!n / .acemos clic8 sobre la pesta-a Events.
:qu vemos una lista de los posibles eventos que puede considerar nuestro ob)eto, en
nuestro caso, el evento que nos interesa es (nClic8, as que .acemos doble clic8 sobre este evento.
:l .acer esto se abre una ventana con te'to, el cursor esta ubicado entre dos llaves, que
encierran la funci!n (o cpsula que debe e)ecutarse cuando suceda el evento clic8 del bot!n. 2s
arriba estn las llamadas a libreras graficas / otras declaraciones que nosotros no de$emos toar"
Esta ventana de te'to es el c!digo de nuestro programa, si pensabas que en la programaci!n
visual no .aba que escribir c!digo te equivocabas. En esta ventana de te'to escribiremos el c!digo
que se guardar como un arc.ivo de te'to =.CPP. Pero volvamos al cursor que est entre llaves.
*entro de estas llaves nosotros escribiremos el c!digo que queramos, c!digo que, en general /a
conoces 1 (for, #.ile, doG#.ile, if, s#itc., etc. con la salvedad de que algunas
funciones que utilizbamos en la programaci!n en modo te'to /a no tienen sentido (como por
e)emplo printf, scanf, goto'/, etc., debemos entonces aprender otras funciones pero esto no va
presentarte ma/ores problemas.
;osotros queremos que al presionar el bot!n aparezca un mensa)e. No necesitamos escribir
algo como1 if (boton H H pulsado I......................J
Esto no es necesario /a que lo que escribamos aqu se e)ecutar cuando suceda el evento clic8 del
bot!n, as que solamente escribiremos lo que deseamos .acer cuando el bot!n se pulse. *eseamos
que aparezca un mensa)e, una funci!n para mostrar mensa)es es 5.o#2essage. &uego veremos que
e'isten otras ms comple)as que nos brindan ma/ores opciones, 5.o#2essage es la ms simple de
todas, lo que .ace es mostrar un mensa)e en un cuadro de dialogo (sin ning+n icono / un bot!n de
(8 que cierra el cuadro de dialogo.
Escribiremos entonces entre las llaves1
5.o#2essage(,Aelicitaciones, .a realizado su primer programa,9
*e esta manera el programa completo debera .aber quedado1
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource ".d!m"
"#orm1 #orm1$
//---------------------------------------------------------------------------
__!astcall "#orm1%%"#orm1("&omponent '(ner)
% "#orm('(ner)
)
*
//---------------------------------------------------------------------------
void __!astcall "#orm1%%+utton1&lick("',-ect .ender)
)
.ho(/essage("#elicitaciones0 ha reali1ado su primer programa")$
*
K
@ecuerda, la primer parte del c!digo, est generada por el compilador / no ser necesario
(ni recomendable cambiarla. 5olo nos interesa lo que ponemos dentro de las cpsulas de los
eventos, en nuestro caso1 5.o#2essage(,Aelicitaciones, .a realizado su primer programa,9
Compila el programa / pru3balo.
:nalicemos a.ora la primer funci!n que .as aprendido, la funci!n 5.o#2essage,
seguramente intuirs que esta funci!n, pide como parmetro de entrada un string, / no devuelve
nada. En realidad no pide un string, sino un nuevo tipo de dato llamado :nsi5tring, que por el
momento te dir3 que es un string me)orado, luego aprenderemos ms sobre los :nsi5tring.
&o que est escrito entre las llaves del evento (nClic8 es algo parecido a una funciones, es
importante que sepas que las variables que declares en este punto se crearan al se-alarse el evento /
se destru/en al llegar a la llave de cierre. 5on variables locales de esta cpsula.
Con este programa sencillo podremos analizar algunas caractersticas de los ob)etos.
*entro de la programaci!n orientada a ob)etos, uno de los conceptos principales es el
concepto de .erencia. Pongamos un e)emplo de la vida real. 5upongamos que definimos el
con)unto ve.culos terrestres. &os ve.culos tendrn la propiedad Cantidad de @uedas, que ser de
tipo entero (B ruedas, K ruedas, etc. . &uego podramos decir que dentro de los ve.culos terrestres
definimos el con)unto de motos / de autom!viles. El con)unto de autom!viles tendr la propiedad
Cantidad de Puertas (B, K, %. Es evidente que el con)unto de motos no tendr esa propiedad, pero
sin embargo, entre las motos / los autos .abr muc.as propiedades en com+n (potencia del motor,
velocidad m'ima, etc.
En programaci!n sucede lo mismo, lo cual significa que los ob)etos tendrn muc.as
propiedades en com+n (por suerte con lo cual aprenderemos para que sirven algunas propiedades
gen3ricas / luego veremos algunas propiedades que son +nicas de un determinado ob)eto. Por
e)emplo, todos los ob)etos visuales derivan de una clase gen3rica llamada 4rect (@ectngulo. Esto
significa que todos los ob)etos visuales tendrn la propiedad 4op (distancia a la parte superior de la
ventana medida en pi'eles &eft (distancia a la parte izquierda de la ventana medida en pi'eles
0eig.t (altura del ob)eto medida en pi'eles / "idt. (anc.o del ob)eto medido en pi'eles.
<eamos en el inspector de ob)etos algunas propiedades comunes a los ob)etos visuales,
puedes analizar entonces tanto las de la ventana (Aorm> como las del bot!n (Button>. &as
propiedades aparecen en el inspector de ob)etos en orden alfab3tico1
Propiedades de los objetos visuales:
)aption: Es una propiedad de tipo :nsi5tring, es el ttulo del ob)eto, en el caso de la ventana, el
titulo que aparece arriba, en el caso del bot!n, el te'to que aparece dentro del mismo. El Caption de
un ob)eto es informativo para el usuario, debe ser claro, puede contener n+meros, espacios,
smbolos, etc. Caption inclusive podra estar vaca. 2uc.os ob)etos pueden tener el mismo Caption
(en una aplicaci!n .a/ muc.os botones que dicen :ceptar. 5i deseamos que un ob)eto (por
e)emplo un bot!n tenga una tecla rpida, antepondremos un L a esa letra, por e)emplo si tenemos
un bot!n que dice :ceptar / otro que dice :rc.ivo, / los Caption de ellos son respectivamente
L:ceptar, / :Lrc.ivo entonces veremos 5ubra/ada la letra : en :ceptar / la letra r en :rc.ivo.
Pulsar la E:F equivaldr a pulsar :ceptar, pulsar la ErF equivaldr a pulsar :rc.ivo.

)ursor: Propiedad de tipo Enum Es la forma que toma el puntero del mouse al pasar por encima
del ob)eto.
Ena$led: Propiedad de tipo booleana, puede valer true o false. 6ndica si el ob)eto esta .abilitado o
no. 7n ob)eto des.abilitado aparece con su te'to en relieve, / no es posible clic8ear sobre el.
.ont: Es una propiedad de tipo 4font (una clase que guarda la fuente, el tama-o, / el estilo. 6ndica
que fuente debe utilizarse en el Caption / en el te'to (si el ob)eto lo tuviese.
/eight: Propiedad de tipo int. :ltura del ob)eto medida en pi'eles.
/int: Propiedad :nsi5tring, es el mensa)e aclaratorio que deseamos que aparezca si el mouse se
detiene sobre el ob)eto.
0e!t: Propiedad de tipo int. *istancia del ob)eto medida en pi'eles al borde izquierdo de la ventana
madre.
Name: Esta propiedad es mu/ importante, es el nombre interno del ob)eto, es decir, el nombre con
el cual el programador (es decir nosotros identificaremos al ob)eto, no tiene nada que ver con el
Caption. Cuando programbamos en modo te'to las variables tenan un nombre (:, B, C, C(;4,
P@(2, etc. sin embargo este nombre no tena ninguna importancia para el usuario. Este es el
mismo caso, ;ame es el nombre del ob)eto. *os ob)etos no pueden tener el mismo nombre. &os
nombres pueden contener, letras, n+meros / el smbolo gui!n ba)o EMF pero el nombre de un ob)eto
no puede comenzar con un n+mero, es decir, un ob)eto puede llamarse Boton>, pero no puede
%
llamarse >Boton. 4ambi3n sera un nombre vlido BotonM:ceptar. &os nombres no pueden
contener espacios en blanco u otros smbolos que no sean el gui!n ba)o.
Cuando el compilador crea un ob)eto, por defecto le pone el nombre del tipo de ob)eto
seguido de un n+mero, por e)emplo si creamos D botones se llamarn, Button>, ButtonB, ButtonD.
Es mu/ recomendable ponerles un nombre mas especfico que nos de una idea que .ace el ob)eto.
5in embargo es importante que, si pensamos cambiarle el nombre al ob)eto lo .agamos ni bien lo
creamos, /a que si lo cambiamos luego, el programa no actualizar las referencias. Por e)emplo, si
nosotros en el programa del e)emplo cambiamos el nombre de Button> por el de BM:ceptar, el
compilador nos dar error, /a que el evento .ace referencia a1
..void __fastcall TForm1::Button1Click(TObject *Sender).
Es decir que si cambiamos el nombre de un ob)eto, deberemos cambiar las referencias a eventos
que tienen el nombre anterior. En resumen, cambiemos el nombre del ob)eto ni bien lo creamos o
no lo cambiemos ms.
1op: Propiedad de tipo int. *istancia del ob)eto a la parte superior de a ventana madre.
2isi$le: Propiedad de tipo booleana, puede valer true o false. 6ndica si el ob)eto es visible en
pantalla o no.
3idth: Propiedad de tipo int. :nc.o del ob)eto medido en pi'eles.
Cuando analicemos nuevos ob)etos nos centraremos +nicamente en las propiedades, m3todos /
eventos que revistan ma/or inter3s en ellos. Pero en la ma/ora de los casos tendrn propiedades
comunes a todos ellos (los citados arriba corresponden a los ob)etos visuales.
!bjeto %orm
Es una ventana, nuestro programa deber tener al menos una ventana.
Propiedades: Por el momento las ventanas no tienen propiedades e'clusivas que nos
interesen (por a.ora
Eventos: Podemos tratar diversos eventos en ella ((nClic8 por e)emplo los nombres de sus
eventos .acen evidentes su llamada.
Mtodos: Por el momento el +nico m3todo que nos podra interesar es el m3todo Close(
que obviamente cierra la ventana (si es la ventana principal cierra la aplicaci!n
!bjeto Button:
Es el bot!n simple de mandato1 5us propiedades / sus m3todos no presentan ma/or
importancia, as como sus eventos (5alvo (nClic8. 5e usa generalmente para realizar una acci!n
cuando sucede el evento (nClic8.
4)&mo aedemos a las propiedades de un o$*eto en tipo de e*eui&n5
Para acceder a la propiedad de un (b)eto debemos primero .acer referencia al ob)eto (por su
nombre / luego la propiedad, separada del ob)eto por una flec.a, que se escribe con un signo
menos EGE / un signo ma/or ENF. Entonces, si quisi3semos cambiar el anc.o de Button> para que
valga >%C, debemos escribir1
+utton->2idth 3 145$
5i quisi3semos incrementar en BC el alto de Aorm> deberamos escribir1
#orm1->6eight 3 #orm1->6eight 7 85$
:tenci!n con las ma/+sculas / las min+sculas, recuerda que Builder es sensible a ellas.
O
Pa estas en condiciones de realizar algunos e)ercicios sencillos.
E*eriio 1: @ealiza una aplicaci!n con dos botones. :l pulsar el primero mostrar un mensa)e de
bienvenida. :l pulsar sobre el segundo, borra el ttulo de la ventana.
E*eriio 21 @ealiza una aplicaci!n con cuatro botones, uno para aumentar el anc.o de la ventana,
otro para aumentar su altura, otro para disminuir su altura / el ultimo para disminuir su anc.o.
E*eriio 3: @ealiza una aplicaci!n con dos botones. :l pulsar sobre uno de ellos se .abilita o
des.abilita el otro bot!n, al pulsar sobre el otro, borrar los ttulos de los dos botones.
E*eriio 6: @ealiza una aplicaci!n con un bot!n. :l pulsarlo ocultarlo de la ventana (propiedad
<isible para volver a verlo pulsar sobre la ventana.
!bjeto Edit:
<eamos un nuevo ob)eto, el cuadro de edici!n simple. Es el ob)eto que se encuentra en la pesta-a
5tandar / que tiene forma de cuadro con las letras ab dentro de el. &os cuadros de edici!n se
utilizan generalmente para ingresar una lnea de te'to dentro de ellos (6ngresar nombres por
e)emplo.
Propiedades: &as propiedades importantes del ob)eto Edit son1
1e,t1 Propiedad de tipo :nsi5tring, es el contenido del cuadro de edici!n, aqu queda guardado el
te'to que figura en el. Por defecto esta propiedad contiene el nombre del cuadro de edici!n (si es el
primero Edit> en general es preferible que esta propiedad arranque vaca.
Ma,0ength: Propiedad de tipo entero. 6ndica la cantidad m'ima de caracteres que se puede
ingresar en el.
Pas7ord)har: Propiedad de tipo c.ar. 5i deseamos que al ingresar un te'to no se vea (por e)emplo
para ingresar una clave / que en su lugar aparezca un carcter determinado (por e)emplo =
colocamos en esta propiedad el carcter que deseamos. Por defecto esta propiedad contiene el
carcter nulo, lo que significa que el te'to se visualiza normalmente.
8ead9nly: Propiedad de tipo booleana, puede valer verdadero o falso. 6ndica si el cuadro es o no
de solo lectura, en caso de serlo no se podr modificar su te'to desde la interfase visual.
Eventos: 7no de los eventos ms utilizados en los Edit es el evento (nC.ange, que informa
cuando el te'to del Edit cambie (es decir, cuando se pulsa cualquier tecla que modifique su
contenido, recuerda que el te'to cambia en forma inmediata, es decir, no es necesario presionar
E;4E@ para que el evento act+e.
:ntes de realizar e)ercicios utilizando cuadros edici!n deberemos aclarar que son los famosos
:nsi5tring.
&os :nsi5tring son una clase, es decir, una estructura me)orada, me)orada porque tiene 23todos
propios.
Entre otras cosas, los :nsi5tring toman el tama-o necesario para contener el te'to (son
verdaderamente mas c!modos que los 5tring tambi3n tienen m3todos para convertir los :nsi5tring
en los tipos /a conocidos (int, float, string. :dems de m3todos para insertar, borrar, encontrar
cadenas dentro de ellos etc.
;osotros veremos solo algunas cualidades de la clase :nsi5tring. Es importante que
comprendas que :nsi5tring es una clase, esto es un tipo de dato. ;osotros podremos entonces
declarar variables de este tipo, lo .aremos de la forma .abitual, primero el tipo / luego la o las
variables. E)emplo1
9nsi.tring cadena10 cadena8$
*eclaramos dos variables de tipo :nsi5tring, cadena> / cadenaB.
Bien, todo lo que a continuaci!n veamos sobre :nsi5tring es aplicable a cualquier dato de
este tipo. Por e)emplo la propiedad Caption es :nsi5tring, por lo que es factible aplicarle cualquier
m3todo que describamos a continuaci!n.
Q
&os :nsi5tring pueden ser igualados a cualquier tipo, la conversi!n es automtica.
E)emplo1
9nsi.tring cadena$
int -315$
char k:1;<3"hola =ue tal"$
cadena3-$
.ho(/essage(cadena)$
cadena3k$
.ho(/essage(cadena)$
Esto mostrar dos cuadros de dialogo sucesivos, el primero mostrar un numero >C (lo
mostrar como te'to, es decir, el carcter > / el carcter C luego, el segundo mostrar un mensa)e
que dir E.ola que talF. Como vers, a una variable :nsi5tring se le puede asignar una variable o
una variable c.ar sin problema, tambi3n se le pueden asignar variable float, pero en este caso .abr
que especificar el formato (cantidad de cifras, separador decimal, etc.
:dems se pueden efectuar operaciones de suma ente varios tipos, interpretndolo siempre
como una concatenaci!n de te'tos.
E)emplo1
9nsi.tring cadena$
int -314$
char k:>8<3" a?os de servicio en la empresa"$
cadena3"@l se?or Auan tiene"$
cadena3cadena 7 - 7 k$
.ho(/essage(cadena)$
Esto muestra un mensa)e que dice EEl se-or Ruan tiene >% a-os de servicio en la empresaF
Como vemos a cadena se le asigna la suma de un :nsi5tring, un int / un string. &a suma,
fue interpretada como una concatenaci!n de te'to.
Importante: Por el modo en que se realiza la conversaci!n es imprescindible que el primer
sumando sea de tipo :nsi5tring.
&os :nsi5tring pueden ser comparados unos con otros utilizndose en este caso el orden
alfab3tico (como la .acamos con los string de Pascal
:.ora veremos algunos m3todos de la clase :nsi5tring. &os m3todos se separan de la clase
por un punto.
0o7er)ase1 ;o tiene parmetros de entrada, devuelve un :nsi5tring, que es el :nsi5tring
propietario convertido a min+scula.
E)1 #orm1->&aption3 #orm1->&aption.Bo(er&ase()$
:pper)ase1 Sdem &o#erCase pero convierte a ma/+scula.
0ength: ;o tiene parmetros de entrada, devuelve un entero, el tama-o del :nsi5tring.
E)1 int )9
-3@dit1->"eCt.Bength()$
) tomar el valor correspondiente a la cantidad de caracteres que tenga Edit>GN4e't.
1oInt;e!1 Pide un entero, / devuelve un entero. 4o6nt*ef convierte un :nsi5tring en
entero, (es el valor que devuelve, en caso que el :nsi5tring no contenga un entero, entonces
devuelve el valor pasado como parmetro.
E)1 int -$
-3@dit1->"eCt."oDntEe!(->)$
5i @dit1->"eCt no contiene un entero (es decir, cualquier cosa que no sea un n+mero entonces
) tomar el valor TD.
E*eriio <: @ealiza una aplicaci!n con un bot!n / un Edit, al pulsar el bot!n, mostrar con
5.o#2essage el contenido del Edit.
U

E*eriio =1 @ealiza una aplicaci!n con un bot!n, al pulsarlo mostrar un mensa)e que indique
cuanta veces se puls! el bot!n (necesitars una variable global de tipo int.
E*eriio >: @ealiza una aplicaci!n con dos edit / un bot!n. 7n Edit para ingresar nombre / el otro
para ingresar edad. :l pulsar el bot!n, mostrar un mensa)e que diga por e)emplo1
EEl se-or Ruan Perez es ma/or de edad con BK a-osF. ( bien ERuan Perez tiene >% a-os / le faltan D
para ser ma/or de edadF. En caso de no .aber ingresado un entero en la edad mostrar un mensa)e de
error.
E*eriio ?: 6dem al anterior pero si la edad no es un entero valido (positivo / si el nombre esta
vaco mantener el bot!n des.abilitado.
E*eriio @: @ealiza una aplicaci!n con un Edit / un bot!n, en el Edit se debe ingresar un n+mero
entre > / >C (caso contrario el bot!n permanece des.abilitado. :l presionar el bot!n mostrar tantos
mensa)es como diga el Edit1 E2ensa)e ;V >F, E2ensa)e ;V BF, etc.
E*eriio 1A: @ealiza una aplicaci!n con un Edit / un bot!n. 2ientras el Edit este vaco, mantener
el bot!n des.abilitado. :l pulsar el bot!n, cambiar el ttulo de la ventana con el contenido del Edit.
E*eriio 11: 7tilizando un Edit / un bot!n, realiza el )uego del a.orcado, (el algoritmo es casi el
mismo que usaste en programaci!n en modo te'to con algunas modificaciones.
Es probable que para la realizaci!n de estos e)ercicios te resulte conveniente utilizar el ob)eto
&abel.
!bjeto &abel:
&abel es simplemente una etiqueta, sus propiedades de inter3s son Caption (lo que dice la etiqueta
/ Aont (fuente de la etiqueta.
Es factible tratar eventos sobre la etiqueta ((nClic8 por e)emplo aunque en la prctica el ob)eto
&abel se usa como una etiqueta puramente aclaratoria.
$
Capitulo ':!bjeto (emo$ arc)ivos de te*to
<eremos continuaci!n el ob)eto 2emo. :ntes aclararemos algunos puntos. &os ob)etos son
clases (que como lo .abamos mencionado, son estructuras me)oradas con m3todos / eventos. &as
propiedades de los ob)etos pueden ser clases que tienen m3todos / eventos propios. Esto que en
principio puede parecernos complicado, en realidad facilita muc.simo las cosas. Por e)emplo,
muc.os ob)etos visuales tienen la propiedad Color. &a propiedad color es una clase (class llamada
4Color, la clase 4Color tiene a su vez sus propiedades, pero lo importante, es que una vez que
conocemos las propiedades de 4Color, las podremos aplicar a cualquier ob)eto que tenga la
propiedad Color, es mas, podremos .acer que un ob)eto tome el color de otro con una simple
igualaci!n, pues las propiedades Color de ambos ob)etos son del mismo tipo (4Color. Para facilitar
las cosas los tipos de clase estn dados anteponiendo una 4 ma/+scula al nombre del ob)eto
definido (los Button son de la clase 4Button, los Aorm son de la clase 4Aorm, etc.
!bjeto (emo:
Es un ob)eto que tiene la capacidad de contener te'to plano (esto es sin !ormato' es decir,
sin cambios en la fuentes, colores etc. Contiene solamente te'to, cambios de lnea / tabulaciones.
Para que te ubiques, el Bloc de ;otas tiene un ob)eto 2emo que ocupa toda la ventana principal.
(;o lo confundas con el "ordPad, que puede contener distintos tipos de fuentes.
El ob)eto 2emo se encuentra en la pesta-a 5tandar / tiene forma de .o)a.
5us propiedades importantes son1
)olor: de tipo 4Color (com+n a muc.os ob)etos visuales .ace referencia al color del fondo
memo.
.ont: 5e refiere a la fuente con la cual visualizaremos el te'to. 5i bien el te'to no contiene
informaci!n acerca de fuentes / colores, todos los te'tos de "indo#s utilizan una determinada
fuente. Esa fuente la especificamos con esta propiedad, pero el te'to no guardara informaci!n sobre
la fuente usada, se trata simplemente de la fuente con la cual deseamos ver el te'to en este
momento.
+roll-ars: de tipo Enum, se refiere a si el ob)eto tendr o no barras de desplazamiento en sus
bordes, puede tomar los siguientes valores1
ss;one 1 ninguna barra de desplazamiento
ss0orizontal1 barra de desplazamiento .orizontal
ss<ertical1 barra de desplazamiento vertical
ssBot.1 ambas barras de desplazamiento.
0ines: de tipo 45tring, esto es una lista :nsi5tring. Es la propiedad que ms nos interesa, /a que es
la propiedad donde esta guardado el te'to del 2emo. 45tring es una clase, / es como se di)o una
lista de :nsi5tring, a continuaci!n te dar3 algunas propiedades / m3todos de la clase 45tring, que
ser aplicable a todos los ob)etos de tipo 45tring (en particular a la propiedad &ines de los 2emos
&a Clase +,tring:
Propiedades:
)ount: 6ndica la cantidad de :nsi5tring que contiene el ob)eto 45tring
+tringsBint indieC1 es una propiedad de tipo :nsi5tring, / se refiere al :nsi5tring que esta en la
posici!n dada por el indice. Por e)emplo1
9nsi.tring auC$
auC 3 /emo1->Bines->.trings:><$
este peque-o c!digo copia el tercer rengl!n del memo en la variable au' (nota que el indice en este
caso arranca de >
>C
Mtodos:
Dppend (:nsi5tring 51 :grega el :nsi5tring 5 al final de la lista.
)lear(): Borra toda la lista.
;elete(int indice1 borra el rengl!n dado por ndice (todo el te'to se desplaza .acia arriba.
Insert(int indice, :nsi5tring 5 6nserta el :nsi5tring 5 en el rengl!n indice.
Move(int actual, int nuevo1 mueve el renglon actual al renglon nuevo.
0oad.rom.ile(:nsi5tring nombreMarc.ivo1 Carga un te'to desde arc.ivo dado por
nombreMarc.ivo
+ave1o.ile(:nsi5tring nombreMarc.ivo1 Wraba el te'to a un arc.ivo dado por nombreMarc.ivo.
Con todo esto /a estamos en condiciones de realizar algunos programas1
Ejercicios:
E*eriio 1: @ealiza un programa que permita cargar / guardar un te'to. Puedes especificar el
nombre del arc.ivo en un Edit.
E*eriio 2: 6dem anterior pero con botones para borrar el contenido del memo, / para informar
mediante un mensa)e la cantidad de renglones que contiene el 2emo.
E*eriio 3: 6dem anterior pero con un bot!n que nos permita contar la cantidad de veces que
aparece una letra determinada (ingresada en un cuadro de edici!n.
E*eriio 6: 2odifica el programa del a.orcado para que en lugar de ingresar la palabra clave, la
mquina la eli)a al azar desde un arc.ivo de te'to que contiene una lista de ttulos de pelculas (el
arc.ivo te lo proporcionar el profesor. Puedes utilizar el ob)eto 5.ape (formas mane)ando su
propiedad visible.
E*eriio <: &as pelculas ripeadas desde un *<* suelen tener un arc.ivo de te'to correspondiente
a los subttulos. En este caso tenemos un arc.ivo de subttulos en formato 2icro*<* con
e'tensi!n 57B. El arc.ivo guarda la siguiente l!gica1
En cada rengl!n tenemos dos n+meros encerrados entre llaves / a continuaci!n un te'to. El primer
n+mero corresponde a la escena en la cual aparecer el te'to, el segundo corresponde a la escena en
la cual desaparecer dic.o te'to.
E)emplo1
I>CQKUJI>CU>BJ&os das se estn volviendo oscuros.
5uele suceder que un arc.ivo de subttulos queda desfasado con la pelcula (pues se .an omitido
algunos segundos del comienzo. &o que debes .acer es abrir este arc.ivo de te'to / crear otro de
modo que todas las escenas deben incrementarse en >C.
6nciso b 6dem al anterior, pero que permita incrementar (o decrementar una cantidad variable de
escenas.
(El arc.ivo original te lo proporcionar el profesor.
>>
:ntes de terminar este captulo veremos algunos componentes ms cu/a implementaci!n es mu/
sencilla.
!bjeto C)ec-Bo*:
Es una casilla de verificaci!n, que puede estar marcada o no. 5e suele utilizar para mane)ar
variables booleanas. 5u propiedad ms importante es la propiedad C.ec8ed, que puede tomar los
valores true o false, de acuerdo a si la casilla esta marcada o no.
!bjeto .adio/roup:
Es un con)unto de casillas circulares. 5e suele utilizar cuando debo elegir entre una de varias
opciones, es decir, cuando marco una casilla circular, automticamente se libera la casilla que
estaba marcada anteriormente. 5e puede configurar para que permita selecci!n multiple, pero para
este caso es preferible utilizar varias c.ec8bo'.
5us propiedades importantes son1
Items: Es una propiedad de tipo 4strings, donde cada :nsi5tring representa una opci!n. Es factible
entonces modificar los items en tiempo de e)ecuci!n. Esto en general no se utiliza, sino que se
asignan las opciones en tiempo de edici!n.
ItemInde,: Es una propiedad de tipo int, donde se representa el n+mero de item que est
seleccionado (C es el primero para que no .a/a ning+n item selecionado, 6tem6nde' debe valer T>.
E*eriio =: @ealiza un programa con un memo que me permita abrir / guardar te'to. *ebe .aber
una casilla de verificaci!n,que me permita poner visible o invisible el memo. :demas debe .aber
un radio group con las opcioes1
5in barra de deplazamiento.
5olo barra .orizontal
5olo barra vertical
:mbas barras
&as cuales colocan las 5crollBar correspondientes en el memo.
>B
Capitulo 0:Cuadros de dialogo y objetos no visuales
Como te .abrs dado cuenta, ingresar los nombres de los arc.ivos mediante cuadros de
edici!n es mu/ inc!modo / adems da lugar a errores de tip3o. Para acceder a los arc.ivos
podemos utilizar una .erramienta especfica para tal fin.
Cuadros de 1ialogo:
Pensemos en cualquier programa de "indo#s que acceda a arc.ivos ("ord, E'cel, Corel
*ra#, etc. :l querer acceder a los arc.ivos se abre una ventana que nos permite movernos por el
rbol de directorio, ver los arc.ivos como lista, etc. Esta ventana es un cuadro de dialogo. 7n
cuadro de dialogo es una ventana que no puede ser redimencionada / puede ser tan comple)a como
queramos. *e .ec.o, la ventana que aparece con 5.o#2essage es un cuadro de dialogo con un
bot!n. :.ora bien, e'isten cuadros de dialogo predefinidos por "indo#s, por e)emplo, el cuadro de
dialogo de Eabrir arc.ivosF es propio de "indo#s / es llamado por los programas. ;osotros
podremos entonces pedirle a "indo#s que muestre alguno de sus cuadros de *ialogo predefinidos.
Para ellos deberemos colocar el ob)eto Ecuadro de dialogoF que necesitemos. Estos ob)etos estn en
la ventana *ialogs.
:qu se incorpora un concepto nuevo, los ob)etos no visuales. Es decir, cumplen una
determinada funci!n pero no son visibles para el usuario. &os cuadros de dialogo son ob)etos no
visuales, al ponerlos en nuestro pro/ecto se vern como un icono, pero ese icono no aparecer en
nuestra aplicaci!n, por lo tanto no es importante el lugar donde pongamos ese icono, es
conveniente ponerlo en un lugar visible (para poder acceder a sus propiedades pero que no nos
moleste mientras estamos en editando.
!bjeto !pen1ialog:
*entro de la pesta-a *ialogs, es el ob)eto que tiene forma de carpeta. 5u funci!n es obtener
el nombre de un arc.ivo. Como todos los cuadros de dialogo es un ob)eto no visual.
Mtodos:
E,eute(): es un m3todo que no pide ning+n parmetro / devuelve un valor booleano. Es el
m3todo ms importante del (pen*ialog. &o que .ace es )ustamente mostrar (e)ecutar el cuadro de
dialogo. :ll podremos entonces seleccionar cualquier arc.ivo de nuestro sistema, nos permitir
cambiar de carpeta, de unidades, crear una nueva carpeta, etc. 0a/ dos maneras de cerrar el cuadro
de dialogo, seleccionando un arc.ivo, o cancelando la operaci!n (/a sea con Cancelar o con el
bot!n de cerrar la ventana. 5i seleccionamos un arc.ivo E'ecute( devolver 4@7E, si cancelamos
la operaci!n E'ecute devolver A:&5E.
Es importante que tengas en claro que el ob)eto (pen*ialog no abre un arc.ivo, lo +nico
que .ace actualizar la propiedad Aile;ame con el nombre del arc.ivo seleccionado, o sea que la
operaci!n de apertura de arc.ivo corre cuenta del programador. @ecuerda (pen*ialog no a$re un
arhivo' sino que nos permite seleccionar uno c!modamente. El m3todo E'ecute( deber ser
llamado por el evento que corresponda cuando desees abrir un arc.ivo (por e)emplo un bot!n de
abrir.
Propiedades:
.ileName: Propiedad de tipo :nsi5tring. Esta es la propiedad que contiene el nombre del arc.ivo
que se seleccion! con el m3todo E'ecute(9 / es la propiedad que nos interesar a la .ora de abrir el
arc.ivo. 5i el m3todo E'ecute( se cancelo (devolvi! A:&5E esta propiedad no vara, por lo tanto
contendr el mismo valor que antes. *ebes tener cuidado de evaluar si el evento E'ecute(
devuelve verdadero o falso para evitar errores.
E)1
void __!astcall "#orm1%%+utton1&lick("',-ect .ender)
)
i! ('penEialog1->@Cecute())
/emo1->Bines->Boad#rom#ile('penEialog1->#ileFame)$
*
Este c!digo carga el te'to de un arc.ivo en un 2emo.
>D
1itle: Propiedad de tipo :nsi5tring. :qu colocamos el ttulo que deseamos que tenga el cuadro de
edici!n. 5i no se especifica nada, el ttulo ser :brir.
.ilter: &a propiedad filter permite visualizar determinados tipos de arc.ivos (solo =.t't, solo =.pas.
etc. 0aciendo doble clic8 sobre la propiedad filter (6nspector de (b)etos se abre el filter editor,
que nos presenta una tabla con dos columnas. En la columna de la derec.a colocamos el nombre
del filtro (que deseamos que aparezca en el cuadro de dialogo, en la columna de la izquierda, el
filtro en s.
E)1
Ailter ;ame Ailter
:rc.ivos de te'to =.t't
:rc.ivos de C =.cpp
:rc.ivos de Pascal =.pas
4odos los arc.ivos =.=
;e!aultE,t: Propiedad de tipo :nsi5tring. 5i lo deseamos podemos indicar una e'tensi!n que se
agrega automticamente si el usuario escribe el nombre de un arc.ivo sin e'tensi!n. En general esta
propiedad no se utiliza en el (pen*ialog.
!bjeto ,ave1ialog:
Como se aclar! anteriormente, el ob)eto (pen*ialog no abre un arc.ivo sino que nos
facilita la obtenci!n de su nombre. Por lo tanto sera factible utilizar el (pen*ialog para obtener el
nombre de un arc.ivo que deseamos guardar. Esto (insisto es totalmente factible, sin embargo, las
le/endas el cuadro de (pen*ialog, .ace referencia a apertura de arc.ivo, con lo cual podra dar
lugar a equivocaciones usar este cuadro para guardar.
Para guardar entonces se utiliza el cuadro de dialogo 5ave*ialog, que tiene las mismas
propiedades que el anterior, / el evento E'ecute( que se comporeta de la misma manera. &a
diferencia es puramente est3tica, /a que sus te'tos .acen referencia a Wuardar en lugar de abrir.
En este ob)eto cobra sentido la propiedad *efaultE't, a/ que si el usuario no coloca ninguna
e'tensi!n al arc.ivo, 5ave*ialog colocar automticamente la e'tensi!n que figura en dic.a
propiedad. Por e)emplo si se trata de un programa que traba)a sobre te'to plano sera l!gico que su
*efaultE't fuese 4X4.
!bjeto Color1ialog:
:l igual que los anteriores es un ob)eto no visual / se comporta de la misma forma. 5e
utiliza cada vez que deseamos seleccionar un color. El m3todo E'ecute se comporta igual que en
los cuadros anteriores.
Propiedad )olor: Es un propiedad de tipo 4Color. &a clase 4Color guarda informaci!n acerca de
un color especfico, nos bastar con saber que podemos igualar dos variables (o propiedades de
tipo 4Color. @ecuerda que el ob)eto Color*ialog es un ob)eto no visual, por lo tanto su propiedad
Color no .ace referencia al color de dic.o ob)eto, sino al color que fue seleccionado (en caso de
que E'ecute devuelve 4@7E
E)1
void __!astcall "#orm1%%+utton1&lick("',-ect .ender)
)
i!(&olorEialog1->@Cecute())
#orm1->&olor3&olorEialog1->&olor$
*
El pulsar un bot!n aparece un cuadro de selecci!n de color, al elegir uno, la ventana toma dic.o
color.
>K
!bjeto %ont1ialog:
Es prcticamente igual al ob)eto Color*ialog, solo que en este caso la propiedad que nos
interesa es Aont, / que al igual que antes, no es la fuente del ob)eto (pues no es visual sino la
fuente seleccionada.
E*eriio 1: 2odifica los e)ercicios D, K, % / O del captulo anterior, reemplazando los cuadros de
edici!n por (pen*ialog / 5ave*ialog respectivamente.
E*eriio 2: @ealiza un programa que nos permita cargar / guardar un 2emo, borrar su contenido,
cambiar su fuente / su color.
&os cuadros de dialogo no son los +nicos ob)etos no visuales. Por a.ora veremos tambi3n los
men+s.
!bjeto (ain(enu:
Como se indic! antes, es un ob)eto no visual. &o encontramos en la pesta-a Estndar. El
2ain2enu es el men+ principal de la aplicaci!n. 7na ventana solo puede tener un 2ain2en+, sin
embargo es factible (aunque improbable que deseemos cambiar de men+ en tiempo de e)ecuci!n.
Por lo tanto es posible colocar mas de un 2ain2enu en una aplicaci!n, aunque solo uno estar
activado a la vez. El ob)eto Aorm tiene la propiedad 2enu, en la cual se especifica cual de todos los
2ain2enu e'istentes es el que debe utilizarse. Cuando nosotros creamos el primer 2ain2enu (/
en general el +nico esta propiedad se actualiza automticamente, as que en general no debes
preocuparte por todo lo anterior.
Para editar el 2ain2enu, debemos .acer doble clic8 sobre dic.o ob)eto, / veremos una
tabla en la que colocaremos las diferentes opciones.
En la primer fila se suelen poner los ttulos (:rc.ivo, Editar, (pciones, Etc. / a apartir de
la segunda fila se colocan los distintos items. 5i queremos que aparezca una lnea divisoria,
debemos ingresar como Caption el carcter menos EGE. 5i .acemos clic8 derec.o sobre un item,
podemos (entre otras cosas agregar en el un submenu, podemos adems guardar / cargar una
plantilla (template con el esqueleto de men+ que deseemos.
Para acceder el evento que se llamar al clic8ear sobre el item del menu, lo +nico que
debemos .acer es doble clic8 sobre dic.o item. Cada item tiene un nombre, de este modo podemos
acceder a las propiedades de cada item (por e)emplo la propiedad Enabled de cada item Colocar un
men+ a una aplicaci!n es algo verdaderamente sencillo, irs aprendiendo ms propiedades/
funciones con su uso.
!bjeto Pop2p(enu:
El Pop7p2enu es el men+ emergente, esto es, el men+ que aparece cuando .acemos clic8
derec.o sobre un determinado ob)eto. &a manera de crear un Pop7p2enu es id3ntica a la del
2ain2enu. Podemos crear tantos Pop7p2enu como deseemos, pero recuerda que estos estn
vinculados con ob)etos visuales. 4odos los ob)etos visuales tienen la propiedad Pop7p2enu, aqu
especificamos que Pop7p2enu deseamos relacionar con este ob)eto. 7n mismo Pop7p2enu
puede estar vinculado a varios ob)etos visuales.
E*eriio 3: @ealiza un programa que nos permita cargar / guardar un 2emo, ;uevo arc.ivo,
cambiar su fuente / su color. 4odas estas funciones deben ser accesibles desde el men+ principal,
adems las funciones de cambio de color / de fuente debern ser accesibles desde un men+
emergente relacionado al 2emo.
E*eriio 6: 6dem al anterior, pero deben figurar las opciones :brir, Wuardar / Wuardar Como. :l
:brir o Wuardar Como debe copiarse el nombre del arc.ivo en el ttulo de la ventana. 5i el arc.ivo
/a tiene un nombre vlido entonces se .abilitar la opci!n Wuardar, la cual no deber preguntar el
nombre del arc.ivo. *ic.a opci!n debe des.abilitarse con :rc.ivo ;uevo.
>%
Captulo 3: Cuadros de di4logo personali5ados y ventanas m6ltiples.
#entanas no modales:
En este captulo veremos como realizar nuestros propios cuadros de dialogo, los cuales
podrn ser tan comple)os como queramos, /a que de .ec.o, un cuadro de dialogo es una ventana
que no puede ser redimensionada.
El proceso es sencillo, pero requiere ser met!dico a la .ora de guardar nuestro pro/ecto.
E*emplo 1:
Para el e)emplo crearemos una ventana principal con un bot!n, luego, en el men+ iremos a
AileGN;e# Aorm. *e esta manera se crea una segunda ventana llamada (en principio
AormB.
Para no confundir esta ventana como la primera, le cambiaremos el color desde las
propiedades (ro)o por e)emplo / le agregaremos dos botones, uno que diga 5i, / otro que diga ;o.
Es importante que grabes tu pro/ecto en una carpeta como se e'plic! en el capitulo >. 5i no
cambias los nombres de los arc.ivos (si los cambias no .abr ning+n problema, la ventana > estara
guardada como 7nit>.cpp con su correspondiente 7nit>.., / la ventanaB estara guardada como
7nitB.cpp con su correspondiente 7nitB..,
El pro/ecto, al ser compilado arrancar con el Aorm>, el cual es independiente del AormB, /
ademas desconoce la e'istencia de AormB, es por eso que necesitamos que Aorm> se entere de que
AormB e'iste para llamarlo. Para eso iremos al c!digo de Aorm> (7nit>.cpp / veremos que en el
principio, dentro de los include figura1
#include "Unit1.h"
:qu se inclu/e la declaraci!n de los ob)etos / los m3todos del Aorm>. &o que .aremos ser
agregar a continuaci!n la declaraci!n de los ob)etos / los m3todos del AormB, es decir agregaremos
a continuacion1
#include "Unit8.h"
Con lo cual Aorm> conocer la e'istencia de AormB.
:.ora .aremos que al pulsar el bot!n del Aorm> aparezcar el AormB. Para ello utilizaremos
un m3todo que posee el ob)eto Aorm, el m3todo es 5.o#( que como podrs darte cuenta lo que
.ace es )ustamente mostrar un Aorm. El c!digo entonces quedar1
//-----------------------------------------------------------
#include <vclGvcl.h>
#pragma hdrstop
#include "Unit1.h"
#include "Unit8.h"
//-----------------------------------------------------------
#pragma resource ".d!m"
"#orm1 #orm1$
//----------------------------------------------------------
__!astcall "#orm1%%"#orm1("&omponent '(ner)
% "#orm('(ner)
)
*
//-----------------------------------------------------------
void __!astcall "#orm1%%+utton1&lick("',-ect .ender)
)
#orm8->.ho(()$
*
5i pruebas de compilar esta aplicaci!n vers que entonces ambas ventanas son accesibles,
cada ventana tendr entonces sus ob)etos / sus m3todos en forma independiente. Este tipo de
aplicaci!n se llama aplicaci!n 5*6, donde puede .aber varias ventanas, / donde podemos cambiar
el foco de ventana en ventana en ventana.
2as all de los nombres que tengan los ob)etos (si no .as cambiado los nombres, cada
ventana tendr un bot!n llamado Button>, debes saber que cada ob)eto es propio de cada ventana.
>O
E*emplo 2:
Para aclararlo, agrega un segundo bot!n en el Aorm>, / cuando lo pulse agrega el siguiente
c!digo1
+utton8->Be!t77$
&o que suceder a.ora es que cada vez que pulses este bot!n, el mismo se desplazar a la
derec.a. Pero si AormB tiene un bot!n que tambi3n se llama ButtonB, Yc!mo sabe Builder a cual de
los dos nos referimosZ En realidad, el .ec.o de que los dos botones se llamen igual es pura
coincidencia. Aorm> no puede .acer referencia (en forma directa a los ob)etos de AormB. Prueba
de cambiar el nombre del ButtonB del AormB, col!cale como nombre 5egundoBoton.
P a.ora modifica el evento del ButtonB del Aorm> de la siguiente manera1
.egundo+oton->Be!t77$
5upuestamente debera desplazarse el bot!n del AormB, sin embargo al compilar notamos
que el compilador nos da un error
:&77 @rror< Unit1.cpp(81)% @8;41 Unde!ined sHm,ol I.egundo+otonI
&o que sucede es que Aorm> no conoce a 5egundoBoton, porque este ob)eto es propio de
AormB, para ello deberemos modificar nuestro c!digo de la siguiente manera1
#orm8->.egundo+oton->Be!t77$
*e esta manera podemos .acer accesibles los ob)etos de un Aorm desde otro Aorm. Cabe
aclarar que por a.ora los ob)etos de AormB son accesibles desde Aorm>, pero no a la inversa, para
lograr eso, en 7nitB.cpp deberamos incluir la declaraci!n de los ob)etos de Aorm>, es decir1
#include "Unit1.h"
Cabe aclarar que los (b)etos del AormB son persistentes aunque la ventana se cierre, es
decir, cerrar la ventana equivale a ocultarla, no a destruirla.
Aorm> sigue siendo la ventana principal de la aplicaci!n, si se cierra la Aorm>, la aplicaci!n
se cierra, / AormB se cierra con ella.
E*eriio 1: Crea una aplicaci!n con dos ventanas, una ro)a / la otra azul, ambas ventanas
tienen un bot!n / un Edit. :l comenzar la aplicaci!n deben estar ambas ventanas abiertas (utiliza el
evento (n:ctivate de la ventana > . :l pulsar sobre el bot!n de la ventana >, la ventana B tomar
por ttulo el contenido del Edit de la ventana > / viceversa"
E*eriio 2: 2odifica el e)ercicio K del captulo K de manera que el 2emo este solo en una
ventana diferente a la principal (para que el 2emo ocupe toda la ventana dale a la propiedad :lign
el valor alClient.
&a diferencia entre ventanas / cuadros de dialogo es, como se .a dic.o, que los cuadros de
dialogo no pueden ser redimensionados, para ello lo +nico que .a/ que cambiar es la propiedad
Border5t/le del AormB, / cambiarla de bs5izeable a bs*ialog. *e esta manera la ventana ser un
cuadro de dialogo. Prueba de modificar los e)ercicios anteriores utilizando esta nueva propiedad.
#entanas (odales:
0a/ una gran diferencia entre ventanas (o cuadros de dialogo modales / no modales. &a
aplicaci!n anterior tena la particularidad de que nosotros podamos cambiar el foco de una ventana
a la otra, es decir, podamos traba)ar en una ventana o en otra indistintamente.
Esto no siempre es as. Por e)emplo el cuadro de dialogo de 5.o#2essage toma el control
de la aplicaci!n, es decir, la aplicaci!n pasa su atenci!n a este cuadro de dialogo, el cual debemos
cerrar para volver a tener el foco en la ventana principal (/a sea aceptando o cerrando el cuadro de
dialogo. &o mismo sucede con el cuadro de dialogo propio de (pen*ialog. Este cuadro espera una
>Q
respuesta (por selecci!n o por Cancel pero nosotros no podemos volver a nuestra aplicaci!n sin
dar una respuesta a este cuadro de dialogo. Este tipo de cuadros (o ventanas son Modales"
7n e)emplo de cuadro de dialogo no modal se el que aparece con la opci!n de .allar /
reemplazar (en "ord por e)emplo. En este caso si se nos permite cambiar el foco del "ord al
cuadro de dialogo sin necesidad de cerrarlo. Este es un e)emplo de cuadro de dialogo no modal.
&as diferencias entre las ventanas o los cuadros de dialogo modales / no modales seran
entonces1
;o modales1 Pueden coe'istir con la ventana principal, / podemos cambiar de uno a otro cuando
queramos.
2odales1 &a aplicaci!n pasa su atenci!n a el, / no recupero el control de la aplicaci!n .asta darle
una respuesta (o cerrarlo.
*esde el punto de vista de la construcci!n de una ventana modal, los pasos a seguir son
e'actamente los mismos con una salvedad, en lugar de mostrarlos son el evento 5.o#( los
mostraremos con el evento 5.o#2odal( que es propio del ob)eto Aorm.
E*emplo 3:
5igue los pasos del e)emplo > pero en el evento del Button> del Aorm> en lugar de
#orm8->.ho(()$
Coloca
#orm8->.ho(/odal()$
Prueba la aplicaci!n / vers que efectivamente no se puede pasar del AormB al Aorm> sin
cerrar primero el AormB. :.ora bien, los botones que dicen 5i / ;o son mu/ sugerentes,
supuestamente deberan dar una respuesta. &a idea de los cuadros de dialogo modales suelen ser dar
un respuesta, recuerda los cuadros con los botones 5i [ ;o, :ceptar [ Cancelar, @eintentar [
Cancelar, etc.
:qu veremos una diferencia importante en los m3todos 5.o#( / 5.o#2odal(.
5.o# es un m3todo declarado como1
void 5.o# (void9

Es decir, no pide ni devuelve nada, simplemente muestra la ventana.
5.o#2odal en cambio esta declarado como1
int 5.o#2odal (void9
Es decir, 5.o#2odal devuelve un valor entero, que es el que debemos evaluar para saber
que bot!n a pulsado el usuario.
YC!mo .acemos entonces para que la ventana modal devuelva un valor como respuestaZ
El proceso es mu/ sencillo. &os botones tienen (/ siempre la tuvieron una propiedad llamada
2odal@esult, que es una propiedad de tipo int. :l poner algo en esa propiedad, ese bot!n
automticamente se convierte en un bot!n que dar una respuesta a la ventana principal
(devolviendo el valor especificado / cerrar la ventana modal.
5i observamos los valores que puede tomar la propiedad 2odal@esult veremos que son1
2r(8
2rCancel
2r:bort
2r@etr/
2r6gnore
2rPes
2r;o
2r:ll
2r;o4o:ll
2rPes4o:ll
Pero si 2odal@esult es una propiedad de tipo int, Yc!mo es posible que tome esos valoresZ.
&a respuesta es que todos los valores mencionados anteriormente son constantes que toman los
valores del > al >C respectivamente. 5i quisi3semos dar otro valor entero diferente se puede asignar
cualquier otro valor entero a 2odal@esult. Es nuestra responsabilidad evaluar el valor de
5.o#2odal.
>U
E*emplo 6:
2odifica el e)emplo anterior poniendo a los botones si / no del AormB los 2odal@esul 2rPes /
2r;o respectivamente.
En el evento (nC&ic8 del Button> del Aorm> coloca lo siguiente1
void MMfastcall 4Aorm>11Button>Clic8(4(b)ect =5ender
I
int r9
rHAormBGN5.o#2odal(9
5.o#2essage(r9
J
Prueba la aplicaci!n / e'plica lo que sucede.
E*emplo 6:
En el Aorm> cambia el Caption del Button> / coloca ECerrarF
En el AormB agrega un &abel con letras grandes que diga1 E Y5eguro desea cerrar la aplicaci!nZ F
En el evento (nClic8 del Button> (cerrar coloca1
void MMfastcall 4Aorm>11Button>Clic8(4(b)ect =5ender
I
int r9
rHAormBGN5.o#2odal(9
if(rHHO Aorm>GNClose(9
J
Prueba la aplicaci!n / e'plica que sucede.
E*eriio 3: 2odifica el e)ercicio B de modo que al seleccionar :rc.ivo ;uevo aparezca un cuadro
de *ialogo 2odal de confirmaci!n (YEsta seguroZ 5i o ;o.
E*eriio 6: 2odifica el e)ercicio anterior para que pida una confirmaci!n cuando seleccionamos
cerrar la ventana (consultar al profesor el evento (nClose\uer/.
>$
Capitulo 7: Bases de 1atos.
En este captulo aprenderemos a manipular bases de datos (a partir de a.ora B*. Podremos
realizar varias operaciones dentro de una B*, pero para eso es necesario que la B* este creada. El
C++ Builder trae dentro de sus .erramientas un programa especfico para crear B* de distintos
formatos.
Este programa es el *ataBase *es8top, el cual es accesible tanto desde la barra inicio, como
desde dentro del compilador de Builder en la pesta-a 4ools.
Es importante que entiendas que si bien este programa esta dentro del paquete de Builder
(es decir, se instala )unto con el compilador, es un programa totalmente independiente del
compilador.
Creacin de una nueva B1:
Entra al *ataBase *es8top. 5elecciona Aile, ;e#, 4able. :qu el programa nos preguntar
que tipo de B* queremos crear. 0a/ muc.os tipos de formatos de B*, (de la misma manera que
.a/ muc.os formatos grficos desde el punto de vista de la programaci!n, no .abra muc.a
diferencia entre un tipo / otro, sin embargo para ponernos de acuerdo en un tipo en particular,
seleccionaremos el formato *base 6< (que es uno delos ms utilizados.
:.ora estamos en condiciones de crear los campos (no estamos llenando los campos con
datos, sino creando los campos / especificando su tipo. <eras una tabla que tiene las columnas1
Aield;ame1 ;ombre del campo (no puede contener espacios.
4/pe1 4ipo de dato, en *base 6< tenemos los tipos1
C.aracter (caracateres o string
Aloat (numero flotante
;umber (n+mero entero
*ate (Aec.a
&ogical (verdadero o falso
2emo (te'to e'tenso
5ize1 4ama-o (en el caso de C.aracter, cantidad de caracteres, en el caso de ;umber,
cantidad de cifras, el resto de los tipos no pide 5ize.
*ec1
*ebes poner un nombre al campo (no puede contener espacios / no pueden comenzar con
un n+mero ,en realidad, estas son condiciones comunes a los modificadores, de .ec.o, ni en Pascal
ni en C los identificadores pueden contener espacios o comenzar con un n+mero.
&uego de poner un nombre debes especificar un tipo (presionando la barra espaciadora
aparecen los distintos tipos.
7na vez seleccionado el tipo deberemos (si el tipo de dato lo requiere especificar el tama-o
/ la cantidad de decimales.
@epetiremos este proceso por cada uno de los campos que contenga nuestra B*.
7na vez ingresados todos los campos, debemos guardar nuestra B*.
IMP981DN1E: ;e$es guardar la -; en el diretorio de tra$a*o de la apliai&n #ue rears"
Es onveniente entones #ue rees un diretorio (o arpeta) destinado a ontener el arhivo de
la -; y los arhivos del proyeto" +i no haes esto' el arhivo de la -; (en nuestro ser un
";-.) se guardar en ):EDrhivos de programaE-orlandE;ata -ase ;esFtopEG";-.
)omo ves' no es una u$iai&n muy &moda #ue digamos"
7na vez guardada la B*, es conveniente llenarla con tres o cuatro registros para poder
probarla en nuestro futuro pro/ecto. Para ello brela, / ponla en modo Edici!n (pulsa A$, podrs
entonces llenar los distintos campos. 7na vez ingresados los registros cierra la tabla, los datos se
guardan automticamente.
Por el momento podremos cerrar al *ata Base *es8top / abrir el Builder.
Para poder tener acceso a la B* que .emos creado necesitaremos de un ob)eto no visual
llamado 4able, (de tipo 4table que se encuentra en la pesta-a *ata :ccess.
Este ob)eto sirve para vincularnos con el arc.ivo fsico de la Base de *atos.
BC
!bjeto +able
+us propiedad ms importantes son:
Dtive1 booleana, puede valer true o false. 6ndica si la B* estar abierta al comenzar el programa.
7sualmente nos convendr mantener esta propiedad en true, pero debemos tener cuidado, al .acer
esto la B* estar abierta en tiempo de edici!n, si deseamos modificar algo de la B* desde el
*ataBase *es8top debemos volver a poner en false esta propiedad para que no nos de un error de
acceso a arc.ivos.
;ata-aseName1 Propiedad :nsi5tring, aqu se especifica el directorio donde se encuentra el
arc.ivo de nuestra B*, si tuvimos la precauci!n de guardar dic.o arc.ivo en el directorio de traba)o
de nuestro pro/ecto, esta propiedad debe quedar en blanco, esto es importante, /a que si llevamos
nuestro pro/ecto a otra mquina / llenamos esta propiedad la B* se buscar en el directorio
especificado, si el pro/ecto esta en un directorio diferente .abr un error /a que no encontrar el
arc.ivo.
1a$leName1 Propiedad de tipo :nsi5tring, nos pregunta por el nombre fsico del arc.ivo
correspondiente a nuestra B* (en el caso de *base 6< se tratar de un arc.ivo =.*BA. Esta
propiedad tiene una pesta-a para desplegar un men+, el cual contendr los nombres de las B*
disponibles en nuestro directorio de traba)o ,si .emos sido cuidadosos, ser el directorio de nuestro
pro/ecto, en este caso, suele ser necesario reiniciar el Builder despu3s de grabar nuestro pro/ecto
para que cambie el directorio actual.
Por el momento (/ solo por el momento estas son las +nicas propiedades que nos interesan.
El componente 4able, mediante m3todos nos permitir crear registros, borrarlos, ir al siguiente, al
anterior, etc. Pero esto lo veremos luego. Es importante que entiendas que este componente es el
que esta relacionado con el arc.ivo fsico de la B*, / es a este ob)eto al que nos referiremos para
acceder a la B*. 5in embargo, este ob)eto es no visual, por lo tanto los campos del registro no los
podemos ver desde aqu. Para ello e'isten numerosos ob)etos visuales de ma/or o menor
comple)idad / que nos brindan una interfaz amena entre el usuario / la B*. Para ello necesitamos
un segundo ob)eto no visual llamado *ata 5ource.
!bjeto 1ata,ource
Este ob)eto es el encargado de vincular todos los ob)etos visuales a un mismo ob)eto 4able. El
ob)eto *ata5ource se encuentra en la pesta-a *ata :ccess )unto al ob)eto 4able, tiene forma de
tabla con tres flec.as saliendo de ella.
&a +nica propiedad que nos interesa en la propiedad ;ata+et, en ella pondremos el nombre
de la tabla (por e)emplo 4able> que estar relacionada con este *ata5ource. Esta propiedad tiene
una pesta-a en la cual aparecern todos los ob)etos 4able (por el momento solo tendremos uno que
podemos seleccionar.
7na vez que tenemos creado el (b)eto 4able relacionado con un arc.ivo / el ob)eto
*ata5ource vinculado con el ob)eto 4able, /a estamoss en condiciones de colocar ob)etos visuales.
Esto es, ob)etos /a conocidos por nosotros que tienen el prefi)o *B en su tipo (/ por ende en su
nombre por defecto. En general se trata de ob)etos similares a los /a conocidos que tienen algunas
propiedades e'clusivas de las bases de datos.
Estos ob)etos estn en la pesta-a *ata Controls, todos ellos tienen la propiedad ;ata+oure en la
cual debo colocar el nombre del ob)eto *ata5ource al cual estarn vinculados (/, a trav3s de 3l, a
nuestra B* fsica especificada en 4able. : continuaci!n veremos algunos e)emplos1
!bjeto 1BEdit
Es similar al ob)eto Edit, solo vara en que tiene las propiedades ;ata+oure (/a e'plicada
/ *ataAield1
;ata.ield: Propiedad de tipo :nsi5tring, aqu se coloca el nombre del campo que estar
relacionado con este Edit (el campo se puede seleccionar de una lista desplegable desde la pesta-a.
6maginemos que nuestra B* contiene los campos ;(2B@E, :PE&&6*(, *6@ECC6(;, /
4E&EA(;(, todos de tipo c.ar (string para nosotros. ;uestra base esta relacionada a un ob)eto
4able, este a su vez a un ob)eto *ata5ource, / este a su vez a un ob)eto *BEdit. \ueda claro que el
ob)eto *BEdit .ace referencia a la base de datos, pero, Ya que campo .ace referenciaZ.
B>
Precisamente para ello es la propiedad *ataAield, supongamos que especifico en la propiedad
*ataAield el campo :PE&&6*(, automticamente, el ob)eto *BEdit tomar el valor que figure en
:pellido en el primer registro de la B*. 5i estuvi3semos en modo de edici!n (lo veremos luego lo
que figure en el ob)eto *BEdit se grabar automticamente en la B*.
!bjeto 1BC)ec-Bo*:
:l igual que *BEdit tiene las propiedades *ata5ource, / *ataAield, pero en este caso, tiene
sentido asignarla a un campo que sea de tipo l!gico (true o false.
!bjeto 1B(emo:
5u propiedad *ataAield debe ser asignada a un campo de tipo 2emo.
E'isten muc.os otros ob)etos visuales que puedes investigar por tu cuenta respetando la misma
l!gica.
0asta el momento estamos en condiciones de ver el contenido de los campos del primer registro de
una B*.
@epasemos los pasos para .acerlo1
> Creamos un B* en el *ata *es8top / la grabamos un directorio.
B &lenamos algunos registros de la B*
D Creamos un nuevo pro/ecto / lo grabamos en el directorio de donde est nuestra B*
K Colocamos un ob)eto 4able / colocamos la propiedad :ctive en true, / en la propiedad
4able;ame seleccionamos nuestro arc.ivo *BA
% Colocamos un ob)eto *ata5ource, / en su propiedad *ata5et, colocamos el nombre del ob)eto
4able (usualmente 4able>
O Creamos un *BEdit por cada campo de tipo c.ar / ponemos en la propiedad *ata5ource el
nombre de nuestro ob)eto *ata5ource (por e)emplo *ata5ource>, / en *ataAiels el campo que
deseamos vincular con cada *BEdit
5upuestamente deberamos ver los campos del primer registro de nuestra B*.
Para poder mane)ar nuestra B* debemos utilizar los m3todos del ob)eto 4able>.
(8todos de +able 9algunos de ellos$ derivados de otras clases antecesoras:
void Ne,t(9 5e ubica en el siguiente registro (todos los ob)etos visuales son actualizados
void Prior(9 5e ubica en el registro anterior (todos los ob)etos visuales son actualizados
void .irst(9 5e ubica en el primer registro (todos los ob)etos visuales son actualizados
void 0ast(9 5e ubica en el +ltimo registro (todos los ob)etos visuales son actualizados
void ;elete(9 Borra el registro actual
void Dppend(9 Crea un registro vaco al final de B*, / coloca la B* en modo de Edicion
(lista para ingresar, esta operaci!n debe ser cancelada o confirmada.
void Post(9 Confirma la operaci!n :ppend
void )anel(9 Cancela la operaci!n :ppend
void 9pen(9 :bre la B* (si la propiedad :ctive es tru este m3todo no es necesario
void )lose(9 Cierra la B*
void Edit(9 0abilita el modo edici!n de la B*
Podemos entonces, en base a botones que llamen a estos m3todos mane)ar una B*. 4en en cuenta
que algunas operaciones deberan des.abilitar ciertos botones. Por e)emplo, una llamada a Post sin
una previa llamada a :ppend deviene en un error, que deberamos evitar.
E*eriio 1: Crea una agenda que nos permita ingresar / consultar datos. Cada registro deber tener
los siguientes campos1
;ombre, *irecci!n, 4el3fono, Celular, Aec.a de nacimiento.
E*eriio 2: 6dem al anterior, pero que tenga un bot!n que permita listar las personas que
cumplirn a-os en los pr!'imos cuatro das (requiere mane)o de :nsi5tring / de la clase 4date.
E*eriio 3: Crea un programa de mane)o de .istorias clnicas. Para ello necesitars mane)ar los
siguientes campos1
BB
;ombre, *irecci!n, 4el3fono, Aec.a de nacimiento, (bra 5ocial, 5e'o (tipo l!gico 0istoria clnica
(tipo memo.
E'iste un ob)eto que nos permite mane)ar c!modamente una B*, se trata del *B;avigator.
!bjeto 1B;avigator:
Es un ob)eto visual que encontramos en la pesta-a *ataControl, como todos los ob)etos
visuales de mane)o de B* tiene la propiedad *ata5ource que lo vincula a una B* especfica. Este
ob)eto es una botonera asociada a los m3todos ms comunes. 5i bien es una forma rpida para una
B*, no tenemos tanto control sobre la B* como si nosotros controlamos los m3todos manualmente.
5in embargo tenemos la opci!n de agregar o quitar los botones que deseamos que aparezcan en el
*B;avigator mediante la propiedad <isibleButtons.
Capitulo <: Bases de 1atos ordenadas
0asta a.ora las B* no tenan ning+n orden, es decir, los registros estaban guardados por
orden de aparici!n. Para encontrar un determinado registro deberamos realizar una b+squeda
lineal, lo cual llevara un tiempo de proceso importante.
Podramos entonces ordenar la B* por alguno de sus campos, pero inmediatamente nos
encontraramos con el siguiente problema, nuestra B* s!lo podr estar ordenada por un solo
campo. 5i quiseramos tener la posibilidad de buscar los datos por cualquier campo, deberamos
tener diferentes copias de la B* ordenada cada una por un campo diferente. Esto, adems de ser
una perdida de espacio / tiempo (/a que deberamos ordenar ; bases de datos por cada registro
nuevo, nos lleva a errores de redundancia e inconsistencia.
Para solucionar estos problemas se recurre a los arc.ivos de ndices. Es decir, la B* se
mantiene desordenada, con los campos grabados por orden de aparici!n, pero se mantienen
arc.ivos paralelos que guardan los ndices de la B* guardando la posici!n fsica de los registros.
En nuestro caso (*Base 6< se guardan todos los ndices en un solo arc.ivo con e'tensi!n
2*X que contiene todos los ndices de los campos especificados. Podemos crear un arc.ivo de
ndice a partir de una B* e'istente. Para ello abrimos nuestra B* (arc.ivo *BA desde el *ataBase
*es8top, seleccionamos la opci!n @eestructure, / presionamos el bot!n que dice *EA6;E (en el
sector derec.o de la pantalla. &uego seleccionamos el campo por el cual queremos que se cree un
ndice, / presionamos (8, el programa nos pedir que le demos un nombre al ndice, es aconse)able
poner un nombre que nos recuerde a que campo direcciona nuestro ndice, por e)emplo, si estamos
direccionando el campo ;(2B@E, podramos llamar al ndice, 6;2(B@E.
@epetimos esta operaciones tantas veces queramos (una por cada campo que deseemos
inde'ar / por +ltimo grabamos nuestra tabla.
:.ora veremos como acceder a estos ndices / como utilizarlos desde el Builder. &os pasos para
acceder a las B* ordenadas son los mismos que para B* desordenadas, pero debemos indicar luego
algunas cosas1
Propiedades de +able:
Inde,.iles: ;os permite agregar uno o mas arc.ivos de ndices, en nuestro caso, solo necesitamos
uno, el arc.ivo 2*X que cre! el *ata Base *es8top. Podemos seleccionarlo utilizando el bot!n
:**.
Inde,Name: Es una propiedad de tipo :nsi5tring que especificamos cual de todos los ndices que
estn disponibles queremos activar al comenzar la aplicaci!n ,podemos (/ de .ec.o lo .aremos
cambiar esta propiedad en tiempo de e)ecuci!n. 7na vez .ec.o esto, los m3todos ;e't / Prior sern
relativos al ndice utilizado, es decir, que la B* aparentemente se ordenar automticamente
(aunque en realidad esto no sucede.
E)1
"a,le1->DndeCFame3JDEDK@&&D'FJ$
:qu vemos la necesidad de que los ndices tengan nombres representativos / fciles de recordar.
Esto es todo lo que necesitamos para cambiar el orden de una B*.
BD
E*eriio 1: 2odifica el e)ercicio B del captulo O para poder ordenar nuestra B* por cualquiera de
sus campos.
El uso de ndices no se limita solo a mantener ordenada la B*, nos permite adems, utilizar
procesos de b+squeda dentro de la B*.
4enemos a nuestra disposici!n dos tipos de b+squeda, b+squeda por clave / b+squeda por
cercana, en el caso de la b+squeda por clave, se busca un valor e'acto, por e)emplo, podramos
buscar el valor ERuanF dentro del campo ;(2B@E. En el caso de la b+squeda cercana, podemos
buscar podemos encontrar al registro que mas se parezca al buscado, por e)emplo, si buscamos
EPereiraF en el campo :PE&&6*( ,/ no .a/ ning+n Pereira en la B* es posible que nos muestre en
cambio al primer FPerezF de la B*. Cabe destacar que una b+squeda cercana siempre encuentra
algo, en el caso de la b+squeda por clave debemos considerar la posibilidad de que el registro no
e'ista.
En ambos casos debemos EprepararF a la B* para poder realizar nuestra b+squeda. &os
pasos a seguir son1
1. 5etear la B* en modo b+squeda, para ello utilizamos el m3todo 5et?e/(9
8. 6ndicar que valor debemos buscar / en que campo, lo e'plicar3 con un e)emplo1
"a,le1->#ields:5<->9s.tring 3 LcarlosJ$
Estamos indicando que debemos buscaremos el contenido carlos en el campo C, es
decir, el primero. *ebemos tener en cuenta que la B* debe estar inde'ada a traves del
campo por el que realizamos la b+squeda, es decir, si deseamos buscar por otro campo
deberemos antes cambiar el ndice activo.
>. @ealizar la b+squeda, /a sea por clave o por cercana, en el caso de b+squeda por
cercana debemos utilizar el evento Woto;earest(9
En el caso de b+squeda por clave utilizamos el m3todo Woto?e/(9
En este +ltimo caso debemos considerar la posibilidad de que el registro no e'ista,
en cu/o caso Woto?e/ devuelve false (no sucede ning+n error, / no se cambia de
registro actual en la B*
E*emplo 1
\ueremos buscar el apellido ms parecido a Perez (supongamos que el campo :PE&&6*( es el
primero1
"a,le1->.etMeH()$
"a,le1->#ields:5<->9s.tring 3 LNere1J$
"a,le1->OotoFearest()$
E*emplo 2
\ueremos buscar al socio U$BDK%, de no encontrarlo, informarlo (supongamos que el campo
;5(C6( es el tercero1
"a,le1->.etMeH()$
"a,le1->#ields:8<->9s.tring 3 LPQ8>;4J$
i!(R"a,le1->OotoMeH()) .ho(/essage(L@l registro no se encuentraJ)$
E*eriio 1: 2odifica el e)ercicio B del captulo O permitiendo ordenar los datos por todos los
campos
:grega la posibilidad de buscar una persona ,en el caso de buscarla por nombre, b+squeda por
clave, en el caso de buscarla por direcci!n, b+squeda cercana.
E*eriio 2: 2odifica el e)ercicio D del captulo O agregando el campo *;6.
:grega la posibilidad de importar [ e'portar la .istoria clnica a arc.ivos de te'to (utiliza men+s
desplegables.
:grega la posibilidad de buscar un paciente por apellido a medida que se ingresa cada letra del
mismo.
:grega la posibilidad de buscar un paciente por su *;6
BK
=ndice
Programaci!n visual............................................................................................................................>
Capitulo > 1 6ntroducci!n / entorno de traba)o................................................................................>
Caractersticas del compilador1....................................................................................................B
Barra de 0erramientas1................................................................................................................D
El esquema de la ventana1............................................................................................................D
El 6nspector de (b)etos1...............................................................................................................D
Capitulo B1<entana Principal, Botones, Cuadros de Edici!n..........................................................K
Creaci!n de un nuevo pro/ecto1..................................................................................................K
Propiedades de los ob)etos visuales1............................................................................................%
(b)eto Aorm.................................................................................................................................O
(b)eto Button1.............................................................................................................................O
(b)eto Edit1..................................................................................................................................Q
(b)eto &abel1...............................................................................................................................$
Capitulo D1(b)eto 2emo, arc.ivos de te'to..................................................................................>C
(b)eto 2emo1............................................................................................................................>C
&a Clase 45tring1.......................................................................................................................>C
E)ercicios1..................................................................................................................................>>
Capitulo K1Cuadros de dialogo / ob)etos no visuales...................................................................>D
Cuadros de *ialogo1..................................................................................................................>D
(b)eto 5ave*ialog1....................................................................................................................>K
(b)eto Color*ialog1..................................................................................................................>K
(b)eto Aont*ialog1....................................................................................................................>%
(b)eto 2ain2enu1.....................................................................................................................>%
(b)eto Pop7p2enu1..................................................................................................................>%
Captulo %1 Cuadros de dilogo personalizados / ventanas m+ltiples...........................................>O
<entanas no modales1................................................................................................................>O
<entanas 2odales1.....................................................................................................................>Q
Capitulo O1 Bases de *atos............................................................................................................BC
Creaci!n de una nueva B*1.......................................................................................................BC
(b)eto 4able...............................................................................................................................B>
(b)eto *ata5ource.....................................................................................................................B>
(b)eto *BEdit...........................................................................................................................B>
23todos de 4able (algunos de ellos, derivados de otras clases antecesoras...........................................BB
(b)eto *B;avigator1.................................................................................................................BD
Capitulo Q1 Bases de *atos ordenadas...........................................................................................BD
Propiedades de 4able1................................................................................................................BD
Sndice.............................................................................................................................................B%
B%
Programai&n
2isual en
-orland ) HH
-uilder
BU[CQ[BCCK
BO

You might also like