You are on page 1of 15

RAD con la VCL

Juan Jes s Moncada Boln (jjmb72@gmail.com) u o


Realizaremos algunas aplicaciones Windows con la losof a RAD (Rapid Application Development, Desarrollo Acelerado de Aplicaciones) del IDE (Integrated Development Environment, Entorno Integrado de Desarrollo) del BCB (Borland C++ Builder) en su versin 5 6. o o Usars un nivel bsico de C o C++ (tipos, variables, exprea a siones y estructuras de control de ujo) y mucho entusiasmo. Block de notas nos preguntar si queremos editar un archivo a nuevo. Contestamos que s y escribimos lo siguiente:
1 2 3 4 5 6

1.

Programacin: Consola vs GUI o

7 8 9 10 11 12 13 14 15 16 17

Un programa es un procesador de datos con 3 etapas denidas: introduccin, proceso y resultados. Los programas heo chos para consola suelen ser secuenciales: el usuario no tiene control sobre el orden en que se hace todo, pues dicho orden est frreamente descrito en el cdigo fuente. a e o Considera un programa que solicite los lados a, b y c de un tringulo y aplique la frmula de Hern para calcular su area a o o S con el auxilio del semiper metro m: m= a+b+c 2 S= m(m a)(m b)(m c)

// heron.cpp - Area de un dabcbcacababbac #include <iostream> #include <cmath> int main() { using namespace std; float a, b, c; cerr << "Escribe tres lados: "; if(!(cin >> a >> b >> c)) { cerr << "Error en los datos\n"; return 1; } float m = (a+b+c)/2; float s = sqrt(m*(m-a)*(m-b)*(m-c)); cout << "La superficie es " << s << endl; return 0; }

Una vez guardado el archivo, conmutamos (Alt+Tab) al Intrprete de Comandos para hacer lo siguiente: e
[C:\] BCC32 heron Borland C++ 5.5 for Win32 Copyright (c) 2000 heron.cpp Turbo Incremental Link 5.0 Copyright (c) 2000 [C:\] HERON Escribe tres lados: 3 4 5 La superficie es 6 [C:\] HERON Escribe tres lados: uno uno uno Error en los datos [C:\] _

Hagamos una aplicacin de consola para programar esta o frmula. Primero, vamos al Intrprete de Comandos, llamao e do tambin S e mbolo del Sistema o shell de MS-DOS: Todos los programas Accesorios S mbolo del sistema Esto invoca a la antigua y universal pantalla negra, ah lla mamos al Block de notas para editar nuestro cdigo: o
[C:\] NOTEPAD heron.cpp

Para continuar el taller es importante comprender todos los elementos del programa anterior. La losof bsica para programar aplicaciones que han de a a correr en una GUI (Graphical User Interface, Interface Gra ca de Usuario) es radicalmente distinta. As podr verse un a programa en Windows equivalente al anterior:

Ahora el usuario tiene mucha ms libertad. Por ejemplo, a puede introducir en el orden que desee los datos o dejar de introducirlos antes de pulsar el botn que realice el clculo. o a Tanta exibilidad impone, desde luego, cambios en la manera de disear y codicar los programas. n En primer lugar, hay que dise ar la interface grca; es n a decir, los elementos operativos (botones, cuadros de edicin, o men s, etc.) que aparecern en la ventana de nuestra aplicau a cin. Este fue, durante mucho tiempo, un proceso sumamente o complejo y repetitivo. Afortunadamente los IDE modernos se basan en el RAD para hacer incre blemente fcil disear ina n terfaces (tanto, de hecho, que para ello no se necesita escribir cdigo fuente). Esto nos permite dise ar en muy breve tiempo o n la interface o parte externa de una aplicacin. o Sigue siendo necesario, desde luego, tirar l neas; pero esto se hace en lugares muy concretos, en respuesta a los eventos a los que cada elemento de una aplicacin debe responder. o Por ejemplo, en la interface anterior, lo unico que tenemos que programar es el proceso que debe realizarse cuando el usuario pulse el botn. Es ah donde se tomarn los datos que o a el usuario haya previamente redactado en los campos de edicin, se har con ellos el clculo pertinente y ste, nalmente, o a a e ser exhibido en la ventana. a Programar aplicaciones para Windows es una labor altamente apasionante y muy redituable: en este taller rascaremos la supercie de este enorme mundo, con la esperanza de que te motives lo necesario para hacer tus propias incursiones. Slo o as podrs adquirir pericia en esta disciplina. a

Supongamos que la ventana activa es el Block de notas. Entonces (y slo entonces) Window solicita a esta aplicacin proo o cese el evento dado. Ya ser trabajo del Block de notas tomar a el carcter pulsado y desplegarlo en la pantalla, por ejemplo. a Si el usuario mueve el ratn, esto produce un evento focao lizado. Windows entonces determina (con base en la posicin o y orden de las ventanas activas) a qu aplicacin le enviar el e o a evento para que reaccione a l. e Cada suceso es procesado como un evento: pulsar una tecla, soltar una tecla, mover el ratn, o click izquierdo simple al ratn, o click izquierdo doble al ratn, o click derecho al ratn, o el paso del tiempo (temporizador), la introduccin de un CD a la bandeja, o la llegada de un dato desde la red, y un extens simo etctera. e Por lo tanto, para programar aplicaciones que se integren suavemente a Windows hay que tomar en cuenta lo siguiente: 1. No debo (aunque s se puede) adue arme del procesador; n las acciones que programe sern lo ms atmicas posible. a a o 2. No puedo saber en qu orden va a emplear el usuario los e elementos que yo le ofrezca. As que debo validar cada actividad para realizarla o no. 3. No todos los usuarios son iguales: a algunos les gusta usar ms el teclado, otros no pueden vivir sin el ratn, cada uno a o tiene distintas opiniones acerca de la apariencia optima de una aplicacin. Hay que ser tan exible como sea posible y o prever que un usuario puede usar la aplicacin de formas o o para objetivos que nosotros jams imaginamos. a 4. Una vez que el usuario ejecuta un comando (apretando un botn, por ejemplo) tu programa debe retroalimentaro lo en menos de una dcima de segundo; aunque slo sea e o poner el cursor en modo reloj de arena. Omitir esta regla bsica de la interface de usuario, har que ste piense: a a e puls el botn?, se habr atorado la mquina? ser que e o a a a no entend algo?, etc. Desarrollaremos unas cuantas aplicaciones para Windows siguiendo estos principios. Supondremos ya instalado el BCB (la versin 5 no corre en Windows Vista; la 6 s o ).

3.

Qu ofrece el IDE? e

2.

Cmo funciona una aplicacin en o o Windows?

Observemos los elementos (aparentemente disconexos) que conforman el IDE:

Los programas que se ejecutan en Windows en realidad viven dormidos; esto quiere decir que estn a la espera de que el a sistema operativo les d trabajo por hacer (un trabajo muy e puntual, eso s para hacerlo lo ms rpidamente posible y ) a a volver a dormir. Un ejemplo: se ejecutan simultneamente el Block de noa tas, el Visualizador de internet y el S mbolo del sistema. Si el usuario pulsa una tecla, esto genera un evento: un suceso que Windows debe delegar a alguna de las aplicaciones actualmente en ejecucin. Como, tcnicamente hablando, la pulsacin de o e o una tecla es un evento no focalizado, Windows se lo enviar a a la ventana activa. 2

