Sunteți pe pagina 1din 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 versin Windows 95 o superior), otras versiones del mismo compilador nos permitirn compilar nuestro programa para entornos grficos de Linux sin tocar una sola lnea de cdigo. Para comenzar debemos saber como pensar los programas de aqu en mas. Comenzaremos a utilizar la Programacin Orientada a Objetos (P.O.O.). Pensemos en una ventana clsica de Windows. Dentro de la venta tendremos botones, cuadros de edicin, etiquetas, barras de desplazamiento, un men principal, etc. Cada una de estas "cosas" son objetos (incluso la ventana misma es un objeto). El concepto de objeto lo iremos aclarando en el transcurso del ao, pero por ahora ser suficiente con el concepto intuitivo que tienes de lo que es un objeto. Cualquier "cosa" que yo quiera agregar en mi programa es un objeto. Hay tres aspectos importantes que nos interesaran sobre los objetos: Propiedades Eventos Mtodos 1) Propiedades: Como su nombre lo indica, son las caractersticas de los objetos (Tamao, posicin etc.). Si el objeto fuese una estructura, las propiedades serian los campos de la estructura. De hecho, utilizaremos las propiedades como campos de una estructura, ya que veremos que tienen tipos (Int, Char, String, etc.) 2) Eventos: Un evento es un mensaje que el objeto enva al programa de que "algo" a sucedido. Si hacemos click sobre un objeto, eso es un evento, si cambiamos el tamao de un objeto (por ejemplo la ventana) es un evento si modificamos el texto de un cuadro de edicin hay un evento, si tocamos una tecla, hay un evento. De ahora en adelante, en lugar de pensar el programa como un solo bloque, lo pensaremos como pequeos bloques de programa que se ejecutaran cuando suceda un determinado evento. Por ejemplo, si quiero que al tocar un botn aparezca un mensaje, en el evento OnClick del botn escribo una lnea de cdigo que diga: ShowMessage("Hola, que tal"); (Evidentemente ShowMessage muestra un mensaje, pero esto lo veremos en despus con mayor detalle). 3) Mtodos: Los Objetos son de una determinada clase. Podramos decir que una clase (class) es una estructura mejorada. Mas exactamente, es una estructura que adems de tener campos, tiene funciones relacionadas a ella. Estas funciones se llaman Mtodos. A veces es comn confundir las propiedades con los mtodos, sin embargo son cosas totalmente diferentes. Una propiedad es una cualidad que esta expresada con algn tipo de dato (enteros, caracteres, etc.). Un mtodo en cambio es una accin que puede realizar el objeto. Por ejemplo la ventana tiene el mtodo Close() que obviamente cierra la ventana. Entonces: Las propiedades son datos a los cuales podemos acceder en tiempo de ejecucin y (algunas) en tiempo de edicin. Por ejemplo el ancho de una ventana lo definimos cuando estamos editando nuestra aplicacin, pero lo podemos cambiar en tiempo de ejecucin. Los eventos son sucesos. Nosotros programaremos los bloques de programacin (tambin llamados cpsulas) dentro de los eventos que nos interesen. Los mtodos son acciones que nosotros invocamos en tiempo de ejecucin. Debemos tomar algunos recaudos antes de comenzar a programar. Pensemos en un programa de Windows, muchas veces los programas tiene mas de una ventana (ventanas de configuracin, cuadros de dialogo, etc.) A cada Ventana le corresponderan dos archivos (un *.CPP y un *.H) a su vez, existe un archivo que rene a todas las ventanas en un mismo proyecto (en nuestra versin es 1

un archivo *.MAK, en versiones posteriores, *.BPR). Adems de estos archivos, el compilador creara nuevos archivos de recursos, archivos temporales, etc. Importante: Nuestro programa (de ahora en adelante ser un proyecto) esta formados por muchos archivos. Es por eso que antes de escribir un sola lnea de cdigo, lo que haremos ser guardar el proyecto en una carpeta nueva a la que le pondremos un nombre conveniente, recin entonces comenzaremos a escribir nuestro programa (acordate, siempre grabaremos y abriremos proyectos). Cuando queramos salvar nuestro trabajo utilizaremos la opcin save all que guardar todos los archivos de nuestro proyecto. Si tomamos esta medida de seguridad nos ahorraremos problemas. Cabe aclarar que el compilador genera algunos archivo temporales que agilizan el proceso de compilacin pero que son grandes (varios mega) por lo que es muy incomodo de trasladarlos en disquetes. Estos archivos no son necesarios, y podemos borrarlos pues el compilador los generara automticamente en la prxima compilacin, los archivos que debemos guardar (y los que debemos a copiar a un disquete en caso de querer trasladar un proyecto de un lado a otro) son: *.MAK *.CPP *.RES *.H *.HPP *.RC *.DEF *.DFM

Caractersticas del compilador:


Al abrir el compilador nos encontramos (en principio) con tres ventanas: Estas ventanas son: Barra de herramientas

Inspector de objetos

Esquema de la ventana

Barra de Herramientas:
Aqu encontramos las opciones del compilador, (Opciones de archivos, de edicin, configuracin, etc.), as como tambin lo controles de compilacin (ejecutar, compilar, detener etc.), y lo mas novedoso para nosotros, la barra de componentes. La barra de componentes es una pagina de pestaas en donde estn clasificados los distintos componentes (objetos) que podremos colocar en nuestra aplicacin. Por ejemplo, si queremos poner un botn, seleccionamos de la pestaa Standar el objeto con forma de botn (que dice Ok) y lo arrastramos a la Ventana Esquema en el lugar de la ventana que deseamos colocarlo (como si se tratase del PaintBrush).

El esquema de la ventana:
Es el aspecto (aproximado) que tendr la ventana de nuestro proyecto al comenzar su ejecucin (si nuestro proyecto tuviese mas de una ventana habr ms de un esquema, por supuesto podremos cerrar las ventanas que no estemos modificando). Este aspecto podra cambiar en tiempo de ejecucin por ejemplo por redimensionamientos de la ventana. Los puntos que vemos dibujados tienen la funcin de grilla (o imn) para facilitar la colocacin de los objetos, esta grilla puede desactivarse, o modificarse, pero en general nos ayuda muchsimo. De todo modos esos puntos no se vern en la aplicacin terminada. Es en esta ventana donde colocaremos los objetos desde la barra de componentes. Si ocultramos accidentalmente esta ventana, reaparecer al pulsar F10 .

El Inspector de Objetos:
Es una ventana con dos pestaas, Properties (Propiedades) y Events (eventos). En estas pestaas figuran las propiedades y los eventos de los objetos que tenemos en nuestra aplicacin. Es importante que sepas que los valores que le asignamos a las propiedades los podremos modificar luego en tiempo de ejecucin. Si ocultramos accidentalmente esta ventana, reaparecer al pulsar F11. En un principio puede resultarte incomodo el hecho de que estas ventanas estn "flotando" en el escritorio, ya que estamos acostumbrados a programas que tienen una ventana madre y que contiene todas las ventanas de la aplicacin (Word, Excel, etc.) Sin embargo no tardaras en acostumbrarte a este entorno de trabajo. Antes de terminar con este capitulo debemos tener en cuenta algo: Cuando programbamos en Pascal o en C, estbamos dentro de una aplicacin (el compilador). Al probar nuestro programa el compilador quedaba en segundo plano mientras nuestro programa se ejecutaba, y al terminar volvamos automticamente al compilador. Ahora en cambio nos encontramos en un entorno Windows, que es multitarea, es decir, puede ejecutar 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 explcitamente (como todo los programas de Windows). Debemos tener cuidado de cerrar el programa en ejecucin y no el compilador. Este es un error es muy comn, ya que la ventana esquema del compilador es muy parecida a la aplicacin en uso, de hecho, solo se diferencia por los puntos de la grilla. Si nosotros no cerramos la aplicacin en prueba, podremos pasar el control al compilador y seguir programando tranquilamente, pero no nos permitir recompilar el proyecto hasta que la aplicacin no este cerrada.

Capitulo 2:Ventana Principal, Botones, Cuadros de Edicin.