Arriba: La barra de men y herramientas u Izquierda: El Inspector de objetos (Object Inspector) Centro: Se sobreponen dos elementos: La forma principal en vista de dise o, y n el editor de cdigo fuente o En la versin 6.0 aparece a la izquierda otro elemento (el o Object TreeView) pero no lo vamos a usar por el momento, por lo que podemos cerrarlo y agrandar al Object Inspector para que ocupe todo ese espacio.

Ctrl+Shift+S o el botn Varios disquettes que gura o en la Barra de herramientas. Aparecer un dilogo como a a ste: e

4.

Componentes VCL

La Biblioteca de Componentes Visuales (Visual Componente Library) de Borland es el motor que ruge bajo la sencilla interfaz RAD del entorno. Consta de un (enorme) conjunto de blbliotecas que implementan cientos de componentes. Una componente es, comnmente, un elemento visual atmiu o co: una etiqueta, un campo de edicin de texto, un botn, un o o men , una casilla de vericacin, un botn radio, una forma, u o o una imagen, una ventana. Todos ellos estn preprogramados y a listos para ser elegidos (de la pesta a Standard de la Barra de n Herramientas), ser congurados a travs del Object Inspector e para que tenga la apariencia exacta que deseemos y para que denamos los eventos a los que van a reaccionar y la manera de hacerlo. De todos los pasos anteriores, unicamente el ultimo requerir que escribamos cdigo fuente. a o

Donde dec Unit1.cpp pondrs HelloUnit, como se a a muestra. Pulsa Enter o el botn Guardar . o 3. Aparecer un nuevo dilogo para guardar el proyecto. a a Donde dec Project1.cpp pondrs HelloProject, a a como se muestra. Pulsa Enter o el botn Guardar . o

5.

Hola, mundo

4. Listo! Es tiempo de generar la aplicacin. Para esto o pulsa Ctrl+F9 . Esto compila el cdigo fuente (t no o u has escrito una l nea de cdigo, pero BCB s y proo ) duce un ejecutable con el nombre del proyecto (es decir, HelloProject.exe). Al ejecutar el comando vers a un dilogo como ste, que al terminar exitosamente dea e ber desaparecer. a

Vamos a desarrollar nuestro primer programa en Windows sin escribir una sola l nea de cdigo! o Desde luego, las cosas ya no sern tan simples como en la a programacin de consola, que con un unico archivo CPP ten o a ms que suciente. a Builder C++ gestiona proyectos (extensin BPR) que espeo cican qu archivos de denicin de formas (extensin DFM) e o o y qu cdigo fuente (archivos CPP y H) conforman una aplie o cacin Windows (extensin EXE a la que habr que anexar o o a archivos extra, como DLL). Por eso, es muy importante respaldar adecuadamente los proyectos. Para esto necesitamos por lo menos dos nombres de archivo diferentes: 1. uno para la unidad o forma; (ejemplo: HelloForm); 2. otro para la proyecto o ejecutable; (ejemplo HelloApp). BCB ofrece, para ello, la carpeta C:\Archivos de programa\Borland\CBuilder5\Projects, pero es muy fcil a desde ella corromper la instalacin. o Para que la ubiques la usaremos en este primer ejemplo. Pero, para todo tu trabajo posterior, mi encarecido consejo es que crees tu propia carpeta de trabajo (por ejemplo C:\CPP) y, para cada proyecto, una carpeta dentro de ella. 1. Abre el IDE de Builder 5 si no lo hab hecho ya: as Todos los programas Borland C++ Builder 5 C++ Builder 5 2. Como puedes ver, ya existe una forma (y una aplicacin detrs de ella) que aunque no hace nada util, ya o a est completamente lista. No tenemos ms que guardarlo a a todo. Para esto elige el men [ FileSaveAll ] o pulsa u 3

5. Ubica el proyecto que acabas de producir: abre (desde Mi PC) la carpeta C:\Archivos de programa\Borland \CBuilder5\Projects para que veas algo como esto:

Ah est HelloProject.exe. Si lo ejecutas, vers que a a la aplicacin que acabas de hacer no tiene gran chiste. o Prueba a mover la ventana, a cambiarle el tama o, a min nimizarla, a maximizarla, a restaurarla y a cerrarla. Toda la funcionalidad estndar de las aplicaciones de Windows a est presente en tu ventana. Pero como t no le has proa u gramado nada lgicamente no hace nada ms que eso. o a 6. BCB Trabaja en dos modos distintos: el Modo de Diseo n (en que hemos estado todo el tiempo) y en el Modo de Ejecucin. Ahora, que cerraste la ventana del ejecutable o

que invocaste, vuelve al IDE y pulsa F9; esto hace que el cdigo se compile y ejecute desde dentro de BCB. Este o es el modo de Ejecucin (lo podrs distinguir porque, al o a aparecer la forma ejecutable, desaparece el Object Inspector que est a la izquierda y aparecen unos puntitos a azules (que sealan puntos de depuracin) en la ventana n o del cdigo fuente. Mientras ests en ese modo no podrs o e a modicar el diseo de tu forma (aunque s cambiar el cdin o go fuente). Para regresar al Modo de diseo, simplemente n cierra la ventana de la forma de tu programa o, si por alguna razn se ha atorado, pulsa Ctrl+F2. o De vuelta en el IDE en Modo de Dise o, conguraremos n la forma para que muestre un t tulo ms amigable. a Nota que el Object Inspector muestra los atributos del componente seleccionado en la Vista en Modo de Dise o n de la forma; como carece ahora de elementos, el unico componente elegible es la misma forma, llamada Form1. Ubica el atributo Caption y cambia el valor a su derecha de Form1 a Hello, world, como se muestra:

archivo HelloUnit.h HelloUnit.cpp HelloUnit.dfm HelloUnit.obj HelloProject.cpp HelloProject.bpr HelloProject.res HelloProject.obj HelloProject.exe Hello*.*

C C C C C E

contenido Cabecera de la unidad (forma) Cdigo fuente de la unidad o Denicin de atributos o Cdigo objeto de la unidad o Cdigo fuente de la aplicacin o o Proyecto Recursos (recreable) Cdigo objeto de la aplicacin o o Ejecutable nal Archivos de respaldo

Los archivos marcados con C debern ser conservados paa ra poder recargar el proyecto; esto se puede hacer simplemente dndole doble click al archivo BPR. a El archivo marcado con E es ejecutable pero no es autnoo mo. En mquinas que no tengan instalado el mismo coma pilador no podr correr; para que lo pueda hacer debern a a copiarse, junto con l, los archivos necesarios. e Al tratar de correr el EXE en otra mquina ir pidiendo a a uno a uno los archivos que le falten, mismos que encontrars dentro de la propia instalacin del BCB (diferentes a o para cada versin y cada ejecutable). Los archivos marcao dos con y los de respado son prescindibles o recreables; brralos sin problema. Cierra el IDE. o La ejecicin directa del proyecto dentro del IDE (pulsando o F9 ) o el botn Play verde de la Barra de Herramientas) inio cia modo de Ejecucin; ste generalmente sobrecarga mucho a o e la mquina (porque activa el depurador incorporado); suele ser a ms cmodo y rpido producir el ejecutable con Ctrl+Shift+F9 a o a y ejecutarlo desde una ventana de carpeta como lo hicimos.