Creacin de un nuevo proyecto:
Estamos en condiciones de crear nuestra primera aplicacin, para ello, lo primero que haremos es guardar el proyecto como se explico en el capitulo 1. Si en estas condiciones, y sin tocar absolutamente compilamos (presionamos F9 o hacemos click en el botn de Play) el programa realizara las tareas necesarias y luego aparecer nuestra aplicacin, que no es otra cosa que una ventana completamente vaca. Sin embargo podremos ver que esta ventana es funcional, es decir, podemos moverla, maximizarla, minimizarla, y por supuesto cerrarla. Esto significa que los objetos que nosotros colocamos en la aplicacin no necesitamos "programarlos" solo necesitamos indicar que deseamos hacer con ellos. Podemos ahora realizar nuestro primer programa, el clsico mensaje de bienvenida. Ejemplo: Realizaremos un programa que muestre una ventana con un botn, al presionar el botn aparecer un mensaje que diga: Felicitaciones, ha realizado su primer programa Para ello colocaremos en la ventana esquema un botn, este objeto se encuentra en la barra de componentes en la pestaa Standar (El objeto con forma de botn que dice Ok). Ahora iremos al Inspector de Objetos, donde figuran las propiedades del botn que acabamos de crear. Atencin, en el inspector de objetos figuran dos posibles objetos, la ventana (Form1) y el botn (Button1). No olvidemos, la ventana es tambin un objeto. Seleccionamos el objeto Button1 (nuestro botn) y hacemos click sobre la pestaa Events. Aqu vemos una lista de los posibles eventos que puede considerar nuestro objeto, en nuestro caso, el evento que nos interesa es OnClick, as que hacemos doble click sobre este evento. Al hacer esto se abre una ventana con texto, el cursor esta ubicado entre dos llaves, que encierran la funcin (o cpsula) que debe ejecutarse cuando suceda el evento click del botn. Ms arriba estn las llamadas a libreras graficas y otras declaraciones que nosotros no debemos tocar. Esta ventana de texto es el cdigo de nuestro programa, si pensabas que en la programacin visual no haba que escribir cdigo te equivocabas. En esta ventana de texto escribiremos el cdigo que se guardar como un archivo de texto *.CPP. Pero volvamos al cursor que est entre llaves. Dentro de estas llaves nosotros escribiremos el cdigo que queramos, cdigo que, en general ya conoces : (for, while, do-while, if, switch, etc.) con la salvedad de que algunas funciones que utilizbamos en la programacin en modo texto ya no tienen sentido (como por ejemplo printf, scanf, gotoxy, etc.), debemos entonces aprender otras funciones pero esto no va presentarte mayores problemas. Nosotros queremos que al presionar el botn aparezca un mensaje. No necesitamos escribir algo como: if (boton = = pulsado) {......................} Esto no es necesario ya que lo que escribamos aqu se ejecutar cuando suceda el evento click del botn, as que solamente escribiremos lo que deseamos hacer cuando el botn se pulse. Deseamos que aparezca un mensaje, una funcin para mostrar mensajes es ShowMessage. Luego veremos que existen otras ms complejas que nos brindan mayores opciones, ShowMessage es la ms simple de todas, lo que hace es mostrar un mensaje en un cuadro de dialogo (sin ningn icono) y un botn de Ok que cierra el cuadro de dialogo. Escribiremos entonces entre las llaves: ShowMessage("Felicitaciones, ha realizado su primer programa"); De esta manera el programa completo debera haber quedado:
//--------------------------------------------------------------------------#include <vcl.h> #pragma hdrstop #include "Unit1.h" //--------------------------------------------------------------------------#pragma package(smart_init) #pragma resource "*.dfm" TForm1 *Form1; //--------------------------------------------------------------------------__fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { } //--------------------------------------------------------------------------void __fastcall TForm1::Button1Click(TObject *Sender) { ShowMessage("Felicitaciones, ha realizado su primer programa"); }

Recuerda, la primer parte del cdigo, est generada por el compilador y no ser necesario (ni recomendable) cambiarla. Solo nos interesa lo que ponemos dentro de las cpsulas de los eventos, en nuestro caso: ShowMessage("Felicitaciones, ha realizado su primer programa"); Compila el programa y prubalo. Analicemos ahora la primer funcin que has aprendido, la funcin ShowMessage, seguramente intuirs que esta funcin, pide como parmetro de entrada un string, y no devuelve nada. En realidad no pide un string, sino un nuevo tipo de dato llamado AnsiString, que por el momento te dir que es un string mejorado, luego aprenderemos ms sobre los AnsiString. Lo que est escrito entre las llaves del evento OnClick es algo parecido a una funciones, es importante que sepas que las variables que declares en este punto se crearan al sealarse el evento y se destruyen al llegar a la llave de cierre. Son variables locales de esta cpsula. Con este programa sencillo podremos analizar algunas caractersticas de los objetos. Dentro de la programacin orientada a objetos, uno de los conceptos principales es el concepto de herencia. Pongamos un ejemplo de la vida real. Supongamos que definimos el conjunto vehculos terrestres. Los vehculos tendrn la propiedad Cantidad de Ruedas, que ser de tipo entero (2 ruedas, 4 ruedas, etc.) . Luego podramos decir que dentro de los vehculos terrestres definimos el conjunto de motos y de automviles. El conjunto de automviles tendr la propiedad Cantidad de Puertas (2, 4, 5). Es evidente que el conjunto de motos no tendr esa propiedad, pero sin embargo, entre las motos y los autos habr muchas propiedades en comn (potencia del motor, velocidad mxima, etc.) En programacin sucede lo mismo, lo cual significa que los objetos tendrn muchas propiedades en comn (por suerte) con lo cual aprenderemos para que sirven algunas propiedades genricas y luego veremos algunas propiedades que son nicas de un determinado objeto. Por ejemplo, todos los objetos visuales derivan de una clase genrica llamada Trect (Rectngulo). Esto significa que todos los objetos visuales tendrn la propiedad Top (distancia a la parte superior de la ventana medida en pixeles) Left (distancia a la parte izquierda de la ventana medida en pixeles) Height (altura del objeto medida en pixeles) y Width (ancho del objeto medido en pixeles). Veamos en el inspector de objetos algunas propiedades comunes a los objetos visuales, puedes analizar entonces tanto las de la ventana (Form1) como las del botn (Button1). Las propiedades aparecen en el inspector de objetos en orden alfabtico:

Propiedades de los objetos visuales:


Caption: Es una propiedad de tipo AnsiString, es el ttulo del objeto, en el caso de la ventana, el titulo que aparece arriba, en el caso del botn, el texto que aparece dentro del mismo. El Caption de un objeto es informativo para el usuario, debe ser claro, puede contener nmeros, espacios, smbolos, etc. Caption inclusive podra estar vaca. Muchos objetos pueden tener el mismo Caption (en una aplicacin hay muchos botones que dicen Aceptar). Si deseamos que un objeto (por ejemplo un botn) tenga una tecla rpida, antepondremos un & a esa letra, por ejemplo si tenemos un botn que dice Aceptar y otro que dice Archivo, y los Caption de ellos son respectivamente &Aceptar, y A&rchivo entonces veremos Subrayada la letra A en Aceptar y la letra r en Archivo. Pulsar la A equivaldr a pulsar Aceptar, pulsar la r equivaldr a pulsar Archivo. Cursor: Propiedad de tipo Enum Es la forma que toma el puntero del mouse al pasar por encima del objeto. Enabled: Propiedad de tipo booleana, puede valer true o false. Indica si el objeto esta habilitado o no. Un objeto deshabilitado aparece con su texto en relieve, y no es posible clickear sobre el. Font: Es una propiedad de tipo Tfont (una clase que guarda la fuente, el tamao, y el estilo). Indica que fuente debe utilizarse en el Caption y en el texto (si el objeto lo tuviese). Height: Propiedad de tipo int. Altura del objeto medida en pixeles. Hint: Propiedad AnsiString, es el mensaje aclaratorio que deseamos que aparezca si el mouse se detiene sobre el objeto. Left: Propiedad de tipo int. Distancia del objeto medida en pixeles al borde izquierdo de la ventana madre. Name: Esta propiedad es muy importante, es el nombre interno del objeto, es decir, el nombre con el cual el programador (es decir nosotros) identificaremos al objeto, no tiene nada que ver con el Caption. Cuando programbamos en modo texto las variables tenan un nombre (A, B, C, CONT, PROM, etc.) sin embargo este nombre no tena ninguna importancia para el usuario. Este es el mismo caso, Name es el nombre del objeto. Dos objetos no pueden tener el mismo nombre. Los nombres pueden contener, letras, nmeros y el smbolo guin bajo _ pero el nombre de un objeto no puede comenzar con un nmero, es decir, un objeto puede llamarse Boton1, pero no puede 5

llamarse 1Boton. Tambin sera un nombre vlido Boton_Aceptar. Los nombres no pueden contener espacios en blanco u otros smbolos que no sean el guin bajo. Cuando el compilador crea un objeto, por defecto le pone el nombre del tipo de objeto seguido de un nmero, por ejemplo si creamos 3 botones se llamarn, Button1, Button2, Button3. Es muy recomendable ponerles un nombre mas especfico que nos de una idea que hace el objeto. Sin embargo es importante que, si pensamos cambiarle el nombre al objeto lo hagamos ni bien lo creamos, ya que si lo cambiamos luego, el programa no actualizar las referencias. Por ejemplo, si nosotros en el programa del ejemplo cambiamos el nombre de Button1 por el de B_Aceptar, el compilador nos dar error, ya que el evento hace referencia a:
..void __fastcall TForm1::Button1Click(TObject *Sender).

Es decir que si cambiamos el nombre de un objeto, deberemos cambiar las referencias a eventos que tienen el nombre anterior. En resumen, cambiemos el nombre del objeto ni bien lo creamos o no lo cambiemos ms. Top: Propiedad de tipo int. Distancia del objeto a la parte superior de a ventana madre. Visible: Propiedad de tipo booleana, puede valer true o false. Indica si el objeto es visible en pantalla o no. Width: Propiedad de tipo int. Ancho del objeto medido en pixeles. Cuando analicemos nuevos objetos nos centraremos nicamente en las propiedades, mtodos y eventos que revistan mayor inters en ellos. Pero en la mayora de los casos tendrn propiedades comunes a todos ellos (los citados arriba corresponden a los objetos visuales).