6.
Nota cmo, al editar el atributo, ste automticamente o e a se actualiza en la vista en modo de diseo de la forma. n Recuerda: no estamos programando an, tan slo estamos u o congurando un componente. Vuelve a compilar (con Ctrl+F9 ) y vuelve a ejecutar el archivo EXE. Qu diferencia observas? e Retorna al IDE y altera el tamao de la forma. Para esto n puedes modicar su tamao directamente en la vista en n modo de diseo, o bien alterar los atributos Height y n Widht en el Object Inspector. Compila y ejecuta. Si quieres, prueba a hacer ms cambios simples (por ejema plo, BorderStyle, Color y Cursor son interesantes) antes de pasar al siguente inciso. 7. Revisemos los archivos generados por el proyecto, en total 9 archivos espec cos ms respaldos (prejados con ) a

Ahora, un saludo

1. Reinicia el IDE o, si ya ests en l, elige el men [ File a e u New ] o el botn Hojita en blanco a la izquierda de o la Barra de Herramientas: Elige Application.

2. Guarda el proyecto. Crea la carpeta C:\CPP\Salute y dentro de ella guarda la unidad como SaluteUnit y el proyecto como SaluteApp (el ejecutable nal se llamar SaluteApp.exe). a Cambia el Caption de la forma al valor Saludar y haz que la forma tenga 240 pixeles de ancho (Width) y 160 de alto (Height). Al nal, deber quedarte as a :

3. Vamos a insertar nuestro primer componente en la forma. Localiza, en la Barra de Herramientas a la derecha, la paleta de componentes; en ella vers etiquetas, botones, a cuadros de edicin, casillas de vericacin, men s, etc., o o u listos para usar en tus formas. Simplemente haz doble click sobre el cuadrito de edicin o (se que tiene ab en azul sobre fondo blanco) y ve cmo e o esto inserta un campo de edicin en el centro de tu forma. o

saludo. Para esto, necesitamos decirle a Windows qu quee remos que se haga cuando el usuario de nuestra aplicacin o pulse el botn. o No sabemos cundo el usuario har esto (ni si antes o desa a pus de hacerlo habr editado el campo de edicin). Pero e a o Windows s sabr y emitir un evento que le enviar a a a a nuestra aplicacin. o Nuestra aplicacin deber reaccionar a ese evento. Esto o a implica que deber existir una funcin dentro del cdigo a o o fuente (que hasta ahora no hemos visto) a la que se invoque cuando el usuario pulse el botn. Y dentro de ella o pondremos lo que queramos. As de simple. Para que BCB genere todos los mecanismos necesarios para esto, simplemente haz doble click en el botn en la o forma de dise o. Esto har que la ventana de edicin de n a o cdigos que todo el tiempo ha estado escondida atrs de la o a vista en modo de diseo de la forma pase a primer plano n y en ella vers algo como esto: a
16 17 18 19

4. 5.

6.

7.

Asimismo, en el Object Inspector ahora se exhiben los atributos de Edit1. Pulsa sobre la forma y sobre el campo de edicin alternadamente y ve cmo el Object Inspector o o exhibe los atributos del componente seleccionado. Elimina el contenido actual del campo de edicin. Para o ello, ve al atributo Text y borra su contenido. Arrastra el campo de edicin a la esquina superior de la o forma. Otra forma de hacerlo es editar, desde el Object Inspector, los atributos Left y Top. Qu pasar si selecionas otra vez un campo de edicin? e a o Hazlo y aparecer, en el centro de la forma, otro coma ponente; pero ahora se llama Edit2. Esta es una regla general en la VCL: Edit1 es el primer campo de edicin o Edit2 el segundo y as sucesivamente. Ambos son objetos (variables) del tipo TEdit. Por ahora, elimina a Edit2: simplemente seleccinalo y pulsa Del . o Inserta en la forma un botn y ponlo a la derecha del o campo de edicin. Ubica su atributo Caption y ed o talo para que su valor sea &Saludar. Debes llegar a esto:

void __fastcall TForm1::Button1Click( TObject *Sender) { }

Como podrs notar, se trata de la denicin de una funa o cin de aspecto y nombre intimidante: o TForm1::Button1Click Pero, si la analizas, todo queda claro: se trata de la funcin a la que Windows invocar cuando el usuario de tu o a aplicacin haga Click en el Button1 de la Forma1. o Esta es la forma general de las funciones que BCB produce para gestionar los diferentes eventos; por ejemplo, TForm2::Edit3Change ser el nombre de la funcin que se va a invocar al cambiar a o (de cualquier forma) el contenido (Text) del 3 campo de edicin de la 2a forma de tu aplicacin. o o Verdad que no es tan complicado? Muy importante: esta funcin no la tienes que escribir t: o u Builder la genera automticamente para ti. Ms impora a tante a n: la conecta para se asocie a un evento concreu to que Windows sabr redireccionar en su momento. Por a ello, no la cambies ni la borres: tu podrs manipular de a ella unicamente su contenido interno. 9. Ahora s vamos a escribir nuestra primera (y unica) l , nea de cdigo! o ShowMessage("Hola, " + Edit1->Text); El resultado deber verse as una vez que hayas cerrado a el Explorador de Clases que se encuentra dentro de la ventana del editor a su izquierda:

Nota que el efecto de anteponerle un ampersand (&) a cualquier caracter dentro del Caption de un botn hao ce que ste lo exhiba subrayado. Ms a n: esto har que, e a u a durante la ejecucin, el botn pueda ser igualmente seleco o cionado pulsando Alt+S , en este caso; sta es una tecla e rpida (hotkey) que permite que el usuario elija el modo a ms cmodo para acceder a los comandos de tu aplicacin. a o o Qu pasar si el Caption de Button1 fuera e a Sal&udar? Aver gualo! 8. Queremos que la aplicacin haga algo simple. . . como un o

Nota que muchos de los comandos de la VCL no son en 5

min sculas (como las palabras reservadas de C++). Teu clea exactamente como aparece cada carcter. a El signicado de sta nuestra primera y unica l e nea de cdigo no es dif o cil: se invoca a la funcin o ShowMessage con una cadena que es la suma (concatenacin) de dos cadenas: la constante "Hola, " y el o contenido actual del campo de edicin, al que se accede o as Edit1->Text. Ya est! : a 10. Compila y ejecuta. El resultado es totalmente predecible:

21 22 23

ShowMessage("Debe escribir un nombre"); } }

ShowMessage exhibe un peque o cuadro de dilogo no n a modal (aparece sobre la forma y no permite regresar a ella sino hasta que se le cierra). Es momento ahora de jugar un poco. Reemplaza la unica l nea de cdigo que escribiste por cada una de la siguientes o (una por vez; 3 en la opcin f ) y prueba a ver qu pasa o e con el ejecutable al pulsar el botn: o a) Edit1->Text = ""; b) Form1->Caption = Edit1->Text; c) ++Form1->Left; d ) ++Button1->Top; e) Form1->Cursor = crHourGlass; f ) AnsiString s = Edit1->Text; Edit1->Text = Button1->Caption; Button1->Caption = s; AnsiString es el tipo que invent la VCL para cadenas de o caracteres antes de que el estndar propusiera el tipo string a que ya es parte de C++. Son muy semejantes de todos modos.

A este modo de programar, en el que el botn permanece o siempre activo (disponible) y al pulsarlo ste emite resultados e o mensajes de error se llama validacin a posteriori. Es, como o puedes observar, muy simple de programar. Pero no a todos los usuarios les agrada. Un tercer esquema es la validacin a priori. Es ms laboriosa o a pero produce interfaces muy intuitivas y elegantes. Ve a la forma en modo de diseo. No podrs verla a menos n a que cierres la aplicacin (si es que la ejecutaste desde dentro o de IDE); de todos modos, no podrs volver a compilarla hasta a que cierres la aplicacin, por lo que mejor hazlo de una vez. o En primer lugar, cercirate de que el atributo o Text de Edit1 est vac e o. Y que el cdigo en el o TForm1::Button1Click sea el que originalmente pusiste; es decir, con slo una llamada a ShowMessage. o Luego, ve al atributo Enabled de Button1 y ponlo false. As al arrancar la aplicacin, sta tendr inactivo el botn. , o e a o Verif calo: al compilar y ejecutar podrs editar el campo a de edicin pero el botn no lo podrs presionar. Cierra tu o o a aplicacin y regresa a la forma en Modo de Diseo. o n Vamos ahora a especicar que, cada vez que cambie el campo de edicin, se le avise de ello al botn para que se active o o o no seg n el contenido del campo de edicin. En terminolog u o a tcnica, vamos a conectar a ambos componentes con un evento. e Haz doble click en el campo de edicin. Esto har que BCB o a genere una nueva funcin para hacer frente a un nuevo evento: o el cambio en el contenido del primer campo de edicin de la o primera forma de la aplicacin. Programa ahora su reaccin: o o
16 17 18 19

void __fastcall TForm1::Edit1Change( TObject *Sender) { Button1->Enabled = Edit1->Text != ""; }

7.

Uso de eventos

Un problema de nuestra aplicacin es que, si el usuario deja o vac el campo de edicin, el programa saludar a nadie. o o a Para remediarlo hay que validar la accin de nuestro botn. o o Existen varias formas. La primera es la validacin simple: o
16 17 18 19 20 21 22

Compila y ejecuta. Vers cmo, a medida que escribes y a o borras el contenido del campo de edicin el botn reacciona o o en consecuencia activndose o desactivndose. a a

8.

Ms sobre eventos a

void __fastcall TForm1::Button1Click( TObject *Sender) { if(Edit1->Text != "") { ShowMessage("Hola, " + Edit1->Text); } }

Slo si algo se puede hacer cuando el usuario lo solicita se o hace. . . Si el usuario pulsa el botn cuando est vac la cadena o e a simplemente lo ignorar. Este comportamiento, no obstante, a suele desconcertar al usuario, porque se empezar a preguntar a si su mquina se ha atorado o si no puls en verdad el botn. a o o He aqu una segunda versin: o
16 17 18 19 20