Objeto Form
Es una ventana, nuestro programa deber tener al menos una ventana. Propiedades: Por el momento las ventanas no tienen propiedades exclusivas que nos interesen (por ahora) Eventos: Podemos tratar diversos eventos en ella (OnClick por ejemplo) los nombres de sus eventos hacen evidentes su llamada. Mtodos: Por el momento el nico mtodo que nos podra interesar es el mtodo Close() que obviamente cierra la ventana (si es la ventana principal cierra la aplicacin)

Objeto Button:
Es el botn simple de mandato: Sus propiedades y sus mtodos no presentan mayor importancia, as como sus eventos (Salvo OnClick). Se usa generalmente para realizar una accin cuando sucede el evento OnClick. Cmo accedemos a las propiedades de un objeto en tipo de ejecucin? Para acceder a la propiedad de un Objeto debemos primero hacer referencia al objeto (por su nombre) y luego la propiedad, separada del objeto por una flecha, que se escribe con un signo menos - y un signo mayor >. Entonces, si quisisemos cambiar el ancho de Button1 para que valga 150, debemos escribir: Button->Width = 150; Si quisisemos incrementar en 20 el alto de Form1 deberamos escribir: Form1->Height = Form1->Height + 20; Atencin con las maysculas y las minsculas, recuerda que Builder es sensible a ellas.

Ya estas en condiciones de realizar algunos ejercicios sencillos. Ejercicio 1: Realiza una aplicacin con dos botones. Al pulsar el primero mostrar un mensaje de bienvenida. Al pulsar sobre el segundo, borra el ttulo de la ventana. Ejercicio 2: Realiza una aplicacin con cuatro botones, uno para aumentar el ancho de la ventana, otro para aumentar su altura, otro para disminuir su altura y el ultimo para disminuir su ancho. Ejercicio 3: Realiza una aplicacin con dos botones. Al pulsar sobre uno de ellos se habilita o deshabilita el otro botn, al pulsar sobre el otro, borrar los ttulos de los dos botones. Ejercicio 4: Realiza una aplicacin con un botn. Al pulsarlo ocultarlo de la ventana (propiedad Visible) para volver a verlo pulsar sobre la ventana.

Objeto Edit:
Veamos un nuevo objeto, el cuadro de edicin simple. Es el objeto que se encuentra en la pestaa Standar y que tiene forma de cuadro con las letras ab dentro de el. Los cuadros de edicin se utilizan generalmente para ingresar una lnea de texto dentro de ellos (Ingresar nombres por ejemplo). Propiedades: Las propiedades importantes del objeto Edit son: Text: Propiedad de tipo AnsiString, es el contenido del cuadro de edicin, aqu queda guardado el texto que figura en el. Por defecto esta propiedad contiene el nombre del cuadro de edicin (si es el primero Edit1) en general es preferible que esta propiedad arranque vaca. MaxLength: Propiedad de tipo entero. Indica la cantidad mxima de caracteres que se puede ingresar en el. PaswordChar: Propiedad de tipo char. Si deseamos que al ingresar un texto no se vea (por ejemplo para ingresar una clave) y que en su lugar aparezca un carcter determinado (por ejemplo *) colocamos en esta propiedad el carcter que deseamos. Por defecto esta propiedad contiene el carcter nulo, lo que significa que el texto se visualiza normalmente. ReadOnly: Propiedad de tipo booleana, puede valer verdadero o falso. Indica si el cuadro es o no de solo lectura, en caso de serlo no se podr modificar su texto desde la interfase visual. Eventos: Uno de los eventos ms utilizados en los Edit es el evento OnChange, que informa cuando el texto del Edit cambie (es decir, cuando se pulsa cualquier tecla que modifique su contenido), recuerda que el texto cambia en forma inmediata, es decir, no es necesario presionar ENTER para que el evento acte. Antes de realizar ejercicios utilizando cuadros edicin deberemos aclarar que son los famosos AnsiString. Los AnsiString son una clase, es decir, una estructura mejorada, mejorada porque tiene Mtodos propios. Entre otras cosas, los AnsiString toman el tamao necesario para contener el texto (son verdaderamente mas cmodos que los String) tambin tienen mtodos para convertir los AnsiString en los tipos ya conocidos (int, float, string). Adems de mtodos para insertar, borrar, encontrar cadenas dentro de ellos etc. Nosotros veremos solo algunas cualidades de la clase AnsiString. Es importante que comprendas que AnsiString es una clase, esto es un tipo de dato. Nosotros podremos entonces declarar variables de este tipo, lo haremos de la forma habitual, primero el tipo y luego la o las variables. Ejemplo: AnsiString cadena1, cadena2; Declaramos dos variables de tipo AnsiString, cadena1 y cadena2. Bien, todo lo que a continuacin veamos sobre AnsiString es aplicable a cualquier dato de este tipo. Por ejemplo la propiedad Caption es AnsiString, por lo que es factible aplicarle cualquier mtodo que describamos a continuacin.

Los AnsiString pueden ser igualados a cualquier tipo, la conversin es automtica. Ejemplo: AnsiString cadena; int j=10; char k[14]="hola que tal"; cadena=j; ShowMessage(cadena); cadena=k; ShowMessage(cadena); Esto mostrar dos cuadros de dialogo sucesivos, el primero mostrar un numero 10 (lo mostrar como texto, es decir, el carcter 1 y el carcter 0) luego, el segundo mostrar un mensaje que dir hola que tal. Como vers, a una variable AnsiString se le puede asignar una variable o una variable char sin problema, tambin se le pueden asignar variable float, pero en este caso habr que especificar el formato (cantidad de cifras, separador decimal, etc.) Adems se pueden efectuar operaciones de suma ente varios tipos, interpretndolo siempre como una concatenacin de textos. Ejemplo: AnsiString cadena; int j=15; char k[32]=" aos de servicio en la empresa"; cadena="El seor Juan tiene"; cadena=cadena + j + k; ShowMessage(cadena); Esto muestra un mensaje que dice El seor Juan tiene 15 aos de servicio en la empresa Como vemos a cadena se le asigna la suma de un AnsiString, un int y un string. La suma, fue interpretada como una concatenacin de texto. Importante: Por el modo en que se realiza la conversacin es imprescindible que el primer sumando sea de tipo AnsiString. Los AnsiString pueden ser comparados unos con otros utilizndose en este caso el orden alfabtico (como la hacamos con los string de Pascal) Ahora veremos algunos mtodos de la clase AnsiString. Los mtodos se separan de la clase por un punto. LowerCase: No tiene parmetros de entrada, devuelve un AnsiString, que es el AnsiString propietario convertido a minscula. Ej: Form1->Caption= Form1->Caption.LowerCase(); UpperCase: dem LowerCase pero convierte a mayscula. Length: No tiene parmetros de entrada, devuelve un entero, el tamao del AnsiString. int j; j=Edit1->Text.Length(); j tomar el valor correspondiente a la cantidad de caracteres que tenga Edit1->Text. ToIntDef: Pide un entero, y devuelve un entero. ToIntDef convierte un AnsiString en entero, (es el valor que devuelve), en caso que el AnsiString no contenga un entero, entonces devuelve el valor pasado como parmetro. Ej: int j; j=Edit1->Text.ToIntDef(-3); Ej:

Si Edit1->Text no contiene un entero (es decir, cualquier cosa que no sea un nmero) entonces j tomar el valor 3. Ejercicio 5: Realiza una aplicacin con un botn y un Edit, al pulsar el botn, mostrar con ShowMessage el contenido del Edit.

Ejercicio 6: Realiza una aplicacin con un botn, al pulsarlo mostrar un mensaje que indique cuanta veces se puls el botn (necesitars una variable global de tipo int). Ejercicio 7: Realiza una aplicacin con dos edit y un botn. Un Edit para ingresar nombre y el otro para ingresar edad. Al pulsar el botn, mostrar un mensaje que diga por ejemplo: El seor Juan Perez es mayor de edad con 24 aos. O bien Juan Perez tiene 15 aos y le faltan 3 para ser mayor de edad. En caso de no haber ingresado un entero en la edad mostrar un mensaje de error. Ejercicio 8: Idem al anterior pero si la edad no es un entero valido (positivo) y si el nombre esta vaco mantener el botn deshabilitado. Ejercicio 9: Realiza una aplicacin con un Edit y un botn, en el Edit se debe ingresar un nmero entre 1 y 10 (caso contrario el botn permanece deshabilitado). Al presionar el botn mostrar tantos mensajes como diga el Edit: Mensaje N 1, Mensaje N 2, etc. Ejercicio 10: Realiza una aplicacin con un Edit y un botn. Mientras el Edit este vaco, mantener el botn deshabilitado. Al pulsar el botn, cambiar el ttulo de la ventana con el contenido del Edit. Ejercicio 11: Utilizando un Edit y un botn, realiza el juego del ahorcado, (el algoritmo es casi el mismo que usaste en programacin en modo texto con algunas modificaciones). Es probable que para la realizacin de estos ejercicios te resulte conveniente utilizar el objeto Label.

Objeto Label:
Label es simplemente una etiqueta, sus propiedades de inters son Caption (lo que dice la etiqueta) y Font (fuente de la etiqueta). Es factible tratar eventos sobre la etiqueta (OnClick por ejemplo) aunque en la prctica el objeto Label se usa como una etiqueta puramente aclaratoria.

Capitulo 3:Objeto Memo, archivos de texto


Veremos continuacin el objeto Memo. Antes aclararemos algunos puntos. Los objetos son clases (que como lo habamos mencionado, son estructuras mejoradas con mtodos y eventos). Las propiedades de los objetos pueden ser clases que tienen mtodos y eventos propios. Esto que en principio puede parecernos complicado, en realidad facilita muchsimo las cosas. Por ejemplo, muchos objetos visuales tienen la propiedad Color. La propiedad color es una clase (class) llamada TColor, la clase TColor tiene a su vez sus propiedades, pero lo importante, es que una vez que conocemos las propiedades de TColor, las podremos aplicar a cualquier objeto que tenga la propiedad Color, es mas, podremos hacer que un objeto tome el color de otro con una simple igualacin, pues las propiedades Color de ambos objetos son del mismo tipo (TColor). Para facilitar las cosas los tipos de clase estn dados anteponiendo una T mayscula al nombre del objeto definido (los Button son de la clase TButton, los Form son de la clase TForm, etc.)

Objeto Memo:
Es un objeto que tiene la capacidad de contener texto plano (esto es sin formato, es decir, sin cambios en la fuentes, colores etc. Contiene solamente texto, cambios de lnea y tabulaciones. Para que te ubiques, el Bloc de Notas tiene un objeto Memo que ocupa toda la ventana principal. (No lo confundas con el WordPad, que puede contener distintos tipos de fuentes). El objeto Memo se encuentra en la pestaa Standar y tiene forma de hoja. Sus propiedades importantes son: Color: de tipo TColor (comn a muchos objetos visuales) hace referencia al color del fondo memo. Font: Se refiere a la fuente con la cual visualizaremos el texto. Si bien el texto no contiene informacin acerca de fuentes y colores, todos los textos de Windows utilizan una determinada fuente. Esa fuente la especificamos con esta propiedad, pero el texto no guardara informacin sobre la fuente usada, se trata simplemente de la fuente con la cual deseamos ver el texto en este momento. ScrollBars: de tipo Enum, se refiere a si el objeto tendr o no barras de desplazamiento en sus bordes, puede tomar los siguientes valores: ssNone : ninguna barra de desplazamiento ssHorizontal: barra de desplazamiento horizontal ssVertical: barra de desplazamiento vertical ssBoth: ambas barras de desplazamiento. Lines: de tipo TString, esto es una lista AnsiString. Es la propiedad que ms nos interesa, ya que es la propiedad donde esta guardado el texto del Memo. TString es una clase, y es como se dijo una lista de AnsiString, a continuacin te dar algunas propiedades y mtodos de la clase TString, que ser aplicable a todos los objetos de tipo TString (en particular a la propiedad Lines de los Memos)

La Clase TString:
Propiedades: Count: Indica la cantidad de AnsiString que contiene el objeto TString Strings[int indice]: es una propiedad de tipo AnsiString, y se refiere al AnsiString que esta en la posicin dada por el indice. Por ejemplo: AnsiString aux; aux = Memo1->Lines->Strings[3]; este pequeo cdigo copia el tercer rengln del memo en la variable aux (nota que el indice en este caso arranca de 1)

10

Mtodos: Append (AnsiString S): Agrega el AnsiString S al final de la lista. Clear(): Borra toda la lista. Delete(int indice): borra el rengln dado por ndice (todo el texto se desplaza hacia arriba). Insert(int indice, AnsiString S) Inserta el AnsiString S en el rengln indice. Move(int actual, int nuevo): mueve el renglon actual al renglon nuevo. LoadFromFile(AnsiString nombre_archivo): Carga un texto desde archivo dado por nombre_archivo SaveToFile(AnsiString nombre_archivo): Graba el texto a un archivo dado por nombre_archivo. Con todo esto ya estamos en condiciones de realizar algunos programas:

Ejercicios:
Ejercicio 1: Realiza un programa que permita cargar y guardar un texto. Puedes especificar el nombre del archivo en un Edit. Ejercicio 2: Idem anterior pero con botones para borrar el contenido del memo, y para informar mediante un mensaje la cantidad de renglones que contiene el Memo. Ejercicio 3: Idem anterior pero con un botn que nos permita contar la cantidad de veces que aparece una letra determinada (ingresada en un cuadro de edicin). Ejercicio 4: Modifica el programa del ahorcado para que en lugar de ingresar la palabra clave, la mquina la elija al azar desde un archivo de texto que contiene una lista de ttulos de pelculas (el archivo te lo proporcionar el profesor). Puedes utilizar el objeto Shape (formas) manejando su propiedad visible. Ejercicio 5: Las pelculas ripeadas desde un DVD suelen tener un archivo de texto correspondiente a los subttulos. En este caso tenemos un archivo de subttulos en formato MicroDVD con extensin SUB. El archivo guarda la siguiente lgica: En cada rengln tenemos dos nmeros encerrados entre llaves y a continuacin un texto. El primer nmero corresponde a la escena en la cual aparecer el texto, el segundo corresponde a la escena en la cual desaparecer dicho texto. Ejemplo: {10748}{10812}Los das se estn volviendo oscuros. Suele suceder que un archivo de subttulos queda desfasado con la pelcula (pues se han omitido algunos segundos del comienzo). Lo que debes hacer es abrir este archivo de texto y crear otro de modo que todas las escenas deben incrementarse en 10. Inciso b) Idem al anterior, pero que permita incrementar (o decrementar) una cantidad variable de escenas. (El archivo original te lo proporcionar el profesor).

11

Antes de terminar este captulo veremos algunos componentes ms cuya implementacin es muy sencilla.

Objeto CheckBox:
Es una casilla de verificacin, que puede estar marcada o no. Se suele utilizar para manejar variables booleanas. Su propiedad ms importante es la propiedad Checked, que puede tomar los valores true o false, de acuerdo a si la casilla esta marcada o no.

Objeto RadioGroup:
Es un conjunto de casillas circulares. Se 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. Se puede configurar para que permita seleccin multiple, pero para este caso es preferible utilizar varias checkbox. Sus propiedades importantes son: Items: Es una propiedad de tipo Tstrings, donde cada AnsiString representa una opcin. Es factible entonces modificar los items en tiempo de ejecucin. Esto en general no se utiliza, sino que se asignan las opciones en tiempo de edicin. ItemIndex: Es una propiedad de tipo int, donde se representa el nmero de item que est seleccionado (0 es el primero) para que no haya ningn item selecionado, ItemIndex debe valer 1. Ejercicio 6: Realiza un programa con un memo que me permita abrir y guardar texto. Debe haber una casilla de verificacin,que me permita poner visible o invisible el memo. Ademas debe haber un radio group con las opcioes: Sin barra de deplazamiento. Solo barra horizontal Solo barra vertical Ambas barras Las cuales colocan las ScrollBar correspondientes en el memo.

12

Capitulo 4:Cuadros de dialogo y objetos no visuales


Como te habrs dado cuenta, ingresar los nombres de los archivos mediante cuadros de edicin es muy incmodo y adems da lugar a errores de tipo. Para acceder a los archivos podemos utilizar una herramienta especfica para tal fin.

Cuadros de Dialogo:
Pensemos en cualquier programa de Windows que acceda a archivos (Word, Excel, Corel Draw, etc.) Al querer acceder a los archivos se abre una ventana que nos permite movernos por el rbol de directorio, ver los archivos como lista, etc. Esta ventana es un cuadro de dialogo. Un cuadro de dialogo es una ventana que no puede ser redimencionada y puede ser tan compleja como queramos. De hecho, la ventana que aparece con ShowMessage es un cuadro de dialogo con un botn. Ahora bien, existen cuadros de dialogo predefinidos por Windows, por ejemplo, el cuadro de dialogo de abrir archivos es propio de Windows y es llamado por los programas. Nosotros podremos entonces pedirle a Windows que muestre alguno de sus cuadros de Dialogo predefinidos. Para ellos deberemos colocar el objeto cuadro de dialogo que necesitemos. Estos objetos estn en la ventana Dialogs. Aqu se incorpora un concepto nuevo, los objetos no visuales. Es decir, cumplen una determinada funcin pero no son visibles para el usuario. Los cuadros de dialogo son objetos no visuales, al ponerlos en nuestro proyecto se vern como un icono, pero ese icono no aparecer en nuestra aplicacin, 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.

Objeto OpenDialog:
Dentro de la pestaa Dialogs, es el objeto que tiene forma de carpeta. Su funcin es obtener el nombre de un archivo. Como todos los cuadros de dialogo es un objeto no visual. Mtodos: Execute(): es un mtodo que no pide ningn parmetro y devuelve un valor booleano. Es el mtodo ms importante del OpenDialog. Lo que hace es justamente mostrar (ejecutar) el cuadro de dialogo. All podremos entonces seleccionar cualquier archivo de nuestro sistema, nos permitir cambiar de carpeta, de unidades, crear una nueva carpeta, etc. Hay dos maneras de cerrar el cuadro de dialogo, seleccionando un archivo, o cancelando la operacin (ya sea con Cancelar o con el botn de cerrar la ventana). Si seleccionamos un archivo Execute() devolver TRUE, si cancelamos la operacin Execute devolver FALSE. Es importante que tengas en claro que el objeto OpenDialog no abre un archivo, lo nico que hace actualizar la propiedad FileName con el nombre del archivo seleccionado, o sea que la operacin de apertura de archivo corre cuenta del programador. Recuerda OpenDialog no abre un archivo, sino que nos permite seleccionar uno cmodamente. El mtodo Execute() deber ser llamado por el evento que corresponda cuando desees abrir un archivo (por ejemplo un botn de abrir). Propiedades: FileName: Propiedad de tipo AnsiString. Esta es la propiedad que contiene el nombre del archivo que se seleccion con el mtodo Execute(); y es la propiedad que nos interesar a la hora de abrir el archivo. Si el mtodo Execute() se cancelo (devolvi FALSE) esta propiedad no vara, por lo tanto contendr el mismo valor que antes. Debes tener cuidado de evaluar si el evento Execute() devuelve verdadero o falso para evitar errores. Ej: void __fastcall TForm1::Button1Click(TObject *Sender) { if (OpenDialog1->Execute()) Memo1->Lines->LoadFromFile(OpenDialog1->FileName); } Este cdigo carga el texto de un archivo en un Memo.