void __fastcall TForm1::Button1Click( TObject *Sender) { if(Edit1->Text != "") { ShowMessage("Hola, " + Edit1->Text); } else {

Al hacer doble click sobre un componente en la forma en modo de dise o, BCB decide el evento ms representativo de n a ese componente y genera la funcin correspondiente. o Pero cada componente puede suscitar muchos eventos diferentes; para comprobarlo, haz click en algn punto de la Form1 u (es decir, que no est seleccionado ni Edit1 ni Button1 para e que el Object Inspector exhiba los atributos de Form1. Selecciona la pesta a Events de ObjectInspector. n Vers cmo ahora se despliegan los diferentes eventos que le a o pueden suceder a Form1. Ubica el evento OnMouseMove y haz doble click en su campo de edicin. o Esto har que BCB genera la funcin que se har cargo de a o a actuar cuando el ratn se deslice sobre la primera forma de la o aplicacin. Programa la reaccin adecuada: o o
16 17 18 19

void __fastcall TForm1::FormMouseMove( TObject *Sender, TShiftState Shift, int X, int Y) { Form1->Caption = IntToStr(X)

20 21

+ "," + IntToStr(Y); }

Compila, ejecuta (y disfruta de) el ejecutable. Nota cmo cada evento proporciona la informacin adecuao o da a travs de los parmetros; en este caso, las variables X y Y e a contienen las coordenadas (dentro de Form1) donde se ubica el ratn. o Hay que tener presente que, para cada componente, el origen es su esquina superior izquierda, cuya coordenada es (0,0) y que las coordenadas Y crecen hacia abajo. La funcin de la VCL IntToStr es necesaria porque los o componentes slo exhiben textos; as que la conversin de los o o n meros a textos es necesaria. u Para permitir todas las posibilidades, la VCL proporciona las siguientes funciones de conversin: o IntToStr FloatToStr StrToInt StrToFloat Para qu nos servir por ejemplo, StrToFloat? Desde e a, luego, si el usuario escribe un n mero en un campo de edicin, u o claramente eso es un texto. Por lo que, para poderlo usar, habr que convertirlo: a float f = StrToFloat(Edit1->Text);

Pero una vez que ya han quedado comprendidas, ser un ena gorro tener que decir algo como: selecciona, dentro de Form1, el componente Button1 y, en el Object Inspector, cambia su atributo Caption para que diga C++. Veamos ahora una forma de describir brevemente el proceso para que podamos realizar ms prcticas ms adelante de una a a a manera concisa y clara. Lo anterior podr describirse ms corto y claro: a a Form1 { Button1 { Caption "C++" } } Hemos ahorrado palabras y, una vez que se domina la idea, ser posible expresar paso a paso cada etapa del desarrollo de a una aplicacin completa en muy poco espacio. o Veamos un ejemplo completo en el siguiente cuadro: no es un programa en C++ (aunque s incluye fragmentos de cdigo o de C++): ms bien es una descripcin paso a paso de cmo a o o desarrollar un proyecto completo en BCB.
1 2 3 4

9.

Un detalle importante

5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21

Un descuido com n suele ser editar el atributo Name en vez u del atributo Text (para TEdits) o Caption (para TForms, Buttons o TLabels). No es ilegal cambiar el nombre de un componente, pero se cambio deber hacerse al principio de e a la codicacin, para que las referencias a l en tu programa se o e mantengan correctas. Lo que s es un error serio es alterar o borrar l neas de cdigo o que el IDE genera automticamente: como BCB no slo haa o bilita los eventos sino que tambin los conecta con Windows, e debers repetar dichos mecanismos. Por eso mismo es incorreca to escribir a mano la envoltura (prototipo) de los eventos: al no ser conectados por BCB simplemente no sern localizados. a

10.

Descripcin del desarrollo de una o aplicacin o

22 23 24 25 26 27 28 29 30 31 32 33

Hasta este momento hemos jugado con una aplicaciones muy simples. Pero ya hemos abordado los aspectos fundamentales del desarrollo de aplicaciones para Windows usando la VCL de BCB: 1. Creacin de un proyecto nuevo. o 2. Guardado (recuerda que debes usar dos nombres distintos para esto, uno para la forma y otro para la aplicacin). o 3. Conguracin de la forma (ponle componentes, acomdao o los sobre la forma y edita sus propiedades). 4. Denicin los eventos (y, ahora s aqu tendrs que codio , a car las reacciones que desees). 5. Compilacin y ejecucin. o o Hemos explicado hasta ahora, paso a paso, cmo armar una o aplicacin muy sencilla que salude a su usuario. Para ello hio cimos varias cosas explicadas paso a paso. 7

Carpeta C:\CPP\SALUTE Unit1 SaluteUnit Project1 SaluteApp * Form1 { Caption "Saludar" * Edit1 { Text "" Left 8 Top 8 } * Button1 { Caption "&Saludar" Left 136 Top 8 * @ OnClick ShowMessage("Hola, " + Edit1->Text); @ } * Button1 { Enabled false } Edit1 { @ OnChange Button1->Enabled = Edit1->Text != ""; @ } } *

La l nea 1 especica la carpeta para almacenar el proyecto: recuerda que son muchos los archivos necesarios como para mezclar ms de un proyecto en una carpeta. a En las l neas 2 y 3 se dan los nombres con los que se han de guardar la unidad y el proyecto: recuerda que deben ser nombres diferentes y que el nombre que le des al proyecto ser tambin el nombre del ejecutable. a e

El asterisco de la l nea 4 se ala que ste es un buen momento n e para compilar y correr la aplicacin: en este punto en particular o obtendrs lo que al principio de este taller; es decir, una forma a completamente en blanco. Todo lo que aparezca dentro del bloque prejado por Form1 (como en la l nea 4) son componentes y eventos de esa forma. Esto ser importante cuando desarrollemos aplicaa ciones que involucren ms de una forma. a La l nea 6 indica que el atributo Caption de Form1 (est contenido en su bloque) ser cambiado a Saludar (las a a comillas slo delimitan el texto; no forman parte de l). o e La ejecucin sugerida en la l o nea 7 producir una forma con a el t tulo que conguramos. En la l nea 8 se indica que deber ponerse un campo de a edicin (Edit1) en Form1 y dentro de su propio bloque se o se ala qu atributos debern ser modicados a qu valores. n e a e La l nea 13 nos manda a compilar para ver cmo va proo gresando nuestra aplicacin. Es una buena idea proceder o as al trabajar con la VCL: haciendo cambios peque os y cer n ciorndose de que van por buen camino. a Como lo indica la l nea 14, insertamos un botn en la forma o y lo conguramos hasta la l nea 18, en la que ejecutaremos una aplicacin cuya interfaz ya est completa pero que an o a u est vac por dentro. a a A continuacin, en la l o nea 19 sealamos que el Button1 n deber reaccionar al evento que la BCL rotula OnClick; BCB a generar la funcin correcta y nos llevar a ella. Y es ah donde a o a colocaremos el cdigo fuente de C++ que aparece en la l o nea 20, encerrado entre dos @. Por ultimo, la l nea 25 nos dice que inhabilitemos a Button1 y la l nea 29 ser el cdigo que programemos en el a o a manejador del evento que se disparar al cambiar (OnChange) el campo de edicin (Edit1) de la 1a forma (Form1) de la o aplicacin. La compilacin de la l o o nea 33 es la denitiva para dar por terminado el desarrollo de esta aplicacin. o Para practicar, vamos a reelaborar la aplicacin pero poo niendo ms caracter a sticas (que iremos explicando brevemente). S guelo con cuidado para que tengas una idea ms clara a de cmo desarrollar una aplicacin. o o
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22

23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73

@ OnClick ShowMessage("Hola, " + Edit1->Text); @ } * Button1 { Enabled false } Edit1 { @ OnChange Button1->Enabled = Edit1->Text != ""; @ } * Label1 { Left 8 Top 40 Caption "" } Button1 { c se antepondr @ OnClick Este odigola funcin. a al que ya exista en o // Aadir al inicio n Label1->Caption = "ltimo saludo a " + Edit1->Text; U @ } * Button1 {
e @OnClick Antes o despus de ShowMessage? es igual. // Invertir el orden // de las 2 instrucciones @ No Las etiquetas (en la Barra de Componentes el botn con una A o mayscula) permiten colocar textos u cortos en la forma.

} * Label2 {
No hay confusin entre componentes de o tipo TLabel: el primero es Label1 y el nuevo es TLabel2.

Left 8 Top 72 Caption "" } Button1 { @ OnClick // Aadir al final n if(Edit1->Text.Length() < 5) { Label2->Caption = "Tu nombre es corto"; } else { } @ } * BorderIcons { biMaximize false
(Para modificar este atributo pulsa en el signo ms a la izquierda de su a nombre) No tiene caso permitir que la forma se maximice... Hay que borrar el texto: si no, cuando el usuarioescriba otro nombre, Label2 no se actualizara.

Carpeta C:\CPP\SALUTE Unit1 SaluteUnit Project1 SaluteApp * Form1 { Caption "Saludar" Height 160 Width 240 * Edit1 { Text "" Left 8 Top 8 } * Button1 { Caption "&Saludar" Left 136 Top 8 * Default true *
Botn por omisin; es decir, cuando o o el usuario pulse Enter se activar sin importar si tiene el a foco o no.

Label2->Caption = "";

74

75 76 77 78 79

} BorderStyle bsDialog * Position *

...ni que cambie de tamao. n

poScreenCenter

Es la posicin inicial: el o usuario s podr cambiarla y a ya no ser la que tena la a forma en tiempo de diseo. n

80 81

Label1,Label2 { Font { Size 16 } } * Edit1 { @ OnChange

Puedes elegir ms de un componente en a tiempo de diseo; y los atributos o n eventos que configures entonces valdrn para todos. a

82

Pulsa el signo ms para modificar a este atributo;o bien, pulsa los puntos suspensivos para abrir el cuadro de dilogo de seleccin de a o tipo de letra.

83 84 85 86

87

Este ltimo cambio es artificioso u pero sirve para ver cmo averiguar el o tamao de una AnsiString; aqu hay n una diferencia con el tipo string: s.size().

88 89

// Reemplazar Button1->Enabled = Edit1->Text.Length() > 1;


@ } } *

90 91 92 93

Nota cmo se hacen tres cosas muy denidas: o Primero, la extraccin de los datos que el usuario edit a las o o variables numricas correspondientes; por ejemplo, el lado a: e
float a = StrToFloat(Edit1->Text);

En segundo lugar, el clculo matemtico, tal y como se har a a a en una aplicacin de consola; por ejemplo, el semiper o metro:
float m = (a + b + c)/ 2;

Usaremos esta forma de describir el desarrollo de aqu en adelante. Como ejercicio, trata de hacer la versin GUI del o primer programa con que iniciamos este taller: heron.cpp. 1. Cmo se ver la forma en modo de diseo y el tiempo de o a n ejecucin: o

Por ultimo, ya que se han obtenido los resultados, hay que exhibirlos; por ejemplo, en una etiqueta:
Label4->Caption = "Superficie: " + FloatToStr(s));

Nota que pudiste haber elegido, en vez de la etiqueta, usar el comando ShowMessage que ya conoces:
ShowMessage("Superficie: "+ FloatToStr(s));

2. Veamos ahora el Object Inspector para varios componentes:

Muy interesante, no? Por qu no intentas mejorar la aplicacin que acabas de e o hacer? He aqu unas ideas: 1. Aade un botn &Limpiar, que vac los tres campos de n o e edicin. o 2. A ade validacin matemtica: intenta introducir como lan o a dos 6, 4 y 11, qu pasa? (se puede armar un tringulo e a con esos lados?). Cmo arreglar esto? o as 3. Aade otro botn Acerca de (le pondr una ten o as cla de acceso rpido?) que exhiba tus datos; algo como a "heron.cpp\n\nC++\npara Windows". Para que te motives ms a n, realiza la siguiente aplia u cacin; para ella debers conseguir un icono. Uno util o a est en C:\Archivos de programa\Borland\CBuilder5\ a Examples\Icons\Internet.ICO.
1 2 3 4 5 6 7 8 9 10

Carpeta C:\CPP\QUIZ Unit1 QuizUnit Project1 QuizApp Form1 { Image1 { Left Top Picture
TImage est en la pestaa Additional de a n la Barra de Componentes.

0 0 (TIcon)
Pulsa los puntos suspensivos para abrir un cuadro de Dilogo en el que a podrs elegir el icono que elegiste. a

3. El cdigo fuente. Son en verdad muy pocas l o neas, compralas con el programa de consola original. Observa a tambin que no se piden los datos al usuario: se extraen e de los componentes y las respuestas se ponen en etiquetas; aqu no hay cin ni cout. 9

11 12 13 14 15

AutoSize true } * est en la pesta a Timer1 { TTimerde Componentes. na Barra Enabled false Interval 2 @ OnTimer

System de la

16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63

++Image1->Left; if(Image1->Left > 450) { Image1->Left = 0; } @ } Button1 { Caption "&Animar" Left 0 Top 48 Default true @ OnClick Timer1->Enabled = !Timer1->Enabled; @ * @ OnClick // Este cdigo reemplaza al anterior o if(Timer1->Enabled) { Timer1->Enabled = false; Button1->Caption = "&Animar"; } else { Timer1->Enabled = true; Button1->Caption = "&Detener"; } @ * }
TTrackBar est en la pesta a TrackBar1 { la Barra de Componentes. na Left 80 Top 48 Min 1 Max 200 Frequency 10 Position 20 @ OnChange Timer1->Interval = TrackBar1->Position; @ } * Height 128 Width 490 BorderStyle bsDialog BorderIcons { biMaximize false } Win32 de No olvides regresar a la pestaa n Standard de la Barra de Componentes.

19 20 21 22 23 24 25

int a = 1 + (rand() % 10); int b = 1 + (rand() % 10); int r = a + b; ShowMessage(IntToStr(a) + " + " + IntToStr(a) + " = " + IntToStr(r)); }

Cada que llamas a rand() (de cstdlib) genera un n mero aleatorio distinto; el operador de mdulo % deu o vuelve el resto de la divisin entera. No olvides incluir el o archivo cstdlib fuera del evento. Cmo aprovechar esta idea para generar un programa o as que, en vez de presentar una cuenta completa, le ponga una al usuario, tome su respuesta y la calique? Una pelota rebotadora. El icono que has usado puede rebotar en los bordes de la forma; considera primero el caso unidimensional (haz que rebote en el eje x, digamos) y luego extindelo al plano (los rebotes en los ejes x y y son e independientes); procura que el evento OnTimer actualice slo un paso peque o cada vez. o n

11.

Y la consola?

Para hacer con BCB una aplicacin de consola (con la veno taja de contar con un editor ms decente que el Block de notas a y acceder a los recursos profesionales que ofrece BCB) hay que ir al men [ FileNew ] y elegir, en vez de u

} *

El resultado nal debe verse as en tiempo de dise o: n

Verdad que programar as es adictivo? Ahora es tiempo de que empieces a construir aplicaciones utiles por ti mismo. Aqu unas propuestas: Un tutor aritmtico. Crea una forma con un botn: e o
16 17

18

#include <cstdlib> void __fastcall TForm1::Button1Click(TObject *Sender) { using namespace std;

Vers algunas casillas de vericacin (3 en la versin a o o 5.0); asegrate de que la unica seleccionada sea Console u Application antes de pulsar el botn OK . o Cuando trabajes en una aplicacin de consola podrs cerrar o a los elementos propios de los componentes (como el Object Inspector y el Class Inspector). Como siempre, BCB te pedir dos nombres para guardar el a proyecto: el de la unidad y el del proyecto. Pero ahora s podrs a usar el mismo nombre para ambos, porque no hay archivos cuyos nombres se sobrepongan. Y, como cuando trabajabas con el antiguo comando BCB32, lo unico que tienes que conservar el es archivo CPP: todo lo dems que se genere (BPR, BPL, OBJ, TDS, OBJ, etc.) sena cillamente brralo. o Por ultimo, es aconsejable usar el IDE, cuando se traba ja con aplicaciones de consola, para editar y compilar; para la ejecucin es mejor invocar al .EXE desde una ventana del o Intrprete de Comandos. e 10

12.

Ms en consola: ltros a
1 2 3 4 5 6 7 8 9 10 11 12

Un ltro es un programa que toma elementos de su entrada (letras, n meros, palabras, renglones, etc.), realiza sobre ellos u un proceso (contarlos, sumarlos, elevarlos al cuadrado, pasarlos a may sculas, etc.) y emite el resultado a la salida: u
1 2 3 4 5 6 7 8 9 10

// square.cpp #include <iostream> using namespace std; int main() { int n; while(cin >> n) { cout << (n * n) << endl; } return 0; }

// sum.cpp #include <iostream> using namespace std; int main() { int s = 0; int n; while(cin >> n) { s += n; } cout << s << endl; return 0; }

Dado el programa anterior, qu producir este comando? e a


ECHO ocho nueve diez | LENGHT | SQUARE | SUM
1 2 3 4 5 6

Ejecutar un programa as es muy simple:


[C:\] 3 4 5 9 16 25 [C:\] [C:\] 49 64 81 [C:\] 121 144 169 SQUARE bye

ECHO 7 8 9 > digits.txt SQUARE < digits.txt

7 8 9 10 11

// cosine.cpp #include <iostream> #include <cmath> using namespace std; int main() { float f; while(cin >> f) { cout << cos(f) << endl; } return 0; }

ECHO 11 12 13 | SQUARE

Esta programa corre as :


[C:\] ECHO 30 45 90 > angles.txt [C:\] COSINE < angles.txt 0.154251 0.525322 -0.448074

SQUARE no reconoce bye como orden para nalizar la introduccin interactiva: es ms bien que no lo reconoce como int. o a El concepto de ltro es simple y exible: se pueden preparar los datos de entrada en un archivo de texto y luego enviarlo al programa; con esto evitamos capturarlos en cada ejecucin. o He aqu otro ltro:
1 2 3 4 5 6 7 8 9 10 11

Las funciones de cmath toman ngulos en radianes: a


8

cout << cos(f * M_PI / 180) << endl;

// lenght.cpp #include <iostream> #include <string> using namespace std; int main() { string s; while(cin >> s) { cout << s.lenght() << endl; } return 0; }

Con la correccin anterior, los ngulos se tomarn en grados: o a a


[C:\] ECHO 30 45 90 > angles.txt [C:\] COSINE < angles.txt 0.866025 0.707107 0

Este ltro extrae la l nea (rengln) ms larga de su entrada: o a


1 2 3

No slo ejecutarlo es simple, sino combinarlo: o


[C:\] ECHO dos tres cuatro >palabras.txt [C:\] LENGHT < words.txt 3 4 6 [C:\] LENGHT < words.txt | SQUARE 9 16 36

4 5 6 7 8 9 10 11 12 13 14

Los ltros se usan en combinacin para lograr resultados o complejos con un m nimo de programacin. o 11

15

// longest.cpp #include <iostream> #include <string> using namespace std; int main() { string s; string longest; while(getline(cin, s)) { if(s.size() > longest.size()) { longest = s; } } cout << longest << endl; return 0; }

13.

Para terminar

6 7

BCB ofrece un extens simo soporte para ayuda. Basta con colocar el cursor sobre cualquier palabra y pulsar Ctrl+F1 para entrar a la ayuda contextual en el lugar adecuado. Claro que toda la ayuda est en ingls, pero eso no debe a e deternenos sino todo lo contrario: sta es otra muy buena razn e o para aprender el idioma. . . Por cierto, hay muchos ejemplos para analizar en la carpeta C:\Archivos de programa\Borland\CBuilder5 \Examples\Apps. Es particular, dentro de la carpeta Apps hay varios muy interesantes: Canvas, ColorDlg, ImagView, ScrollBa, SysSound, TrayIcon y TwoForms. Y Ni hablar de la carpeta Games. . . Que te diviertas!

8 9 10 11

if(OpenDialog1->Execute()) { ShowMessage(OpenDialog1->FileName); } @ } *

16.

A n no te has ido? u

Acabaste pronto? Realiza esta prctica calculadora: a

14.

Ir ms all a a
El componente RadioGroup tiene un atributo Items; en l podrs editar las cuatro operaciones mostradas. Este come a ponente garantiza que slo uno de sus botones podr ser seo a leccionado en un momento dado: el que indique el atributo ItemIndex.

Este taller ha pretendido motivarte para que te pongas a jugar con una herramienta moderna y potente para hacer aplicaciones GUI. Desde luego, programar profesionalmente requiere muy buenas bases de programacin, para aprovechar las caracter o sticas de la orientacin a objetos que ofrece C++ y sacarle el mximo o a provecho a las estructuras de la VCL. La referencia obligada para aprender C++ es El lenguaje de programacin C++, escrito por el creador del lenguaje, o Bjarne Stroustrup. Su texto, no obstante, es algo denso. Los libros de Deitel (como programar en C++) o de Schildt (C++. Manual de referencia) son bastante ms digeribles. a Sin duda alguna, la mayor fuente de aprendizaje ser la que a obtengas de tu propia experimentacin. o Cualesquier comentarios o sugerencias son bienvenidos: jjmb72@gmail.com. Animo, y el mayor de los xitos! e

17.

Extra: quieres dibujar?

El atributo Canvas (disponible slo en modo de dise o, no o n lo hallars en el ObjectInspector) nos brinda el acceso a toda a la potencia del GDI (Graphics Device Interface, Interfaz de dispositivos grcos) de Windows de una manera muy cmoda: a o
1 2 3 4

Form1 { @ OnClick Form1->Canvas->MoveTo(0, 0); Form1->Canvas->LineTo( ); Form1->Canvas->Ellipse(


Las coordenadas dadas son del rectngulo que encuadra a la a elipse. Se traza una lnea con el estilo actual de dibujo desde el LRP (Last Referred Poind, ltimoPunto U Referido) hasta el punto dado.

15.

La ultima y nos vamos

5 6 7 8 9 10 11 12 13 14 15 16 17 18 19

Form1->Width, Form1->Height

Veamos cmo abrir un archivo! o

80,180,120,260 ); Form1->Canvas->TextOut(100,200,"Hola"); @ Image1 { Picture "img.bmp";


Al pulsar los tres puntos se puede cargar (Load la imagen) deseada entiempo de diseo. n

En la pesta a Dialogs de la Barra de Herramientas se halla n el componente TOpenDialog. Haz la siguiente aplicacin o
1 2 3 4 5

20

21

Form1 { OpenDialog1 { InitialDir "." Filter @ OnClick


El punto (que seala al directorio n actual) har que el cuadro de dilogo a a se abra en la misma ubicacin del o archivo ejecutable.

22

23 24 25

Stretch true; @ OnClick Image1->Picture->LoadFromFile("img.bmp"); Image1->Stretch = false; Image1->Canvas->Rectangle( Image1->Width / 4, Image1->Height / 4, 3 * Image1->Width / 4, 3 * Image1-> Height / 4 ); Image1->Canvas->Pixels[200][200] = clBlack; @ } }

"Textos (*.txt)|*.txt"

12

Dentro de cada TCanvas, los atributos Pen, Brush y Font permiten especicar todas las caracter sticas con las que los comandos invocados sucesivamente trabajarn: a
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23

34 35 36 37

Image1->Canvas->Ellipse( a - w, b - w, a + w, b + w ); } is.clear(); string s; // Se extrae el tope "nodos" is >> s; Image1->Canvas->Pen->Width = 1; while(is >> a >> b) { Image1->Canvas->MoveTo( x[a], y[a] ); Image1->Canvas->LineTo( x[b], y[b] ); } } @ } }

Form1 { @ OnClick // La pluma controla lo que se traza Form1->Canvas->Pen->Color = clGreen; Form1->Canvas->Pen->Width = 5; // psDash psDot Form1->Canvas->Pen->Style = psSolid; Form1->Canvas->LineTo(100, 100); // La brocha controla lo que se rellena Form1->Canvas->Brush->Color = clRed; Form1->Canvas->Brush->Style = bsFDiagonal; // bsBDiagonal bsSolid // bsHorizontal bsVertical bsCross Form1->Canvas->Ellipse(100, 100, 200, 200); // Control del tipo de letra Form1->Canvas->Font->Color = clBlue; Form1->Canvas->Font->Size = 20; Form1->Canvas->Font->Style = TFontStyles() << fsBold << fsItalic << fsUnderline; Form1->Canvas->TextOut(150, 150, "Ejemplo"); @ }

38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54

He aqu un el archivo graph.txt:


1 2 3 4 5 6

50 50 50 100 50 100 150 50 150 nodos 0 1 1 2 6 7 7 8

100 100 100 3 4 1 4

50 150 100 150 150 150 4 5 4 7

18.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19

Un visor de grafos

Y cmo se ve el resultado nal: o

20 21 22 23 24 25 26 27 28 29 30 31 32 33

Carpeta C:\CPP\GRAPH Unit1 GraphUnit Project1 GraphApp Form1 { Caption "Haz click para cargar un grafo" OpenDialog1 { InitialDir "." DefaultExt "txt" Filter "Text (*.txt)|*.txt|Any (*.*)|*.*" } Image1 { Align alClient @ OnClick #include <fstream> #include <vector> #include <string> using namespace std; if(OpenDialog1->Execute()) { ifstream is(OpenDialog1->FileName.c_str ()); if(!is) { ShowMessage( "No se puede abrir [" + OpenDialog1->FileName + "]" ); return; } vector< int > x; vector< int > y; int a, b, w = 3; Image1->Canvas->Pen->Width = w; while(is >> a >> b) { x.push_back(a); y.push_back(b);

19.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18

Un visor de parbolas a

Carpeta C:\CPP\PARA Unit1 ParaUnit Project1 ParaApp Form1 { Height 421 Width 400 Edit1 { Left 0 Top 0 Width 305 Text "3x2-1x+2" Anchors { akRight true } } Image1 { Left 0 Top 24

13

19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41

Width 392 Height 369 Anchors { akRight true akBottom true } Stretch true } Button1 { Anchors { akLeft false akRight true } Caption "&Graficar" Left 312 Top 0 @ OnClick #include <sstream> using namespace std; istringstream is(Edit1->Text.c_str()); int a, b, c; char op, two, x; if(!(is >> a >> x >> op >> two >> b >> x >> c)) { ShowMessage( "[" + Edit1->Text + "] no es una ecuacin vlida" o a ); return; } int x0 = Image1->Width / 2; int y0 = Image1->Height / 2; Image1->Canvas->MoveTo(x0, 0); Image1->Canvas->LineTo(x0, Image1->Height ); Image1->Canvas->MoveTo(0, y0); Image1->Canvas->LineTo(Image1->Width, y0) ; for(int p = 0; p < Image1->Width; ++p) { int xh = p; int xm = xh - x0; int ym = a * xm * xm + b * xm + c; int yh = y0 - ym; Image1->Canvas->Pixels[xh][yh] = clBlack; } @ } }

Con un poco de entusiasmo, seguramente podrs desarrollar a aplicaciones muy atractivas con BCB. Todo est en que se a pongas a jugar con el paquete. Nuevamente, nimo y el mayor a de los xitos! e

20.

Ideario

Albert Einstein (18791955)

La imaginacin es ms poderosa o a que el conocimiento


Benito Pablo Jurez Garca (18031872) a

El que no espera vencer ya est vencido a


Leonardo da Vinci (14521519)

Tristo ` quel discepolo e che non avanza il suo maestro (Pobre del estudiante que no aventaja a su maestro)
Richard Bellman (19201984)

42 43 44 45 46 47 48 49 50 51

Una buena pregunta suele ser mejor que una buena respuesta
Boris Nikolaevich Delone (18901980)

Un alumno no es un recipiente que hay que llenar sino una antorcha que hay que encender
Edsger Wybe Dijkstra (19302002)

52 53

La computadora es a la computacin o lo que el telescopio a la astronom a


Juan Luis Daz de Len Santiago (1969) o

54 55 56 57 58 59

Es mejor equivocarse por actuar y experimentar que salvarse del error al precio de no hacer nada

60 61 62 63

21.

Retroalimentacin o

He aqu el resultado:

1. Es ejemplo de un evento estndar de Windows: a a) Pulsar un botn o b) Hacer click con el ratn o c) Recibir un dato por la conexin de red o d ) Todos los mencionados 2. Cdigo que, colocado en el evento OnClick del botn o o Button1, har que aparezca el contenido del campo de a edicin de texto Edit1 en el botn recin pulsado: o o e a) Button1->Caption = Edit1->Text; b) Button1->Text = Edit1->Caption; c) ShowMessage(Button1->Name); 3. Evento que se activa cada que el ratn se desliza sobre el o componente: a) OnMouseChange b) OnMouseMove c) OnMouseOver 14

4. Para que Button1 est deshabilidado desde el instante e mismo en que arranque la aplicacin, hay que poner: o a) desactivarlo en el evento OnClick del botn o b) su atributo Visible a false en el ObjectInspector c) su atributo Enabled a false en el ObjectInspector 5. Es un atributo de Button1: a) Text b) Caption c) Right 6. Poner Left = 0 en Button1 hace que: a) desaparezca del rea de visin de la forma a o b) aparezca pegado al borde superior de la forma c) aparezca pegado al borde izquierdo de la forma 7. Para que Timer1 se active cinco veces por segundo, el atributo Interval debe ser puesto a: a) 200 b) 5 c) 5000 8. Funcin que convierte la estatura en metros que el usuario o puso en Edit1 para poderla manipular numricamente: e a) Slo se puede hacer en consola o b) FloatToStr c) StrToFloat 9. Atributo que hay que modicar en Button1 para que sea el botn por omisin de la forma: o o a) Default b) ByDefault c) DefaultButton 10. Expresin que genera el valor aleatorio de un tiro de dado: o a) rand() % 6 b) 1 + rand() % 6 c) rand(6) 11. Entrada que har que cin >> x >> y valga true, sua poniendo que ambas variables son enteras: a) 10 20 b) 10, 20 c) 10; 20; 12. La imagen de la primera pgina muestra una aplicacin a o en modo de diseo. El cdigo que en ella gura muestra n o un ejemplo de validacin: o a) a priori b) a posteriori c) simple 13. Atributo de Form1 que en el ObjectInspector hay que modicar para que aparezca Hola en la parte superior de la forma: a) Name b) Caption c) Title 14. Componente que hay que colocar en la forma para que aparezca un texto que no pueda ser modicado: a) TLabel b) TText c) TDisplay 15. Para que pulsar Alt+S equivalga a activar el botn cuya o leyenda dice Proseguir hay que a) Poner &Proseguir en Button1->Caption b) Poner Pro&seguir en Button1->Legend c) Poner Pro&seguir en Button1->Caption La solucin est en alguna parte de la primera pgina de o a a este documento... encuntrala! e 15

22.

Retroalimentacin avanzada o

1. Haz un ltro que, para cada angulo real en grados que tome de su entrada, env a la salida su seno, y su cosee cante. Recuderda: las funciones de cmath trabajan con a ngulos en radianes. 2. Haz un programa de consola interactivo que calcule el area de un octgono regular dado su lado. a 3. Considera una forma con tres campos de edicin (en los o que el usuario deber meter nmeros reales) y dos botoa u nes: Mximo y M a nimo. Cada botn, al ser presioo nado, deber cambiar su propio texto para que diga el a n mero mayor o menor de los introducidos. Por ejemplo, u si los datos fueron 3.14162, 2.71828 y 1.61805, al pulsar Mximo se convertir en Mximo: 3.1416 y al pulsar a a a M nimo deber pasar a ser M a nimo: 1.61805. Qu cdigo hay en los mtodos ButtonNClick? e o e 4. Al realizar el programa con este dise o, qu hace? n e
1 2 3 4 5 6 7 8 9

Form1 { TEdit1 TButton1 { @OnClick float x = StrToFloat(TEdit1->Text); ShowMessage(FloatToStr(x+1)); @ } }

5. Y este dise o, qu programa produce? n e


1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32

Form1 { Label1 { Caption "" } @OnClick #include <fstream> AnsiString InputString = InputBox( "Visor de archivos", "Archivo", "" ); if(InputString == "") { ShowMessage( "Hay que especificar un archivo" ); return; } using namespace std; ifstream is(InputString.c_str()); if(!is) { ShowMessage( "[" + InputString + "] no se puede abrir" ); return; } char c; AnsiString s; while(is.get(c)) { s += c; } Label1->Caption = s; @ }

Hasta pronto!

You might also like