13

Title: Propiedad de tipo AnsiString. Aqu colocamos el ttulo que deseamos que tenga el cuadro de edicin. Si no se especifica nada, el ttulo ser Abrir. Filter: La propiedad filter permite visualizar determinados tipos de archivos (solo *.txt, solo *.pas. etc.) Haciendo doble click sobre la propiedad filter (Inspector de Objetos) se abre el filter editor, que nos presenta una tabla con dos columnas. En la columna de la derecha colocamos el nombre del filtro (que deseamos que aparezca en el cuadro de dialogo), en la columna de la izquierda, el filtro en s. Ej: Filter Name Filter Archivos de texto *.txt Archivos de C *.cpp Archivos de Pascal *.pas Todos los archivos *.* DefaultExt: Propiedad de tipo AnsiString. Si lo deseamos podemos indicar una extensin que se agrega automticamente si el usuario escribe el nombre de un archivo sin extensin. En general esta propiedad no se utiliza en el OpenDialog.

Objeto SaveDialog:
Como se aclar anteriormente, el objeto OpenDialog no abre un archivo sino que nos facilita la obtencin de su nombre. Por lo tanto sera factible utilizar el OpenDialog para obtener el nombre de un archivo que deseamos guardar. Esto (insisto) es totalmente factible, sin embargo, las leyendas el cuadro de OpenDialog, hace referencia a apertura de archivo, con lo cual podra dar lugar a equivocaciones usar este cuadro para guardar. Para guardar entonces se utiliza el cuadro de dialogo SaveDialog, que tiene las mismas propiedades que el anterior, y el evento Execute() que se comporeta de la misma manera. La diferencia es puramente esttica, ya que sus textos hacen referencia a Guardar en lugar de abrir. En este objeto cobra sentido la propiedad DefaultExt, ay que si el usuario no coloca ninguna extensin al archivo, SaveDialog colocar automticamente la extensin que figura en dicha propiedad. Por ejemplo si se trata de un programa que trabaja sobre texto plano sera lgico que su DefaultExt fuese TXT.

Objeto ColorDialog:
Al igual que los anteriores es un objeto no visual y se comporta de la misma forma. Se utiliza cada vez que deseamos seleccionar un color. El mtodo Execute se comporta igual que en los cuadros anteriores. Propiedad Color: Es un propiedad de tipo TColor. La clase TColor guarda informacin acerca de un color especfico, nos bastar con saber que podemos igualar dos variables (o propiedades) de tipo TColor. Recuerda que el objeto ColorDialog es un objeto no visual, por lo tanto su propiedad Color no hace referencia al color de dicho objeto, sino al color que fue seleccionado (en caso de que Execute devuelve TRUE) Ej: void __fastcall TForm1::Button1Click(TObject *Sender) { if(ColorDialog1->Execute()) Form1->Color=ColorDialog1->Color; } El pulsar un botn aparece un cuadro de seleccin de color, al elegir uno, la ventana toma dicho color.

14

Objeto FontDialog:
Es prcticamente igual al objeto ColorDialog, solo que en este caso la propiedad que nos interesa es Font, y que al igual que antes, no es la fuente del objeto (pues no es visual) sino la fuente seleccionada. Ejercicio 1: Modifica los ejercicios 3, 4, 5 y 6 del captulo anterior, reemplazando los cuadros de edicin por OpenDialog y SaveDialog respectivamente. Ejercicio 2: Realiza un programa que nos permita cargar y guardar un Memo, borrar su contenido, cambiar su fuente y su color.

Los cuadros de dialogo no son los nicos objetos no visuales. Por ahora veremos tambin los mens.

Objeto MainMenu:
Como se indic antes, es un objeto no visual. Lo encontramos en la pestaa Estndar. El MainMenu es el men principal de la aplicacin. Una ventana solo puede tener un MainMen, sin embargo es factible (aunque improbable) que deseemos cambiar de men en tiempo de ejecucin. Por lo tanto es posible colocar mas de un MainMenu en una aplicacin, aunque solo uno estar activado a la vez. El objeto Form tiene la propiedad Menu, en la cual se especifica cual de todos los MainMenu existentes es el que debe utilizarse. Cuando nosotros creamos el primer MainMenu (y en general el nico) esta propiedad se actualiza automticamente, as que en general no debes preocuparte por todo lo anterior. Para editar el MainMenu, debemos hacer doble click sobre dicho objeto, y veremos una tabla en la que colocaremos las diferentes opciones. En la primer fila se suelen poner los ttulos (Archivo, Editar, Opciones, Etc.) y a apartir de la segunda fila se colocan los distintos items. Si queremos que aparezca una lnea divisoria, debemos ingresar como Caption el carcter menos -. Si hacemos click derecho sobre un item, podemos (entre otras cosas) agregar en el un submenu, podemos adems guardar y cargar una plantilla (template) con el esqueleto de men que deseemos. Para acceder el evento que se llamar al clickear sobre el item del menu, lo nico que debemos hacer es doble click sobre dicho item. Cada item tiene un nombre, de este modo podemos acceder a las propiedades de cada item (por ejemplo la propiedad Enabled de cada item) Colocar un men a una aplicacin es algo verdaderamente sencillo, irs aprendiendo ms propiedadesy funciones con su uso.

Objeto PopUpMenu:
El PopUpMenu es el men emergente, esto es, el men que aparece cuando hacemos click derecho sobre un determinado objeto. La manera de crear un PopUpMenu es idntica a la del MainMenu. Podemos crear tantos PopUpMenu como deseemos, pero recuerda que estos estn vinculados con objetos visuales. Todos los objetos visuales tienen la propiedad PopUpMenu, aqu especificamos que PopUpMenu deseamos relacionar con este objeto. Un mismo PopUpMenu puede estar vinculado a varios objetos visuales. Ejercicio 3: Realiza un programa que nos permita cargar y guardar un Memo, Nuevo archivo, cambiar su fuente y su color. Todas estas funciones deben ser accesibles desde el men principal, adems las funciones de cambio de color y de fuente debern ser accesibles desde un men emergente relacionado al Memo. Ejercicio 4: Idem al anterior, pero deben figurar las opciones Abrir, Guardar y Guardar Como. Al Abrir o Guardar Como debe copiarse el nombre del archivo en el ttulo de la ventana. Si el archivo ya tiene un nombre vlido entonces se habilitar la opcin Guardar, la cual no deber preguntar el nombre del archivo. Dicha opcin debe deshabilitarse con Archivo Nuevo.

15

Captulo 5: Cuadros de dilogo personalizados y ventanas mltiples.

Ventanas no modales:
En este captulo veremos como realizar nuestros propios cuadros de dialogo, los cuales podrn ser tan complejos como queramos, ya que de hecho, un cuadro de dialogo es una ventana que no puede ser redimensionada. El proceso es sencillo, pero requiere ser metdico a la hora de guardar nuestro proyecto. Ejemplo 1: Para el ejemplo crearemos una ventana principal con un botn, luego, en el men iremos a File->New Form. De esta manera se crea una segunda ventana llamada (en principio) Form2. Para no confundir esta ventana como la primera, le cambiaremos el color desde las propiedades (rojo por ejemplo) y le agregaremos dos botones, uno que diga Si, y otro que diga No. Es importante que grabes tu proyecto en una carpeta como se explic en el capitulo 1. Si no cambias los nombres de los archivos (si los cambias no habr ningn problema), la ventana 1 estara guardada como Unit1.cpp con su correspondiente Unit1.h, y la ventana2 estara guardada como Unit2.cpp con su correspondiente Unit2.h, El proyecto, al ser compilado arrancar con el Form1, el cual es independiente del Form2, y ademas desconoce la existencia de Form2, es por eso que necesitamos que Form1 se entere de que Form2 existe para llamarlo. Para eso iremos al cdigo de Form1 (Unit1.cpp) y veremos que en el principio, dentro de los include figura: #include "Unit1.h" Aqu se incluye la declaracin de los objetos y los mtodos del Form1. Lo que haremos ser agregar a continuacin la declaracin de los objetos y los mtodos del Form2, es decir agregaremos a continuacion: #include "Unit2.h" Con lo cual Form1 conocer la existencia de Form2. Ahora haremos que al pulsar el botn del Form1 aparezcar el Form2. Para ello utilizaremos un mtodo que posee el objeto Form, el mtodo es Show() que como podrs darte cuenta lo que hace es justamente mostrar un Form. El cdigo entonces quedar: //----------------------------------------------------------#include <vcl\vcl.h> #pragma hdrstop #include "Unit1.h" #include "Unit2.h" //----------------------------------------------------------#pragma resource "*.dfm" TForm1 *Form1; //---------------------------------------------------------__fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { } //----------------------------------------------------------void __fastcall TForm1::Button1Click(TObject *Sender) { Form2->Show(); } Si pruebas de compilar esta aplicacin vers que entonces ambas ventanas son accesibles, cada ventana tendr entonces sus objetos y sus mtodos en forma independiente. Este tipo de aplicacin se llama aplicacin SDI, donde puede haber varias ventanas, y donde podemos cambiar el foco de ventana en ventana en ventana. Mas all de los nombres que tengan los objetos (si no has cambiado los nombres, cada ventana tendr un botn llamado Button1), debes saber que cada objeto es propio de cada ventana.

16

Ejemplo 2: Para aclararlo, agrega un segundo botn en el Form1, y cuando lo pulse agrega el siguiente cdigo: Button2->Left++; Lo que suceder ahora es que cada vez que pulses este botn, el mismo se desplazar a la derecha. Pero si Form2 tiene un botn que tambin se llama Button2, cmo sabe Builder a cual de los dos nos referimos? En realidad, el hecho de que los dos botones se llamen igual es pura coincidencia. Form1 no puede hacer referencia (en forma directa) a los objetos de Form2. Prueba de cambiar el nombre del Button2 del Form2, colcale como nombre SegundoBoton. Y ahora modifica el evento del Button2 del Form1 de la siguiente manera: SegundoBoton->Left++; Supuestamente debera desplazarse el botn del Form2, sin embargo al compilar notamos que el compilador nos da un error [C++ Error] Unit1.cpp(21): E2451 Undefined symbol 'SegundoBoton' Lo que sucede es que Form1 no conoce a SegundoBoton, porque este objeto es propio de Form2, para ello deberemos modificar nuestro cdigo de la siguiente manera: Form2->SegundoBoton->Left++; De esta manera podemos hacer accesibles los objetos de un Form desde otro Form. Cabe aclarar que por ahora los objetos de Form2 son accesibles desde Form1, pero no a la inversa, para lograr eso, en Unit2.cpp deberamos incluir la declaracin de los objetos de Form1, es decir: #include "Unit1.h" Cabe aclarar que los Objetos del Form2 son persistentes aunque la ventana se cierre, es decir, cerrar la ventana equivale a ocultarla, no a destruirla. Form1 sigue siendo la ventana principal de la aplicacin, si se cierra la Form1, la aplicacin se cierra, y Form2 se cierra con ella. Ejercicio 1: Crea una aplicacin con dos ventanas, una roja y la otra azul, ambas ventanas tienen un botn y un Edit. Al comenzar la aplicacin deben estar ambas ventanas abiertas (utiliza el evento OnActivate de la ventana 1) . Al pulsar sobre el botn de la ventana 1, la ventana 2 tomar por ttulo el contenido del Edit de la ventana 1 y viceversa. Ejercicio 2: Modifica el ejercicio 4 del captulo 4 de manera que el Memo este solo en una ventana diferente a la principal (para que el Memo ocupe toda la ventana dale a la propiedad Align el valor alClient). La diferencia entre ventanas y cuadros de dialogo es, como se ha dicho, que los cuadros de dialogo no pueden ser redimensionados, para ello lo nico que hay que cambiar es la propiedad BorderStyle del Form2, y cambiarla de bsSizeable a bsDialog. De esta manera la ventana ser un cuadro de dialogo. Prueba de modificar los ejercicios anteriores utilizando esta nueva propiedad.

Ventanas Modales:
Hay una gran diferencia entre ventanas (o cuadros de dialogo) modales y no modales. La aplicacin anterior tena la particularidad de que nosotros podamos cambiar el foco de una ventana a la otra, es decir, podamos trabajar en una ventana o en otra indistintamente. Esto no siempre es as. Por ejemplo el cuadro de dialogo de ShowMessage toma el control de la aplicacin, es decir, la aplicacin pasa su atencin a este cuadro de dialogo, el cual debemos cerrar para volver a tener el foco en la ventana principal (ya sea aceptando o cerrando el cuadro de dialogo). Lo mismo sucede con el cuadro de dialogo propio de OpenDialog. Este cuadro espera una

17

respuesta (por seleccin o por Cancel) pero nosotros no podemos volver a nuestra aplicacin sin dar una respuesta a este cuadro de dialogo. Este tipo de cuadros (o ventanas) son Modales. Un ejemplo de cuadro de dialogo no modal se el que aparece con la opcin de hallar y reemplazar (en Word por ejemplo). En este caso si se nos permite cambiar el foco del Word al cuadro de dialogo sin necesidad de cerrarlo. Este es un ejemplo de cuadro de dialogo no modal. Las diferencias entre las ventanas o los cuadros de dialogo modales y no modales seran entonces: No modales: Pueden coexistir con la ventana principal, y podemos cambiar de uno a otro cuando queramos. Modales: La aplicacin pasa su atencin a el, y no recupero el control de la aplicacin hasta darle una respuesta (o cerrarlo). Desde el punto de vista de la construccin de una ventana modal, los pasos a seguir son exactamente los mismos con una salvedad, en lugar de mostrarlos son el evento Show() los mostraremos con el evento ShowModal() que es propio del objeto Form. Ejemplo 3: Sigue los pasos del ejemplo 1 pero en el evento del Button1 del Form1 en lugar de Form2->Show(); Coloca Form2->ShowModal(); Prueba la aplicacin y vers que efectivamente no se puede pasar del Form2 al Form1 sin cerrar primero el Form2. Ahora bien, los botones que dicen Si y No son muy sugerentes, supuestamente deberan dar una respuesta. La idea de los cuadros de dialogo modales suelen ser dar un respuesta, recuerda los cuadros con los botones Si / No, Aceptar / Cancelar, Reintentar / Cancelar, etc. Aqu veremos una diferencia importante en los mtodos Show() y ShowModal(). Show es un mtodo declarado como: void Show (void); Es decir, no pide ni devuelve nada, simplemente muestra la ventana. ShowModal en cambio esta declarado como: int ShowModal (void); Es decir, ShowModal devuelve un valor entero, que es el que debemos evaluar para saber que botn a pulsado el usuario. Cmo hacemos entonces para que la ventana modal devuelva un valor como respuesta? El proceso es muy sencillo. Los botones tienen (y siempre la tuvieron) una propiedad llamada ModalResult, que es una propiedad de tipo int. Al poner algo en esa propiedad, ese botn automticamente se convierte en un botn que dar una respuesta a la ventana principal (devolviendo el valor especificado) y cerrar la ventana modal. Si observamos los valores que puede tomar la propiedad ModalResult veremos que son: MrOk MrCancel MrAbort MrRetry MrIgnore MrYes MrNo MrAll MrNoToAll MrYesToAll Pero si ModalResult es una propiedad de tipo int, cmo es posible que tome esos valores?. La respuesta es que todos los valores mencionados anteriormente son constantes que toman los valores del 1 al 10 respectivamente. Si quisisemos dar otro valor entero diferente se puede asignar cualquier otro valor entero a ModalResult. Es nuestra responsabilidad evaluar el valor de ShowModal.

18

Ejemplo 4: Modifica el ejemplo anterior poniendo a los botones si y no del Form2 los ModalResul MrYes y MrNo respectivamente. En el evento OnCLick del Button1 del Form1 coloca lo siguiente: void __fastcall TForm1::Button1Click(TObject *Sender) { int r; r=Form2->ShowModal(); ShowMessage(r); } Prueba la aplicacin y explica lo que sucede. Ejemplo 4: En el Form1 cambia el Caption del Button1 y coloca Cerrar En el Form2 agrega un Label con letras grandes que diga: Seguro desea cerrar la aplicacin? En el evento OnClick del Button1 (cerrar) coloca: void __fastcall TForm1::Button1Click(TObject *Sender) { int r; r=Form2->ShowModal(); if(r==6) Form1->Close(); } Prueba la aplicacin y explica que sucede. Ejercicio 3: Modifica el ejercicio 2 de modo que al seleccionar Archivo Nuevo aparezca un cuadro de Dialogo Modal de confirmacin (Esta seguro? Si o No). Ejercicio 4: Modifica el ejercicio anterior para que pida una confirmacin cuando seleccionamos cerrar la ventana (consultar al profesor el evento OnCloseQuery).

19

Capitulo 6: Bases de Datos.


En este captulo aprenderemos a manipular bases de datos (a partir de ahora BD). Podremos realizar varias operaciones dentro de una BD, pero para eso es necesario que la BD este creada. El C++ Builder trae dentro de sus herramientas un programa especfico para crear BD de distintos formatos. Este programa es el DataBase Desktop, el cual es accesible tanto desde la barra inicio, como desde dentro del compilador de Builder en la pestaa Tools. Es importante que entiendas que si bien este programa esta dentro del paquete de Builder (es decir, se instala junto con el compilador), es un programa totalmente independiente del compilador.

Creacin de una nueva BD:


Entra al DataBase Desktop. Selecciona File, New, Table. Aqu el programa nos preguntar que tipo de BD queremos crear. Hay muchos tipos de formatos de BD, (de la misma manera que hay muchos formatos grficos) desde el punto de vista de la programacin, no habra mucha diferencia entre un tipo y otro, sin embargo para ponernos de acuerdo en un tipo en particular, seleccionaremos el formato Dbase IV (que es uno delos ms utilizados). Ahora estamos en condiciones de crear los campos (no estamos llenando los campos con datos, sino creando los campos y especificando su tipo). Veras una tabla que tiene las columnas: FieldName: Nombre del campo (no puede contener espacios). Type: Tipo de dato, en Dbase IV tenemos los tipos: Character (caracateres o string) Float (numero flotante) Number (nmero entero) Date (Fecha) Logical (verdadero o falso) Memo (texto extenso) Size: Tamao (en el caso de Character, cantidad de caracteres, en el caso de Number, cantidad de cifras, el resto de los tipos no pide Size. Dec: Debes poner un nombre al campo (no puede contener espacios) y no pueden comenzar con un nmero ,en realidad, estas son condiciones comunes a los modificadores, de hecho, ni en Pascal ni en C los identificadores pueden contener espacios o comenzar con un nmero. Luego de poner un nombre debes especificar un tipo (presionando la barra espaciadora aparecen los distintos tipos). Una vez seleccionado el tipo deberemos (si el tipo de dato lo requiere) especificar el tamao y la cantidad de decimales. Repetiremos este proceso por cada uno de los campos que contenga nuestra BD. Una vez ingresados todos los campos, debemos guardar nuestra BD. IMPORTANTE: Debes guardar la BD en el directorio de trabajo de la aplicacin que crears. Es conveniente entonces que crees un directorio (o carpeta) destinado a contener el archivo de la BD y los archivos del proyecto. Si no haces esto, el archivo de la BD (en nuestro ser un .DBF) se guardar en C:\Archivos de programa\Borland\Data Base Desktop\*.DBF Como ves, no es una ubicacin muy cmoda que digamos. Una vez guardada la BD, es conveniente llenarla con tres o cuatro registros para poder probarla en nuestro futuro proyecto. Para ello brela, y ponla en modo Edicin (pulsa F9), podrs entonces llenar los distintos campos. Una vez ingresados los registros cierra la tabla, los datos se guardan automticamente. Por el momento podremos cerrar al Data Base Desktop y abrir el Builder. Para poder tener acceso a la BD que hemos creado necesitaremos de un objeto no visual llamado Table, (de tipo Ttable) que se encuentra en la pestaa Data Access. Este objeto sirve para vincularnos con el archivo fsico de la Base de Datos.

20

Objeto Table
Sus propiedad ms importantes son: Active: booleana, puede valer true o false. Indica si la BD estar abierta al comenzar el programa. Usualmente nos convendr mantener esta propiedad en true, pero debemos tener cuidado, al hacer esto la BD estar abierta en tiempo de edicin, si deseamos modificar algo de la BD desde el DataBase Desktop debemos volver a poner en false esta propiedad para que no nos de un error de acceso a archivos. DataBaseName: Propiedad AnsiString, aqu se especifica el directorio donde se encuentra el archivo de nuestra BD, si tuvimos la precaucin de guardar dicho archivo en el directorio de trabajo de nuestro proyecto, esta propiedad debe quedar en blanco, esto es importante, ya que si llevamos nuestro proyecto a otra mquina y llenamos esta propiedad la BD se buscar en el directorio especificado, si el proyecto esta en un directorio diferente habr un error ya que no encontrar el archivo. TableName: Propiedad de tipo AnsiString, nos pregunta por el nombre fsico del archivo correspondiente a nuestra BD (en el caso de Dbase IV se tratar de un archivo *.DBF). Esta propiedad tiene una pestaa para desplegar un men, el cual contendr los nombres de las BD disponibles en nuestro directorio de trabajo ,si hemos sido cuidadosos, ser el directorio de nuestro proyecto, en este caso, suele ser necesario reiniciar el Builder despus de grabar nuestro proyecto para que cambie el directorio actual. Por el momento (y solo por el momento) estas son las nicas propiedades que nos interesan. El componente Table, mediante mtodos 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 archivo fsico de la BD, y es a este objeto al que nos referiremos para acceder a la BD. Sin embargo, este objeto es no visual, por lo tanto los campos del registro no los podemos ver desde aqu. Para ello existen numerosos objetos visuales de mayor o menor complejidad y que nos brindan una interfaz amena entre el usuario y la BD. Para ello necesitamos un segundo objeto no visual llamado Data Source.

Objeto DataSource
Este objeto es el encargado de vincular todos los objetos visuales a un mismo objeto Table. El objeto DataSource se encuentra en la pestaa Data Access junto al objeto Table, tiene forma de tabla con tres flechas saliendo de ella. La nica propiedad que nos interesa en la propiedad DataSet, en ella pondremos el nombre de la tabla (por ejemplo Table1) que estar relacionada con este DataSource. Esta propiedad tiene una pestaa en la cual aparecern todos los objetos Table (por el momento solo tendremos uno) que podemos seleccionar. Una vez que tenemos creado el Objeto Table relacionado con un archivo y el objeto DataSource vinculado con el objeto Table, ya estamoss en condiciones de colocar objetos visuales. Esto es, objetos ya conocidos por nosotros que tienen el prefijo DB en su tipo (y por ende en su nombre por defecto). En general se trata de objetos similares a los ya conocidos que tienen algunas propiedades exclusivas de las bases de datos. Estos objetos estn en la pestaa Data Controls, todos ellos tienen la propiedad DataSource en la cual debo colocar el nombre del objeto DataSource al cual estarn vinculados (y, a travs de l, a nuestra BD fsica especificada en Table). A continuacin veremos algunos ejemplos:

Objeto DBEdit
Es similar al objeto Edit, solo vara en que tiene las propiedades DataSource (ya explicada) y DataField: DataField: Propiedad de tipo AnsiString, aqu se coloca el nombre del campo que estar relacionado con este Edit (el campo se puede seleccionar de una lista desplegable desde la pestaa). Imaginemos que nuestra BD contiene los campos NOMBRE, APELLIDO, DIRECCION, y TELEFONO, todos de tipo char (string para nosotros). Nuestra base esta relacionada a un objeto Table, este a su vez a un objeto DataSource, y este a su vez a un objeto DBEdit. Queda claro que el objeto DBEdit hace referencia a la base de datos, pero, a que campo hace referencia?. 21

Precisamente para ello es la propiedad DataField, supongamos que especifico en la propiedad DataField el campo APELLIDO, automticamente, el objeto DBEdit tomar el valor que figure en Apellido en el primer registro de la BD. Si estuvisemos en modo de edicin (lo veremos luego) lo que figure en el objeto DBEdit se grabar automticamente en la BD.

Objeto DBCheckBox:
Al igual que DBEdit tiene las propiedades DataSource, y DataField, pero en este caso, tiene sentido asignarla a un campo que sea de tipo lgico (true o false).

Objeto DBMemo:
Su propiedad DataField debe ser asignada a un campo de tipo Memo. Existen muchos otros objetos visuales que puedes investigar por tu cuenta respetando la misma lgica. Hasta el momento estamos en condiciones de ver el contenido de los campos del primer registro de una BD. Repasemos los pasos para hacerlo: 1) 2) 3) 4) Creamos un BD en el Data Desktop y la grabamos un directorio. Llenamos algunos registros de la BD Creamos un nuevo proyecto y lo grabamos en el directorio de donde est nuestra BD Colocamos un objeto Table y colocamos la propiedad Active en true, y en la propiedad TableName seleccionamos nuestro archivo DBF 5) Colocamos un objeto DataSource, y en su propiedad DataSet, colocamos el nombre del objeto Table (usualmente Table1) 6) Creamos un DBEdit por cada campo de tipo char y ponemos en la propiedad DataSource el nombre de nuestro objeto DataSource (por ejemplo DataSource1), y en DataFiels el campo que deseamos vincular con cada DBEdit Supuestamente deberamos ver los campos del primer registro de nuestra BD. Para poder manejar nuestra BD debemos utilizar los mtodos del objeto Table1.

Mtodos de Table (algunos de ellos, derivados de otras clases antecesoras)


void Next(); void Prior(); void First(); void Last(); void Delete(); void Append(); void Post(); void Cancel(); void Open(); void Close(); void Edit(); Se ubica en el siguiente registro (todos los objetos visuales son actualizados Se ubica en el registro anterior (todos los objetos visuales son actualizados Se ubica en el primer registro (todos los objetos visuales son actualizados Se ubica en el ltimo registro (todos los objetos visuales son actualizados Borra el registro actual Crea un registro vaco al final de BD, y coloca la BD en modo de Edicion (lista para ingresar), esta operacin debe ser cancelada o confirmada. Confirma la operacin Append Cancela la operacin Append Abre la BD (si la propiedad Active es tru este mtodo no es necesario) Cierra la BD Habilita el modo edicin de la BD

Podemos entonces, en base a botones que llamen a estos mtodos manejar una BD. Ten en cuenta que algunas operaciones deberan deshabilitar ciertos botones. Por ejemplo, una llamada a Post sin una previa llamada a Append deviene en un error, que deberamos evitar. Ejercicio 1: Crea una agenda que nos permita ingresar y consultar datos. Cada registro deber tener los siguientes campos: Nombre, Direccin, Telfono, Celular, Fecha de nacimiento. Ejercicio 2: Idem al anterior, pero que tenga un botn que permita listar las personas que cumplirn aos en los prximos cuatro das (requiere manejo de AnsiString y de la clase Tdate). Ejercicio 3: Crea un programa de manejo de historias clnicas. Para ello necesitars manejar los siguientes campos:

22

Nombre, Direccin, Telfono, Fecha de nacimiento, Obra Social, Sexo (tipo lgico) Historia clnica (tipo memo). Existe un objeto que nos permite manejar cmodamente una BD, se trata del DBNavigator.

Objeto DBNavigator:
Es un objeto visual que encontramos en la pestaa DataControl, como todos los objetos visuales de manejo de BD tiene la propiedad DataSource que lo vincula a una BD especfica. Este objeto es una botonera asociada a los mtodos ms comunes. Si bien es una forma rpida para una BD, no tenemos tanto control sobre la BD como si nosotros controlamos los mtodos manualmente. Sin embargo tenemos la opcin de agregar o quitar los botones que deseamos que aparezcan en el DBNavigator mediante la propiedad VisibleButtons.

Capitulo 7: Bases de Datos ordenadas


Hasta ahora las BD no tenan ningn orden, es decir, los registros estaban guardados por orden de aparicin. Para encontrar un determinado registro deberamos realizar una bsqueda lineal, lo cual llevara un tiempo de proceso importante. Podramos entonces ordenar la BD por alguno de sus campos, pero inmediatamente nos encontraramos con el siguiente problema, nuestra BD slo podr estar ordenada por un solo campo. Si quiseramos tener la posibilidad de buscar los datos por cualquier campo, deberamos tener diferentes copias de la BD ordenada cada una por un campo diferente. Esto, adems de ser una perdida de espacio y tiempo (ya que deberamos ordenar N bases de datos por cada registro nuevo), nos lleva a errores de redundancia e inconsistencia. Para solucionar estos problemas se recurre a los archivos de ndices. Es decir, la BD se mantiene desordenada, con los campos grabados por orden de aparicin, pero se mantienen archivos paralelos que guardan los ndices de la BD guardando la posicin fsica de los registros. En nuestro caso (DBase IV) se guardan todos los ndices en un solo archivo con extensin MDX que contiene todos los ndices de los campos especificados. Podemos crear un archivo de ndice a partir de una BD existente. Para ello abrimos nuestra BD (archivo DBF) desde el DataBase Desktop, seleccionamos la opcin Reestructure, y presionamos el botn que dice DEFINE (en el sector derecho de la pantalla). Luego seleccionamos el campo por el cual queremos que se cree un ndice, y presionamos Ok, el programa nos pedir que le demos un nombre al ndice, es aconsejable poner un nombre que nos recuerde a que campo direcciona nuestro ndice, por ejemplo, si estamos direccionando el campo NOMBRE, podramos llamar al ndice, INMOBRE. Repetimos esta operaciones tantas veces queramos (una por cada campo que deseemos indexar) y por ltimo grabamos nuestra tabla. Ahora veremos como acceder a estos ndices y como utilizarlos desde el Builder. Los pasos para acceder a las BD ordenadas son los mismos que para BD desordenadas, pero debemos indicar luego algunas cosas:

Propiedades de Table:
IndexFiles: Nos permite agregar uno o mas archivos de ndices, en nuestro caso, solo necesitamos uno, el archivo MDX que cre el Data Base Desktop. Podemos seleccionarlo utilizando el botn ADD. IndexName: Es una propiedad de tipo AnsiString que especificamos cual de todos los ndices que estn disponibles queremos activar al comenzar la aplicacin ,podemos (y de hecho lo haremos) cambiar esta propiedad en tiempo de ejecucin. Una vez hecho esto, los mtodos Next y Prior sern relativos al ndice utilizado, es decir, que la BD aparentemente se ordenar automticamente (aunque en realidad esto no sucede). Ej: Table1->IndexName=IDIRECCION; Aqu vemos la necesidad de que los ndices tengan nombres representativos y fciles de recordar. Esto es todo lo que necesitamos para cambiar el orden de una BD.

23

Ejercicio 1: Modifica el ejercicio 2 del captulo 6 para poder ordenar nuestra BD por cualquiera de sus campos. El uso de ndices no se limita solo a mantener ordenada la BD, nos permite adems, utilizar procesos de bsqueda dentro de la BD. Tenemos a nuestra disposicin dos tipos de bsqueda, bsqueda por clave y bsqueda por cercana, en el caso de la bsqueda por clave, se busca un valor exacto, por ejemplo, podramos buscar el valor Juan dentro del campo NOMBRE. En el caso de la bsqueda cercana, podemos buscar podemos encontrar al registro que mas se parezca al buscado, por ejemplo, si buscamos Pereira en el campo APELLIDO ,y no hay ningn Pereira en la BD es posible que nos muestre en cambio al primer Perez de la BD. Cabe destacar que una bsqueda cercana siempre encuentra algo, en el caso de la bsqueda por clave debemos considerar la posibilidad de que el registro no exista. En ambos casos debemos preparar a la BD para poder realizar nuestra bsqueda. Los pasos a seguir son: 1. Setear la BD en modo bsqueda, para ello utilizamos el mtodo SetKey(); 2. Indicar que valor debemos buscar y en que campo, lo explicar con un ejemplo: Table1->Fields[0]->AsString = carlos; Estamos indicando que debemos buscaremos el contenido carlos en el campo 0, es decir, el primero. Debemos tener en cuenta que la BD debe estar indexada a traves del campo por el que realizamos la bsqueda, es decir, si deseamos buscar por otro campo deberemos antes cambiar el ndice activo. 3. Realizar la bsqueda, ya sea por clave o por cercana, en el caso de bsqueda por cercana debemos utilizar el evento GotoNearest(); En el caso de bsqueda por clave utilizamos el mtodo GotoKey(); En este ltimo caso debemos considerar la posibilidad de que el registro no exista, en cuyo caso GotoKey devuelve false (no sucede ningn error, y no se cambia de registro actual en la BD) Ejemplo 1 Queremos buscar el apellido ms parecido a Perez (supongamos que el campo APELLIDO es el primero): Table1->SetKey(); Table1->Fields[0]->AsString = Perez; Table1->GotoNearest(); Ejemplo 2 Queremos buscar al socio 892345, de no encontrarlo, informarlo (supongamos que el campo NSOCIO es el tercero): Table1->SetKey(); Table1->Fields[2]->AsString = 892345; if(!Table1->GotoKey()) ShowMessage(El registro no se encuentra); Ejercicio 1: Modifica el ejercicio 2 del captulo 6 permitiendo ordenar los datos por todos los campos Agrega la posibilidad de buscar una persona ,en el caso de buscarla por nombre, bsqueda por clave, en el caso de buscarla por direccin, bsqueda cercana. Ejercicio 2: Modifica el ejercicio 3 del captulo 6 agregando el campo DNI. Agrega la posibilidad de importar / exportar la historia clnica a archivos de texto (utiliza mens desplegables). Agrega la posibilidad de buscar un paciente por apellido a medida que se ingresa cada letra del mismo. Agrega la posibilidad de buscar un paciente por su DNI

24

ndice
Programacin visual............................................................................................................................1 Capitulo 1 : Introduccin y entorno de trabajo................................................................................1 Caractersticas del compilador:....................................................................................................2 Barra de Herramientas:................................................................................................................3 El esquema de la ventana:............................................................................................................3 El Inspector de Objetos:...............................................................................................................3 Capitulo 2:Ventana Principal, Botones, Cuadros de Edicin..........................................................4 Creacin de un nuevo proyecto:..................................................................................................4 Propiedades de los objetos visuales:............................................................................................5 Objeto Form.................................................................................................................................6 Objeto Button:..............................................................................................................................6 Objeto Edit:..................................................................................................................................7 Objeto Label:...............................................................................................................................9 Capitulo 3:Objeto Memo, archivos de texto..................................................................................10 Objeto Memo:............................................................................................................................10 La Clase TString:.......................................................................................................................10 Ejercicios:..................................................................................................................................11 Capitulo 4:Cuadros de dialogo y objetos no visuales...................................................................13 Cuadros de Dialogo:..................................................................................................................13 Objeto SaveDialog:....................................................................................................................14 Objeto ColorDialog:..................................................................................................................14 Objeto FontDialog:....................................................................................................................15 Objeto MainMenu:.....................................................................................................................15 Objeto PopUpMenu:..................................................................................................................15 Captulo 5: Cuadros de dilogo personalizados y ventanas mltiples...........................................16 Ventanas no modales:................................................................................................................16 Ventanas Modales:.....................................................................................................................17 Capitulo 6: Bases de Datos............................................................................................................20 Creacin de una nueva BD:.......................................................................................................20 Objeto Table..............................................................................................................................21 Objeto DataSource.....................................................................................................................21 Objeto DBEdit...........................................................................................................................21 Mtodos de Table (algunos de ellos, derivados de otras clases antecesoras)............................22 Objeto DBNavigator:.................................................................................................................23 Capitulo 7: Bases de Datos ordenadas...........................................................................................23 Propiedades de Table:................................................................................................................23 ndice.............................................................................................................................................25

25

Programacin Visual en Borland C ++ Builder

28/07/2004

26

S-ar putea să vă placă și