Está en la página 1de 132

Tutorial BORLAND C++Builder de programacion

UNIDAD I C++BUILDER PROGRAMACION VISUAL ELEMENTOS BASICOS

1.- INTRODUCCION PROGRAMACION C++BUILDER

Los nuevos sistemas de información son costosos en tiempos y recursos, la solución moderna de sistemas
de información exigen nuevas herramientas y metodologías para resolver rápida, económica y eficiente los
problemas de información planteados por las organizaciones.

Aun mas el pleno potencial del hardware no es aprovechado plenamente y existe un considerable retraso
con el software y sus aplicaciones, generando lo que se conoce como “crisis del software”.

En programación tradicional, modular o estructurada un programa describe una serie de pasos a ser
realizados para la solución de un problema, es decir es un algoritmo.

En programación orientada a objetos ( OOP ) un programa es considerado como un sistema de objetos


interactuando entre sí, ambientes de desarrollo visuales facilitan aun más la construcción de programas y
solución de problemas, porque permiten abstraer al ingeniero de software de todo el GUI (interfase gráfica)
del problema, que constituye más del 60% del código normal de un programa.

Es decir, en programación modular o estructurada un problema sencillo de información es descompuesto en


una serie de módulos(llamados procedimientos o funciones) donde cada uno de ellos realiza una tarea
específica, por ejemplo uno de ellos captura los datos, otro resuelve operaciones, etc.

En OOP todo problema aun aquellos sencillos de información, se consideran y resuelven como módulos de
código gigante (clase) que contiene todo el código necesario(variables, procedimientos, funciones,
interfaces, etc.) para solucionar el problema.

En programación visual( que también es heredera de OOP ),la interfase con el usuario( pantallas) son
generadas por el propio compilador y el ingeniero de software solo se concentra en resolver el problema
planteado.

C++Builder, es un compilador que permite usar cualquiera de los tres enfoques en la solución de problemas
de información que puedan y deban ser resueltos empleando el computador y el lenguaje.

Para propósitos de aprendizaje usaremos el tercer enfoque, es decir programación en ambientes visuales y
usando el lenguaje de programación C++Builder.

2.- MODELO DE SOLUCION C++BUILDER

En general un problema de información es posible entenderlo, analizarlo y descomponerlo en todos sus


componentes o partes que de una u otra manera intervienen tanto en su planteamiento como en su solución.

Una herramienta rápida que nos permite descomponer en partes un problema para su solución, es el
llamado modelo de solución, este consiste de una pequeña caja que contiene los tres elementos más básicos
en que se puede descomponer cualquier problema sencillo de información, estas tres partes son:

1. LA PRIMERA PARTE son todos los datos que el computador ocupa para resolver el problema, estos
datos son almacenados internamente en la memoria del computador en las llamadas variables de entrada.
2. LA SEGUNDA PARTE son todas las operaciones generalmente algebraicas necesarias para solucionar el
problema, generalmente esta parte del modelo es una formula (o igualdad matemática, ej. X= y + 5).

3. LA TERCERA PARTE es el resultado o solución del problema que generalmente se obtiene de la parte
de operaciones del modelo y dichos datos están almacenados en las llamadas variables de salida.

En resumen para todo problema sencillo de información es necesario plantearse las siguientes preguntas:

Que información o variables de salida se van a desplegar en pantalla para responder al problema planteado
originalmente?

Variables es el nombre de una localidad o dirección interna en la memoria del computador donde se
almacenan los datos, ejemplo de variables para los casos del inciso anterior, CIUDAD, DIRECCION,
EDAD, SUELDO, ETC.

Información son datos ya procesados que resuelven un problema planteado.

EJEMPLO DE MODELO DE SOLUCION

Construir un modelo de solución que resuelva el problema de calcular el área de un triángulo con la
formula área igual a base por altura sobre dos.

UNIDAD 5.- C++BUILDER COMPONENTES

Variable(s) Entrada Proceso u operación Variable(s) salida


BASE ALTURA AREA = BASE * ALTURA / 2 AREA

TAREAS PROGRAMACION C++BUILDER

PROBLEMA 2.- CONVERTIR LA EDAD EN AÑOS DE UNA PERSONA A MESES.

PROBLEMA 3.- CONVERTIR PESOS A DOLARES.

PROBLEMA 4.- CALCULAR EL AREA DE UN CIRCULO CON LA FORMULA

PROBLEMA 5.- EVALUAR LA FUNCION PARA CUALQUIER VALOR DE X.

Pero recordar también que existirán problemas sencillos donde:

*No se ocupan entradas o no se ocupan operaciones, pero todos ocupan salida.

* Una formula grande o muy compleja puede ser más segura y fácil de resolver, si es descompuesta y
resuelta en partes, juntando al final los parciales para obtener el resultado final.

* Un problema puede tener más de una solución correcta.

* El problema no esta suficientemente explicado o enunciado, entonces, estudiarlo, analizarlo y construirlo


de manera genérica.

PROBLEMAS SUGERIDOS:

Construir los modelos de solución de los siguientes problemas:


PROBLEMA 6.- Convertir millas a kilómetros(caso normal)

PROBLEMA 7.- Convertir 125 metros a centímetros(no ocupa entradas)

PROBLEMA 8.- Se calcula que en promedio hay 4.7 nidos en cada árbol en la UABC, también se calcula
que en cada nido existen un promedio de 5.8 pájaros, se pide calcular la cantidad total de nidos y de pájaros
en los 227 arboles que existen en la UABC. (no ocupa entradas)

PROBLEMA 9.- La gorda Sra. López y sus 8 hijos solo compran una vez al mes su mandado en conocido
supermercado, en dicha tienda el kilogramo de frijol cuesta $8.75, el paquete de tortillas cuesta $3.55 y el
frasco de café vale $14.25, si solo compran de estos tres productos para su mandado, calcular su gasto total.
( problema no claro)

PROBLEMA 10.- Capturar y desplegar los cinco datos mas importantes de un automóvil(no ocupa
operaciones)

PROBLEMA 11.- La distancia Tijuana - Ensenada es de 110 kilómetros. Si un automóvil la recorre a una
velocidad constante de 30 millas por hora, cuanto tiempo tarda en llegar. ( 1 milla = 1.609 Km.) (dos
maneras correctas de

resolverlo).

PROBLEMA 12.-Evaluar la función para cualquier valor de x.(caso normal).

PROBLEMA 13.-Evaluar la función para cuando x vale 4 . (no ocupa entradas).

3.- C++BUILDER VARIABLES

Identificadores son conjuntos de letras y/o números que se utilizan para simbolizar todos los elementos que
en un programa, son definibles por el usuario (programador o ingeniero de software) del mismo, como son
las variables donde se almacenan datos, funciones( pequeños módulos con código), etiquetas, clases,
objetos, etc.

En C++Builder un identificador es una palabra compuesta de letras y/o números de hasta 32 caracteres
significativos, empezando siempre con una letra.

Una variable se define como un identificador que se utiliza para almacenar todos los datos generados
durante la ejecución de un programa.

Existen ciertas reglas en cuanto a variables:

* Claras y con referencia directa al problema. *

* No espacios en blanco, ni símbolos extraños en ellas. *

* Se pueden usar abreviaturas, pero solo de carácter general.

No deben ser palabras reservadas del lenguaje.

Ejemplos de buenas variables:


Nombre, Edad, SdoDiario, IngMensual, Perímetro, Calif1, etc.

4.- TIPOS DE DATOS C++BUILDER

A toda variable que se use en un programa, se le debe asociar (generalmente al principio del programa) un
tipo de dato específico.

Un tipo de dato define todo el posible rango de valores que una variable puede tomar al momento de
ejecución del programa y a lo largo de toda la vida útil del propio programa.

Los tipos de datos más comunes en C++Builder son:

Tipo Tamaño Rango

unsigned char 8 bits 0 a 255

char 8 bits -128 a 127

short int 16 bits -32,768 a 32,767

unsigned int 32 bits 0 a 4,294,967,295

int 32 bits -2,147,483,648 a 2,147,483,647

unsigned long 32 bits 0 a 4,294,967,295

enum 16 bits -2,147,483,648 a 2,147,483,647

long 32 bits -2,147,483,648 a 2,147,483,647

float 32 bits 3.4 x 10-38 a 3.4 x 10+38(6 dec)

double 64 bits 1.7 x 10-308 a 1.7*10+308(15 dec)

long double 80 bits 3.4 x 10-4932 a 1.1 x 10+4932

AnsiString cadena de caracteres

AnsiString no es propiamente un tipo de dato, sino una clase que se especializa en al almacenamiento y
manipulación de datos de tipo string, es decir, como clase ya contiene toda una serie de métodos
(procedimientos y funciones) que pueden usar directamente las variables(objetos) que se declaren de tipo
AnsiString, como en el siguiente ejemplo;

área de declaración carga normal de variables strings (que antes no se podía hacer directamente en C o C+
+)

procesos con las variables ya considerándolas como objetos de la clase AnsiString estos procesos antes
ocupaban una librería especial llamada < string.h > * Interesante este nuevo tipo (Clase) AnsiString y
también interesante estos dos métodos ( LowerCase() y ToInt() ), el resto de métodos, se deben buscar en la
ayuda del C++Builder (solo abrir folder o libro llamado “referencia del programador”, pedir índex y
luego escribir AnsiString ).

5.- C++ BUILDER OPERADORES ARITMETICOS

Un operador es un símbolo especial que indica al compilador que debe efectuar una operación matemática
o lógica.

C++Builder reconoce los siguientes operadores aritméticos:

Operador Operación

+ Suma

- Resta

* Multiplicación

/ División

% Residuo o Módulo

Como notas importantes a recordar siempre;

* En problemas de división entre enteros, C++ trunca la parte residual, es decir:

// área de declaración de variables

float a;

// área de operaciones

a = 10 / 4;

// área de despliegue de resultados

desplegar a; --> En pantalla sale ( 2.000000 )

El problema no es el tipo float, sino que por definición de la división entre enteros C++ siempre trunca la
parte residual, mas adelante se indica como se resolverá este problema.

El operador (%) devuelve el residuo entero de una división entre enteros, ejemplo:

área de despliegue Otro ejemplo; Para resolver los problemas de potencias y raíces, se usan ciertas
instrucciones especiales que proporciona el lenguaje, llamadas funciones matemáticas, en C++ existe toda
una librería de instrucciones o funciones matemáticas. Recordar que todas las funciones reciben uno o
más datos o valores y regresan siempre un resultado, una de estas funciones matemáticas es: Esta función
ocupa dos valores o datos( base y exp) ambos de tipo double, y regresa un resultado también de tipo
double, ejemplo; - resolver el problema de calcular Para resolver el problema de raíces, se aprovecha
una de las mas elementales y conocida de las leyes de exponentes que dice: Es decir una raíz
cualquiera se puede transformar a una potencia con un exponente fraccionario. Ejemplo: problema y = 3
√x esto es equivalente a entonces: y=3 * pow(double(x),double(1/2.0) ); * En este ejemplo se
esta dando por supuesto que no interesa el tipo de dato que requiere la función pow() para trabajar
correctamente

6.- C++BUILDER OPERADOR CAST

Se puede forzar un dato, variable o una expresión a convertirse o cambiarse a un nuevo tipo de dato.

El operador cast realiza este proceso, es decir convierte datos, variables o expresiones a un nuevo tipo de
dato, su formato es:

Ejemplo:

int (3.1416);

* en este ejemplo se está convirtiendo un float a int, recordar que en este caso ya no se tendrán los
decimales.

Como nota importante este operador resuelve los dos problemas pendientes:

1. El de la división entre enteros.

2. El tipo de dato especifico que requieren las funciones.

En toda división recordar agregar a uno de los dos valores el (.0), solo que los dos elementos sean variables
entonces usar el operador cast con una de ellas.

Se puede usar pow(), directamente con los datos, argumentos o parámetros requeridos , si estos son
numéricos, pero transformándolos con el operador cast.

Esto también va a permitir evaluar expresiones matemáticas de manera mas directa y sencilla, solo
recordando usar un pow() por cada potencia y cada raíz de la ecuación, ejemplo:

TAREAS PROGRAMACION C++BUILDER :

1.

2.

3.
7.- C++BUILDER JERARQUIA DE OPERACIONES

El problema de no tomar en cuenta la jerarquía de los operadores al plantear y resolver

una operación casi siempre conduce a resultados muchas veces equivocados como estos:

Ejemplos:

1.

2. 2+ 3* 4 = 20(incorrecto) = 14 (correcto)

b) si calif1=60 y calif2=80

Recordar siempre, que antes de plantear una formula en un programa se deberá evaluar contra el siguiente:

Nota: Si se quiere alterar el orden normal de operaciones, entonces usar paréntesis.

Nota: Tampoco es bueno usar paréntesis de mas en una operación, esto solo indica que no se evalúo bien la
formula, como en el siguiente ejemplo;

aquí los paréntesis están de mas, porque por orden de operaciones, multiplicación y división tienen la
misma jerarquía y entonces se resuelven de izquierda a derecha, en otras palabras ni que falten paréntesis ni
que sobren paréntesis.

8.- C++BUILDER ENTRADAS/SALIDAS EN PROGRAMACION VISUAL

Entradas o capturas de datos y salidas o despliegues de información o resultados son de los procesos más
comunes en cualquier tipo de problema de información, estos procesos o instrucciones varían de acuerdo a
los lenguajes y ambientes de programación a usar.

El lenguaje y ambiente de programación a utilizar, es de tipo visual, y muchos de los problemas asociados a
entradas y salidas se encuentran ya resueltos por el propio compilador.
El ambiente de construcción de programas a usar, es el siguiente:

* SOLO CARGARLO EN PANTALLA EJECUTANDO EL C++Builder, QUE SE ENCUENTRA

EN LA BARRA DE START DE WINDOWS.

Sus elementos básicos son:

1.- La barra de menús (file, edit , etc.);

2.- La barra de herramientas(icono de grabar, run, forma, etc.)

3.- La barra de componentes

4.- El Inspector de Objetos

5.- La forma activa o principal

9.- C++BUILDER FORM1 ACTIVA O PRINCIPAL

Es sobre esta forma donde se construye el programa y esta forma se convierte en ventana al momento de
ejecutarse el programa.

Es decir será la primera ventana que el usuario ve al momento de ejecutarse el programa, su nombre es
Form1.

Esta forma o ventana es un objeto de C++, y como todos los objetos de C++ y del universo, la forma o
ventana tiene asociados propiedades y eventos.

Propiedades son todas las características particulares que diferencian un objeto de otro objeto, las
propiedades o características mas comunes son forma, tamaño, color, etc., para objetos en C++, estas
propiedades se modifican o individualizan usando el Inspector de Objetos, que es la parte del programa que
las contiene.

También se pueden modificar las propiedades dentro de un programa, usando instrucciones apropiadas,
mismas que llevan el siguiente formato:

nomobjeto→propiedad = nvovalor;

ej.; Form2→Color=clRed;

Eventos, son todos aquellos sucesos de carácter externo que afectan o llaman la atención del objeto, para
estos caso la forma o ventana:

1. Debe tener capacidad de detectar el evento

2. Aun mas importante debe tener capacidad de reaccionar y emitir una respuesta, mensaje o conducta
apropiada a el evento detectado.

Evento es por ejemplo que otro objeto llamado humano, pulse el objeto tecla ESC, o haga click derecho
con el objeto ratón en alguna parte de la ventana , etc. , es en estos casos, cuando la ventana detecta un
evento de estos, la propia forma deberá responder de manera apropiada.

Esta respuesta no es automática, sino son la serie de instrucciones del lenguaje (o programa) que los
ingenieros de software diseñan(o programan), en otras palabras son los eventos quienes contendrán los
programas.

Es tambien el Inspector de Objetos, quien contiene todos los posibles eventos asociados a la forma.

Para los primeros programas en C++Builder , solo se usaran propiedades sencillas como color, font, etc. de
Form1, y no se usan, de momento los eventos que puede detectar Form1.

10.- C++BUILDER PROGRAMAS FORMAS Y COMPONENTES


Un programa o problema de información en C++Builder , no es mas que una o mas formas o ventanas,
donde cada una de ellas contiene elementos u objetos especiales llamados componentes, dichos
componentes C++Builder los proporciona a través de la barra de componentes.

Es decir toda la interfase que se quiera manejar con el usuario del programa, no consiste mas que de una
colección de componentes agrupados en una forma o ventana.

La colección de componentes que pone a nuestra disposición C++Builder están agrupados en diversos
folder o pestañas o paginas en la barra de componentes, estas categorías contienen los siguientes
componentes:

Standard.- MainMenu, PopupMenu, Label, Edit, Memo, Button, CheckBox, RadioButton, ListBox,
ComboBox, ScrollBar, GroupBox, RadioGroup, Panel.

Win95.- TabControl, PageControl, TreeView, ListView, ImageList, HeaderControl, RichEdit,


StatusBar,TrackBar,ProgressBar,UpDown,HotKey.

Additional.- BitBtn, SpeedButton, MaskEdit, StringGrid, DrawGrid, Image, Shape, Bevel, ScrollBox.

Data Access.- DataSource, Table, Query, StoredProc, DataBase, Session, BatchMove, UpdateSQL.

Data Controls.- DBGrid, DBNavigator, DBText, DBEdit, DBMemo, DBImage, DBListBox,


DBComboBox, DBCheckBox,DBRadioGroup, DBLookupListBox, DBLookupComboBox.

Win31.- DBLookupList, DBLookupCombo, TabSet, Outline, Header, TabbedNotebook, NoteBook.

Dialogs.- OpenDialog, SaveDialog, FontDialog, ColorDialog, PrintDialog, PrinterSetupDialog,


FindDialog, ReplaceDialog.
System.- Timer, PaintBox, FileListBox, DirectoryListBox, DriveComboBox, FilterComboBox,
MediaPlayer, OleContainer, Ddeclientconv, DdclientItem, Ddeserverconv, DdeserverItem.

QReport.- QuickReport, QRBand, QRGroup, QRDetailLink, QRLabel, QRMemo, QRDBText, QRDBCalc,


QRSysData, QRShape, QRPreview.

ActiveX.- ChartFX.

Para incorporar un componente a una forma solo basta seleccionarlo con un click derecho en su icono y
luego colocar el cursor dentro de la forma en el lugar donde se quiere que aparezca y volver a hacer un
click derecho.

También los componentes son objetos de C++Builder y como tales también tienen asociados propiedades y
eventos, tales como los tiene la forma principal, solo que existen pequeñas variaciones en cuanto a sus
propiedades y eventos propios con respecto a Form1.

Recordar además, que es el Inspector de Objetos en primera instancia quien permite asociar o modificar
propiedades especificas tanto a una forma como a un componente.

Ya en segunda instancia las propiedades de formas y componentes se pueden modificar también


directamente dentro de un programa, usando instrucciones como las ya descritas en párrafos muy
anteriores.

Analizaremos ahora los dos primeros componentes, que también se usaran para construir o diseñar nuestro
primer programa en C++Builder y Visual.

11.- COMPONENTE LABEL C++BUILDER (Standard)

Este componente se utiliza para desplegar textos o mensajes estáticos dentro de las formas, textos tales
como encabezados, solicitud al usuario del programa para que proporcione algún dato o información(edad,
dame sueldo, etc.), en cierta forma hace las funciones de printf, cout, writeln, print, display, etc., pero solo
cuando se consideran en su parte de mensajes.

También es un objeto en C++Builder y por tanto tiene asociados sus propias propiedades y eventos, al
mismo tiempo como se está usando dentro del objeto form1, muchas propiedades que se definan para el
objeto Form1, el objeto Label1 las va a heredar.
Si bien es cierto que el objeto se llama Label, pero cuando se ponen dentro de una forma C++Builder los va
numerando automáticamente, si se ponen tres Labels en Form1, ellos se llaman o simbolizan o se procesan
o programan con Label1, Label2, Label3.

Es la propiedad Caption, la que lleva el contenido del mensaje que se quiere desplegar en la pantalla, solo
click derecho a un lado de la propiedad Caption en el Inspector de Objetos, teniendo seleccionada la caja
Label1 en la forma y escribir el texto indicado.

12.- COMPONENTE BUTTON C++BUILDER (Standard)

Es el componente principal de la forma, contiene el código principal del programa y su activación por el
usuario provoca que se realicen los principales procesos del problema planteado (aquí es donde se capturan
datos, se realizan operaciones, etc.).

De este componente se maneja su propiedad Caption para etiquetarlo con la palabra “OK” o “ACEPTAR”
o “EXE” , y su evento OnClick para activarlo, es en dicho evento donde se construye el código del
programa.

Recordar que aunque no es un componente necesario en los programas, ya que el código se puede asociar o
pegar a cualquier evento de cualquier forma, o componente del programa, Microsoft ya acostumbro a todos
los usuarios al botón OK, de acuerdo, OK.

Este botón también puede activar su evento OnClick, cuando el usuario presione la tecla <ENTER>, solo
poner la propiedad Default en true, en este caso el botón de ordenes, se le conoce como botón de default.

Igualmente puede activar su evento OnClick cuando el usuario, presione la tecla <ESC>, solo poner la
propiedad Cancel en true, a este caso se le conoce como “CANCEL BUTTON”.

PRACTICA

Construir un primer programa que consiste en un forma que contenga los cinco datos mas importantes de
un automóvil, y uno de esos datos solo deberá aparecer cuando el usuario haga click en el botón de
ejecución o de orden o de OK.

Para este programa se ocupa, una forma, dos componentes labels para encabezados apropiados al problema,
10 componentes labels para textos y datos, un componente Button.

Para el ultimo componente Label su propiedad Caption se dejara en blanco o vacía para que sea el usuario
del programa quien lo cargue al apretar el botón de ordenes o botón de OK.

Recordar que C++Builder va numerando automáticamente todos los componentes en el programa en forma
consecutiva, es decir al finalizar el diseño del programa se tendrán, los componentes form1,
label1,label2,label3,..button1.

El procedimiento completo para crear y ejecutar el programa es:

3.- Antes de poner el primer componente usar la opción, File Save Project As, aparece la siguiente ventana:
Donde se deberá seleccionar primero, el icono de nuevo folder( arriba a la derecha y tiene un folder con
rayitos), esto es, para crear un nuevo folder o directorio donde quedara guardado o almacenado el
programa, en cuanto se crea el nuevo folder, sobrescribir la palabra “new folder” que aparece, con el
nombre que tendrá el directorio donde quedara almacenado el programa, escribir por ejemplo “programa
uno” ( Windows95 ya permite que los nombres de directorios y sus archivos ya sean mas largos y no
necesariamente del tipo antiguo de 8.3), al terminar de sobrescribir, la palabra “programa uno” apretar tecla
<ENTER> y esperar un momento a que se cree el directorio.

Ya creado y renombrado el directorio, observar que en la parte inferior de la ventana el programa ya tiene el
nombre de “Unit1.cpp”, a un lado esta una caja o botón de “OPEN”, mismo que se deberá apretar y
después usar en la misma parte un botón llamado “SAVE” para almacenar “Unit1.cpp” y otra vez usar otro
botón “SAVE” para almacenar “Project1.mak”.

4.- Ahora ya que se tiene Form1 en pantalla, recordar que se pueden modificar sus propiedades como color,
font, etc. usando el Inspector de Objetos que esta a un lado de la forma ( se sugiere practicar un poco esto),
los cambios que se hacen en el Inspector de Objetos se van reflejando automáticamente en la forma en
pantalla y también en la ventana que el usuario vera al ejecutarse el programa.

5.- Ahora se selecciona con un click el componente llamado Label en la barra de componentes y luego
poner el cursor dentro de la forma en el lugar donde se quiera que aparezca el componente, y volver a hacer
click con el ratón para que ya aparezca dicho componente en la forma.

Observar que el componente en la forma, que esté seleccionado ( esto se puede hacer, usando un click
dentro de el componente) se puede arrastrar para cambiarlo de lugar o posición o hacerlo mas pequeño o
mas grande.

Como nota también a recordar siempre, un componente o la propia forma, está seleccionado, si el Inspector
de Objetos lo esta referenciando, es decir es el Inspector de Objetos quien contiene el nombre del
componente en la parte de arriba del propio Inspector de Objetos.

Para cargar o para que despliegue un texto el componente Label1, solo escribir dicho texto en la cajita que
esta a un lado de la propiedad Captión en el Inspector de Objetos, por ejemplo para el problema, escribir la
palabra “AUTOS ECONOMICOS”, y recordar que también esté componente también tiene propiedad font
que se puede usar para alterar el tipo de letra que despliega el componente.

6.-Repetir el procedimiento anterior hasta tener los doce componentes Label bien acomodados y
organizados en la forma y con sus textos correspondientes, solo recordar dejar el componente Label12 con
su propiedad Caption en blanco(usando tecla backspace).
7.- Seleccionar y acomodar ahora un componente Button en la forma y colocarlo en la esquina inferior
derecha, en su propiedad Caption = escribir la palabra “OK”.

Recordar que este componente, es quien contiene el código del programa y mas específicamente es su
evento OnClick quien lo contiene y quien además lo activa o lo ejecuta.

Para añadirle el código(en este ejemplo que cargue el Caption de Label12 al tiempo de ejecución del
programa y por decisión del propio usuario) existen dos maneras:

En el Inspector de Objetos, hacer click en la pestaña o folder llamado event y ahora en lugar de propiedades
el Inspector de Objetos, muestra todos los eventos que el componente puede detectar(observar y anotarlos),
ahora click en la cajita que esta a un lado del evento llamado OnClick y con este paso aparece el siguiente
minieditor de programas de C++Builder:

Observar que ya trae listo el evento Button1Onclick(), para programarse y es dentro de sus llaves donde se
construye el programa.

Solo escribir dentro de las llaves la instrucción Label12→Caption=“$ 5,000.00”;

8.- Ahora ya esta lista la forma o programa para ejecutarse, también existen dos maneras:

1.

2. Usar la opción Run que esta arriba en la barra de menús. 3.

4. Usar icono “run” en barra de

herramientas.

Nota.- También se puede usar también la primera letra dentro del botón de comando o de ordenes (OK),
para activar las instrucciones o acciones del botón, es decir se puede usar click en botón o solo pulsar la
letra O, para que se ejecute este ultimo procedimiento , solo poner un símbolo & en el caption del botón
antes de la letra O.

El programa ya en ejecución debe ser similar(pero mejor diseñado) al siguiente ejemplo:


Ya que se practicó, la mecánica de creación de programas, resolveremos el problema de interactividad con
el usuario.

Es decir en estos casos es el usuario quien generalmente proporciona los datos para su procesamiento en el
problema, el trabajo del ingeniero de software, es procesarlos y darles sentido, coherencia y sobre todo
eficiencia.

Para esto se ocupan , componentes llamados de “input”, “entrada” o “captura”, que permitan al usuario
cargar o proporcionar un dato en ellos, dichos componentes son:

13.- COMPONENTE EDIT C++BUILDER (Standard)

Este componente es el mas importante componente visual, su función principal es manejar , todos los
procesos de entrada y salida (input/output) al programa.

En resumen de este componente, se necesita entender lo siguiente:

Este componente Edit, es el equivalente a las variables en cualquier lenguaje de programación, mas la
instrucción de captura o despliegue correspondiente, es decir;

a) En BASIC, Input Edad → Edit1

b) En PASCAL, Read(Ciudad) → Edit2

c) En C, printf(”%d”, sueldo) → Edit3

d) En C++, cin.get(nombre,30) → Edit4

e) En Cobol Display metros → Edit5

Ya aclarada su función, es necesario entender primero, que este componente permite capturar datos y
también como en el caso del componente Label desplegar datos, textos, mensajes o resultados de
operaciones de ser necesario, usando la propiedad Text del componente Edit.

Esta propiedad Text, así como la propiedad Caption en Label, permiten igualarse a muchos procesos
básicos, es decir es fácil igualar Text o Caption a un dato, una variable, otro Text u Caption, o una
expresión algebraica normal, como en los siguientes ejemplos;

Edit2->Text = 5;

Label3->Caption = "PATO";

Edit4->Text = 3 * 6.2 ;
En principio su valor de default es la palabra Edit1 y es en su propiedad Text donde se modifica,
generalmente al principio de un programa se deja en blanco, y al ejecutarse el programa, el usuario lo llena
con los datos solicitados o el programa lo llena con el resultado de las operaciones.

Cuando un usuario lo carga con un dato, recordar que el dato almacenado queda de tipo texto, no importa lo
que haya escrito el usuario.

Para resolver el problema de usar datos numéricos dentro del Text de un componente Edit, en operaciones
matemáticas, solo agregarle a la propiedad Text, las funciones .ToInt() o .ToDouble(), como se muestra en
los siguientes ejemplos.

Edit3->Text= Edit2->Text.ToInt() * 5;

Edit5->Text= 3 * pow( Edit2->Text.ToDouble(), double (4) );

este ultimo es el problema de calcular

En particular, se deberá asociar los Edit con las variables, y solo existirán en principio cuatro tipo de edits.

Formato Edit Tipo De Dato Ejemplo

Edit→Text String Nombre, Ciudad

Edit→Text[1] Char Grupo, Sexo, Letra

Edit→Text.ToInt() Entera Edad, Año

Edit→Text.ToDouble() Doble Sueldo, Pi

Realizar operaciones algebraicas con los componentes edit.

Recordar que el usuario, usara un componente Edit para almacenar los datos de entrada del problema,
muchas veces estos datos son de tipo numérico, por ejemplo en un componente Edit se almacena la
cantidad de pesos, el precio de un articulo, la edad de una persona, etc.

Solo recordar siempre usar el componente Edit, directamente como una variable cualquiera(con su método
o función correspondiente ) y construir la operación o formula con los propios componente o cajas edit.

Es decir, por ejemplo, si se pide resolver el problema de multiplicar dos números cualesquiera, se ocuparan
tres ` cajas Edit,(factor1, factor2, producto), es en estos casos donde se usan tres componentes Edit como si
fuesen tres variables simples directamente.

Ya en programa se ocupan 3 componentes Label para títulos (Multiplicando, Multiplicador,


Multiplicación), tres componentes Edit para los datos (dos proporcionados por el usuario y uno calculado
por el programa) y un componente Button(OK) para realizar la operación.

El problema se resuelve de la siguiente manera;


Código y Pantalla de salida es ;

void __fastcall TForm1::Button1Click(TObject *Sender)

Edit3->Text=Edit1->Text.ToInt() * Edit2->Text.ToInt();

notas:

Conversión de datos o variables numéricas a Texto de un componente Edit.

Para resolver este problema, donde se tiene una variable numérica cargada, con un resultado o dato
numérico y se pretende mandarla a un componente Edit o Label para su despliegue, existen dos manera
sencillas, estas son;

// área de declaración

int alfa;

double beta;

// área de captura

alfa = Edit1->Text.ToInt();

beta = Edit2->Text.ToDouble();

// área de operaciones

alfa = alfa+3;

beta = beta *5.1;

// área de despliegue y conversión de números a strings o Edits

Label3->Caption = AnsiString(alfa);
Edit4->Text = AnsiString(beta);

Como se observa se puede transferir variables numéricas tanto a Label


como a Edit vía la clase AnsiString.

<code>

sin embargo es mas sencillo usar el método que se usa en el programa


dado
de ejemplo para la multiplicación, es decir considerar los componentes
Edit como variables normales, y usar:

<code>

Edit1->Text=Edit5->Text.ToInt(() * Edit2 etc - Edit50 etc

Recordar que es mas correcto usar propiedad Text y métodos ToInt() y ToDouble()), y cargar directamente
la caja del Edit resultado.

De nuevo, Edit→Text o Label→Caption permiten que se igualen a una variable, un dato, o una expresión,
es decir es valido;

Para el caso de resultados decimales , la salida incluye todo el conjunto de decimales asociados a un tipo
double(muchos ceros), para resolver este problema se pueden usar directamente algunos de los métodos
asociados a la clase AnsiString , por ejemplo uno de esos métodos es;

FormatFloat(“string de formato”, var double);

La string de formato contiene una serie de simbolos literales que se utilizan para darle el formato de salida
deseado, esto simbolos o constantes literales son;

Const. Lit. Significado

0(cero) Rellena con 0(ceros) todas las posiciones indicadas, ejemplo “0000.00” para el numeró 23.4 la
string de salida seria 0023.40

# Constante muy usada para formato de valores numéricos, esta constante solo despliega el valor numérico
normal.

. Se utiliza para separar la parte entera de la parte decimal.

,(coma) Se utiliza para separar el valor numérico en

UNIDADes de millar.

E+, E-, e+, e- Se utilizan para convertir a notación científica exponencial el valor de salida.

Notas;

El valor de salida es redondeado a tantos decimales como 0s, o #s, existan en la string de formato.
Si la string de formato no incluye un punto decimal, entonces el resultado es redondeado al valor entero
mas cercano.

ejemplo;

button1click(---){

// área de declaración

double alfa;

// captura y conversión

alfa = Edit1->Text.ToDouble();

// operaciones

alfa = alfa / 3.1416 ;

// conversión y despliegue

Edit2->Text= FormatFloat("###,###.##", alfa);

También es valido usar FormatFloat() con lo visto en Edit, es decir es valido y mas correcto;

Edit5->Text= FormatFloat("###.##", Edit3->Text.ToInt() * 3.1416);

En resumen, este componente Edit, es el componente mas importante y elemental en todo problema que
involucre el procesamiento de datos en ambientes visuales, se debe acostumbrar a considerarse como un
elemento importante en cualquier problema visual, y acostumbrarse a procesarlo como si fuese una variable
normal cualesquiera.

Se construye y resuelve el segundo programa del modelo de solución del área del triángulo.

Para crear y diseñar la forma y sus componentes se ocupa, una forma, seis labels, tres edits y un Button,
quedando así;

a) Pantalla de diseño
b)Programa

El código o miniprograma ( es miniprograma porque no se tiene que programar mucho de la pantalla), solo
diseñarla, y dentro del evento OnClick del componente Button, queda así;

void __fastcall TForm1::Button1Click(TObject *Sender)

Edit3->Text=FormatFloat("###.##",Edit1->Text.ToDouble() *

Edit2->Text.ToDouble()/ 2 );

c) Pantalla de ejecución o de salida

Recordar que cuando se capturen los datos de base y altura, no dejar espacios en blanco antes del primer
numero o se darán problemas y errores de conversión a valores numéricos.
Para resolver mejor este problema de formatos mas adecuados para captura de datos, se usaran nuevos
componentes que se analizan mas adelante.

TAREAS PROGRAMACION C++BUILDER

1.- CONVERTIR A PROGRAMAS TODOS LOS PROBLEMAS VISTOS EN EL MODELO DE


SOLUCION.

14.- C++BUILDER COMPONENTE MaskEdit (Adicional)

Este componente es muy similar en su uso al componente Edit, excepto que proporciona una mascara
especializada para el formato de datos, es decir se puede usar para que el usuario proporcione datos con
formatos bien definidos, como son valores numéricos que incluyan puntos y comas por ejemplo 3,345.87, o
que incluyan símbolos como el de $, o para el caso de fechas que lleven su propio separador como por
ejemplo 02/28/97.

También se puede usar, para asegurarse que el dato proporcionado por el usuario, solo incluya números, o
solo contenga letras, etc.

Para darle formato al dato que el usuario debe proporcionar solo hacer dobleclick a un lado de la propiedad
EditMask en el Inspector de Objetos y esto nos da el siguiente minieditor de datos:

* Observar en la ventana derecha, algunos ejemplos de “mascaras de edición”.

* Es en la ventanilla arriba a la izquierda donde se colocan los caracteres especiales de edición ( en el


ejemplo se están usando, $, #, puntos y comas).

* Es en la ventanilla abajo a la izquierda donde se pueden proporcionar algunos datos de prueba, para
probar el formato diseñado.

* Recordar que este formato es para capturas, no para despliegues, puesto que para este caso (despliegue)
se usa FormatFloat().

* No olvide usar el botón OK, cuando se termine de construir la mascara de edición.


* Los principales caracteres especiales de edición son:

'!' Caracteres opcionales se despliegan en blanco

'>' Caracteres que siguen deben ser mayúsculas

'<' Caracteres que siguen deben ser minúsculas

'L' Requiere una letra en esta posición

'l' Permite una letra es esta posición pero no la requiere

'A' Requiere un alfanumérico en esta posición

'a' Permite un alfanumérico pero no lo requiere

'0' Requiere un numero en esta posición

'9' Permite un numero pero no lo requiere

'#' Permite un numero y también signos mas y menos

':' Separa horas:minutos:segundos

'/' Separa meses días años

';' Se utiliza para separar los tres campos o partes de una mascara

'_' inserta espacios en blanco en el texto

Cualquier otro carácter que no aparezca en la tabla anterior, puede aparecer en una mascara, pero solo se
tomara en cuenta como una literal cualesquiera, es decir son insertados automáticamente y el cursor los
brinca.

El segundo campo o parte de una mascara es un carácter simple que indica que carácter literal debe ser
incluido como parte del texto del componente MaskEdit, por ejemplo (000)_000-0000;0;*,

Un 0 en el segundo campo indica que solo deben capturarse los diez dígitos marcados con O, en lugar de
los 14 que tiene la mascara.

El tercer campo de la mascara, es el carácter que se quiera que aparezca en lugar de espacios en blancos.

Nota: para procesarlo usar solo Text no Text.ToDouble()

TAREAS PROGRAMACION C++BUILDER

1.- REEDITAR Y CORREGIR TODOS LOS PROBLEMAS HECHOS Y QUE CONTENGAN EL


COMPONENTE EN CAPTURAS NUMERICAS.

15.- COMPONENTE ComboBox C++BUILDER ( Standard )


Existen muchas ocasiones en donde el usuario del programa tiene que proporcionar datos que provienen de
un conjunto finito y muy pequeño de posibles respuestas, esto significa que cada vez que se ejecute el
programa, el usuario estará proporcionando las mismas respuestas.

Ejemplo de esta clase de datos, son por ejemplos Municipio en BC, las posibles respuestas solo son
(Tecate, Tijuana, Mexicali, Ensenada, Rosarito), otro ejemplo es Sexo (Hombre, Mujer), etc.

Para situaciones como esta, existen componentes que permiten programar por adelantado las posibles
respuestas, y el usuario solo debe seleccionar la respuesta apropiada , en lugar de tener que escribirla.

Este componente ComboBox nos permite definir en primera instancia un conjunto de datos o valores
respuestas asociados a una caja de edición cualesquiera, así ahora el usuario tendrá la oport

UNIDAD de seleccionar un dato del conjunto de datos o respuestas ya predefinido.

Este componente ComboBox tiene dos partes, una parte de encabezado, para poner el nombre del grupo de
respuestas( por ejemplo municipios, sexo, etc.), que se carga usando la propiedad Text del componente.

La segunda parte es la lista de opciones o respuestas que se debe cargar al tiempo de diseño de la ventana,
en el momento de poner el componente ComboBox1, solo hacer dobleclick a un lado de la propiedad Items
en el Inspector de objetos y sale el siguiente editor de strings:

Al momento de ejecución del programa, toda la lista de respuestas, estarán a la vista del usuario, para que
este ultimo la seleccione.

Recordar que el usuario al momento de ejecución del programa, solo vera el encabezado, para seleccionar
su respuesta deberá apretar la flechita que esta a un lado del encabezado.

Para procesar este componente:

Usar su popiedad Text de manera normal, es decir si la respuesta se ocupa en string,


Solo usar ComboBox1→Text, o si la respuesta se quiere numerica solo convertir Text a

ToInt() o ToDouble(), ej, ComboBox1→Text.ToDouble().

TAREAS PROGRAMACION C++BUILDER

1.- REEDITAR LOS PROBLEMAS YA RESUELTOS, AGREGANDO ESTE COMPONENTE EN LOS


CASOS DE CAPTURAS QUE LO PUEDEN ADMITIR ( CAPTURAS DONDE YA SE TIENEN LAS
ENTRADAS SELECCIONADAS O CONOCIDAS DE ANTEMANO).

16.- COMPONENTES DE AGRUPAMIENTO C++BUILDER

Como ya se empieza a notar en las aplicaciones construidas, la cantidad de datos e información empiezan a
amontonarse en la ventana simple que se ha venido construyendo.

Para resolver este problema, se tienen dos métodos, el primero de ellos consiste de una serie de
componentes que permiten agrupar datos o información(resultados) de una manera mas lógica y estética.

El segundo método consiste de construir y trabajar con dos o mas ventanas a la vez.

Se empieza por el primero método , es decir componentes de agrupamiento.

17.- C++BUILDER COMPONENTE PANEL ( Standard y atrás flecha negra)

Es el componente mas sencillo y común de agrupamiento, se utiliza para poner un panel o un cuadro o
marco dentro de una ventana.

El componente Panel1 puede contener una toda una serie lógica de otros componentes.

Solo se deberá recordar colocar primero todos los paneles en la forma y encima de ellos los componentes
que contendrán.

Este componente también tiene una serie de propiedades que le dan una mejor presentación usando las
propiedades BevelInner, BevelOuter, BevelWidth, y BorderWidth.

Es decir se puede dividir una sola ventana en varias partes, por ejemplo en un panel se ponen los
componentes donde se capturan los datos de un problema junto con el botón de OK, y en otro panel se
construye la salida, por ejemplo se crea un panel para capturar los datos de un empleado incluyendo sueldo
diario y días trabajados y un segundo panel contiene su cheque semanal de pago ( problema sugerido
también ).

Para modificar programas construidos sin paneles, el procedimiento para agregarlos es:

1.- Mover todos los componentes abajo en la ventana.

2.- Colocar el panel en su posicion.

3.- Click en Componente a relocalizar.


4.- DobleClick, Copy

5.- DobleClick, Cut

6.- Click dentro del panel, donde se quiere el componente

7.- DobleClick, Paste

TAREAS PROGRAMACION C++BUILDER

1.- REEDITAR E INCLUIR ESTE COMPONENTE PANEL, EN TODOS LOS PROGRAMAS IMPARES
HECHOS.

18.- BORLAND C++BUILDER COMPONENTE GROUPBOX (Standard)

Este componente es otra forma standard de agrupamiento de componentes de programas en Windows, se


usa para agrupar componentes relacionados dentro de una forma.

También se utiliza para separar áreas lógicas dentro de una ventana de Windows.

El texto que identifica el propósito general del grupo se escribe dentro de la propiedad Caption en el
Inspector de Objetos, teniendo seleccionado este componente GroupBox.

Además de sus propiedades, métodos y eventos propios, como todos los componentes de este tipo, tiene o
hereda las propiedades, métodos y eventos de todos los controles generales de tipo Windows.

Es muy similar al componente panel, excepto que incluye una pestaña que permite dejar mas claro, el
proposito del grupo.

TAREAS PROGRAMACION C++BUILDER

1.- REEDITAR E INCLUIR ESTE COMPONENTE GroupBox PARA TODOS LOS PROBLEMAS
PARES YA CONSTRUIDOS

19.- VENTANAS EN C++Builder

El siguiente problema común, con el manejo de programas en C++Builder, es el de poder crear, controlar y
administrar mas de dos formas o ventanas a la vez.

Lo primero que hay que entender para poder resolver este problema es que en C++Builder, cada forma o
ventana tiene asociado ciertos recursos, ademas de los componentes que contiene, tambien una serie de
recursos especiales, en general, la forma, los recursos y los objetos hijos o componentes, se encuentran
relacionados todos ellos, en un archivo especial, llamado “Unit1.cpp”.

Es decir si se crea una segunda forma o ventana,, dicha form2, junto con sus recursos, componentes, etc., se
encontraría contenida en el archivo llamado “Unit2.cpp” y así sucesivamente.
Pero recordar y también tomar en cuenta, que los componentes de esta segunda forma, también se
simbolizarían y procesaran normalmente, es decir ellos también serán (Edit1, Label5, etc.).

Para crear una segunda forma (form2), solo usar el icono de new Form que se encuentra en la barra de
herramientas, recordar además que los otros iconos de dicha barra sirven para estarse intercambiando entre
formas y Unit (código fuente).

La segunda forma se construye normalmente, pero queda el problema de donde queda el botón de ordenes,
le respuesta es, se pone en la primera forma o ventana principal del programa.

El proceso en este botón es similar a todos los programas anteriores, es decir primero se capturan los datos
( pantalla o ventana de captura),luego se resuelve las operaciones y luego traspasar los datos a los
componentes de la segunda forma o ventana.

Para poder realizar este procesos, solo usar ahora un nuevo formato de trabajo con todos los componentes
usados, para que ahora incluyan la forma que lo contiene, es decir se usa ahora ;

NOMFORMA→NOMCOMPONENTE→NOMPROPIEDAD

como se observa, procesar los elementos de dos ventanas, es sencillo pero además existen ciertas
condiciones que deberán cuidarse para que estos procesos funcionen, estas condiciones son:

Para incluir la

UNIDAD (Unit) de la otra forma o ventana, solo tener seleccionada o al frente la ventana que llama, y usar
la orden File, Include Unit, que se encuentra en arriba en la barra de menú, junto con el Run, Compile, etc.,
al dar esta orden (File Include Unit) sale una lista con todas las

UNIDADes (Unit) que ya se diseñaron, seleccionar la apropiada y ya se incluirá automáticamente en la


forma o ventana actual.

Si una ventana o forma referencia dos o mas formas diferentes, entonces usar la orden File, Include Unit,
tantas veces como sea necesario.

Este procedimiento permite construir programas con dos o mas ventanas, pero el problema es que todas
ellas estarán a la vista del usuario, para resolver este problema, el procedimiento mas sencillo es poner en
False la propiedad visible de la forma o ventana que se quiera tener oculta y poner cualquiera de las
siguientes instrucciones en el código del programa para que aparezcan o desaparezcan a voluntad;

1. Form2->Visible = true;

2.- Form2->Show(); // similar a la anterior(pero mas corta)

3) Form2->ShowModal(); // no permite accesar la primera ventana, hasta


que se cierra(X) la segunda ventana.

Programación Avanzada permite crear y destruir ventanas y componentes al tiempo de ejecución del
programa, pero estos conocimientos, no forman parte del ámbito de este libro.

Si se tienen formas de mas, o formas que ya no se quieren usar o de plano mal construidas se pueden
remover del proyecto usando el icono (Remove File from Project) de la barra de herramientas, y de la
ventanilla que aparece seleccionar la
UNIDAD que contiene la forma que se quiere eliminar.

TAREAS PROGRAMACION C++BUILDER

1.- REEDITAR TRES CUALESQUIERA DE LOS PROBLEMA YA RESUELTOS PARA QUE


INCLUYAN CUANDO MENOS DOS VENTANAS

2.- CONSTRUIR UN PROGRAMA DONDE LA PRIMERA VENTANA CAPTURE LOS DATOS DE UN


ALUMNO INCLUYENDO LAS CALIFICACIONES DE 3 MATERIAS DIFERENTES Y UNA
SEGUNDA VENTANA DESPLIEGA UN REPORTE DE CALIFICACIONES DEL ALUMNO
INCLUYENDO PROMEDIO FINAL.
UNIDAD II C++BUILDER INSTRUCCIONES DE CONTROL DE PROGRAMA

1.- C++BUILDER INTRODUCCION

Instrucciones de control de programa permiten alterar la secuencia normal de ejecución de un programa.

Estas instrucciones se dividen en tres grandes categorías:

Instrucciones Condicionales que en C++Builder se implementan con las instrucciones if() y switch().

Instrucciones de ciclos con: for, while, do while.

Instrucción de salto incondicional: goto

Muchas de ellas con sus correspondientes componentes visuales.

2.- C++BUILDER INSTRUCCIONES CONDICIONALES

Una de las mas poderosas características de cualquier computador es la capacidad que tiene de tomar
decisiones.

Es decir al comparar dos alternativas diferentes el computador puede tomar una decisión, basándose en la
evaluación que hace de alguna condición.

desplegar “rico”

desplegar “pobre”

fin-si

b)

imprime mujer

imprime hombre

fin-si
De los ejemplos observar que los caminos por el computador dependerán de la evaluación que el
computador hace con y de la condición.

Todo lenguaje de programacion debe tener instrucciones que permitan formar condiciones e instrucciones
que pueden evaluar esas condiciones.

Para propósito de construcción visual de programas, este tipo de instrucciones condicionales se usaran en
forma interna es decir son parte del código del programa que se empotra dentro de los eventos de
componentes, no son formas o componentes en si.

Pero recordar que lenguajes visuales de igual forma tienen componentes que permiten del mismo modo al
usuario tomar decisiones, incluso directamente en pantalla, es decir existen los llamados componentes de
selección y decisión.

El formato general de una instrucción condicional es:

Como se observa son cuatro partes bien diferenciadas entre si;

* La propia instrucción condicional en si * La condición * El grupo cierto de instrucciones * El grupo falso


de instrucciones

Cuando el computador evalúa una condición,, el resultado de esa evaluación solo es evaluado de dos
maneras o la condición es CIERTA o la condición es FALSA.

Esto dependerá del valor que tenga asignado o que se haya capturado para la variable que esta en la
condición, por ejemplo si se capturo 6000 en sueldo en el ejemplo a), entonces el computador indicaría que
la condición es CIERTA, pero en otro caso, si a la variable sueldo primero se le asigno un valor de 250
entonces el computador indicaría que la condición, es FALSA.

Ya dependiendo del resultado de la evaluación, el computador ejecuta las instrucciones contenidas en la


parte CIERTA o en la parte FALSA de la condición.

Empezaremos el análisis por la CONDICION.

3.- C++BUILDER CONDICIONES SIMPLES

En general todas las condiciones simples se forman con;

variables operadores relaciónales constante o var.


sexo = m

sueldo > 300,000

Una condición simple se define como el conjunto de variables y/o constantes unidas por los llamados
operadores relaciónales.

Los operadores relaciónales que reconoce el lenguaje C++Builder son:

Operador Significado

'<' Menor que

'>=' Mayor o igual que.

'⇐' Menor o igual que.

'!=' No es igual que, o es diferente que.

Observar y tener cuidado sobre todo con el operador de igualdad ' = ', y el operador relacional de
comparación por igualdad '== ', es decir:

sueldo = 500 Se esta pidiendo cargar o asignar la variable sueldo con el valor 500

sueldo == 500 Se esta pidiendo que se compare el valor o dato que ya esta en la variable sueldo, contra el
numero 500.

Solo este ultimo formato es valido dentro de una condición, en una instrucción condicional.

4.- INSTRUCCION IF C++BUILDER

Es la instrucción condicional mas usada en los diversos lenguajes de programación, su formato completo y
de trabajo en C++Builder es :

Primus.- Observar donde van y donde no van los puntos y comas;

Secundus.- La condición van entre paréntesis ;

Tertius.- Si un if no ocupa un grupo falso de instrucciones, entonces no se pone el else, y la llave antes del
else si terminaría con punto y coma.

Ejemplos:

if (Edit1→Text>==“500”)

else
{ Edit2→Text=“Pobre”;};

Solo recordar que en C++Builder es mas fácil comparar datos de tipo string(Texto) que numéricos, si se
quiere hacer una comparación entre números solo comparar el Edit correspondiente junto con su
método(ToInt o ToDouble) y el dato numérico.

TAREAS PROGRAMACION C++BUILDER

1.- Capturar un numero cualesquiera e informar si es o no es mayor de 100

2.- Capturar un numero entero cualesquiera e informar si es o no es múltiplo de 4 ( recordar el operador


mod(%), analizado en el tema de operadores aritméticos).

3.- Capturar los cinco datos mas importantes de un Empleado, incluyendo el sueldo diario y los días
trabajados esto en un panel, desplegarle su cheque semanal en un segundo panel solo si ganó mas de
$500.00 en la semana, en caso contrario desplegarle un bono de despensa semanal de $150.00 en un tercer
panel.

4.- Capturar los datos mas importantes de un estudiante incluyendo tres calificaciones, todo esto en una
ventana, una segunda ventana que contiene una boleta de calificaciones es llamada si el estudiante es de la
carrera de medicina, en caso contrario una tercera ventana despliega un oficio citando a los padres del
estudiante a una platica amistosa con los maestros dela escuela.

5.- Capturar los datos mas importantes de un producto cualesquiera, incluyendo cantidad, precio, etc.,
desplegar una orden de compra, solo si el producto es de origen nacional, en caso contrario no hacer nada.

5.- CONDICIONES COMPUESTAS C++BUILDER

En muchas ocasiones es necesario presentar mas de una condición para su evaluación al computador.

Por ejemplo que el computador muestre la boleta de un alumno, si este estudia la carrera de medicina y su
promedio de calificaciones es mayor de 70.

Una condición compuesta se define como dos o mas condiciones simples unidas por los llamados
operadores lógicos.

Los operadores lógicos que C++Builder reconoce son;

operador significado

&& y

! NO
Para que el computador evalúe como CIERTA una condición compuesta que contiene el operador lógico
“y”, las dos condiciones simples deben ser ciertas.

Para que el computador evalúe como CIERTA una condición compuesta que contiene el operador lógico
“o”, basta con que una de las condiciones simples sea cierta.

La cantidad total de casos posibles cuando se unen dos o mas condiciones simples esta dada por la relación
donde n = cantidad de condiciones, la primera mitad de ellos ciertos y la segunda mitad falsos.

Ejemplo, si formamos una condiciona compuesta con dos condiciones simples y el operador lógico “y”, la
cantidad total de casos posibles serian , y se puede construir la siguiente tabla de verdad.

Tabla de verdad con “y”

1cs 2cs Eval

6.- INSTRUCCION SWITCH C++BUILDER

También existen ocasiones o programas donde se exige evaluar muchas condiciones a la vez, en estos
casos, o se usan una condición compuesta muy grande o se debe intentar convertir el problema a uno que se
pueda resolver usando la instrucción switch();

La instrucción switch() es una instrucción de decisión múltiple, donde el compilador prueba o busca el
valor contenido en una variable contra una lista de constantes ints o chars, cuando el computador encuentra
el valor de igualdad entre variable y constante, entonces ejecuta el grupo de instrucciones asociados a dicha
constante, si no encuentra el valor de igualdad entre variable y constante, entonces ejecuta un grupo de
instrucciones asociados a un default, aunque este ultimo es opcional.

El formato de esta instrucción es el siguiente;

capturar o asignar variable de condición;

};

Recordar que la propiedad Text de cualquier componente, puede usar o accesar cualquier [posición o
carácter] usando los corchetes por ejemplo;

Label3→Caption = Edit4→Text[2]; pasa solo la 'u' al caption

Mejor un ejemplo practico;

void __fastcall TForm1::Button1Click(TObject *Sender)

modulo de switch { }; } ——————————————– Notas: 1.- Solo se puede usar como variable de
condición una variable entera o variable char. 2.- Se esta usando como variable de condición, solo la
primera letra o carácter de la caja de edición, que es equivalente a una variable char. 3.- Observar que
usando corchetes ej. [posición] en la propiedad Text, se puede referenciar o procesar cualquier carácter
dentro del Texto. 4.- Las constantes que estamos buscando y comparando son de tipo char, por eso se
deben encerrar entre apóstrofes ( ' ). 5.- Si se quiere resolver el problema de mayúsculas o minúsculas en
el teclado, observar que se usan dos case, pero con un solo break; 6.- Recordar que switch() solo trabaja
con constantes y variables de tipo char o int, en este ultimo caso; Usar switch(Edit1→Text.ToInt() ) Y en
los case poner la constante numérica, sin apóstrofes, es decir por ejemplo case 5:
Edit3→Text=“camello”; break; En particular, instrucciones de tipo switch() se utilizaban para construir
programas de selección de menús, donde al usuario se le planteaban dos o tres problemas distintos y el
propio usuario seleccionaba cual de ellos quería ejecutarse. TAREAS PROGRAMACION C++BUILDER
1.- Construir una ventana que contenga el siguiente menú ———————— 1. conversión de pesos a
dólares 2. conversión de libras a kilogramos 3. conversión de kilómetros a millas 4. fin de menú
————————— seleccionar opción [ ] ←- Este es el edit del switch(). Para resolver este programa,
primero diseñar las cuatro formas o ventanas que se ocupan, y en la primera forma que contiene el menú
para el usuario, programar el evento onclick del Button de ordenes con la instrucción switch(), los case
solo contienen código para llamar o poner a la vista del usuario la ventana o forma respectiva. Y además
recordar poner en cada ventana de solución de un problema un botón de orden, con código de regreso a la
ventana de menú, solo escribir en el Caption de este botón la palabra [menú] y en su evento OnClick
ocultar la ventana de problema y poner visible la ventana o forma del menú. 2.- Construir un programa
que capture un deporte y despliegue dos implementos deportivos apropiados. 3.- Evaluar cualquier función
vista para cuando x =3,-4, 5

7.- C++BUILDER COMPONENTES VISUALES DE SELECCION Y DECISIÓN

Las instrucciones if y switch(), nos permiten tomar decisiones o realizar seleccionase dentro del código de
un programa.

C++Builder proporciona una serie de componentes visuales que permiten al usuario, no al programador,
tomar decisiones en pantalla, el programador solo se encarga de implantar código adecuado a la decisión
tomada por el usuario.

8.- C++BUILDER COMPONENTE CheckBox (Standard)

El componente CheckBox, permite seleccionar una opción al usuario del programa o tomar una decisión,
directamente en pantalla.

Es la propiedad Text del componente donde se escribe sentido de la selección ej.;


En los ejemplos, los componentes checkbox, son las cajas donde el usuario toma un decisión (ej. 3) o
realiza una selección (ej. 1,2)

Existen dos maneras de programar este componente:

1. Cuando el usuario selecciona un checkbox la propiedad Checked refleja esta decisión quedando cargada
con las constantes true o false, en estos casos solo validar con un if por cada CheckBox dentro de nuestro
botón de ordenes, el estado de dicha propiedad.

ej.;

if ( CheckBox5→Checked == true){código};

if (CheckBox2→Checked = = true){código);

1. Para el ejemplo c) el botón de ordenes en la forma o ventana respectiva usando el método anterior ,
contendría 3 ifs, uno para construir boleta otro para construir citatorio y otro para construir un diploma.

2. El segundo método para programar el componente, involucra el evento OnClick de este componente
CheckBox, este evento OnClick es activado automáticamente en cuanto el usuario realiza o marca o toma
su selección, es claro que si no se programa este evento el usuario no observara ningún proceso, sino que
tendrá que indicar que ya hizo su decisión, apretando el botón de OK.

Pero si se programa el evento OnClick de este componente con el código adecuado, ni se tendrá que
agregar un botón OK, ni se ocupara usar un if(Checked), porque el usuario ya indico cual es su decisión o
selección.

Recordar que para programar este evento OnClick, solo hacer un dobleclick, dentro del componente.

Este método es el mejor porque evita código de mas y cada componente solo tiene asociado el código que
ocupa.

TAREAS PROGRAMACION C++BUILDER


1.- Evaluar la función para xà 2,-5, 8 (usar un CheckBox por cada valor de x, y
programar cada evento OnClick de cada CheckBox con la operación correspondiente y el despliegue del
resultado).

2.- Construir un panel con los datos de un automóvil, un segundo panel muestra un plan de financiamiento
a dos años y un tercer panel muestra un plan de financiamiento a tres años. ( son dos checkbox en el primer
panel y no hay botón de ok).

3.- Construir el programa de menú, que se dejo en el tema de instrucción switch(). ( aquí no se ocupa
switch() ni pedir la opción, ni botón de ok, solo un CheckBox programado a un lado de cada opción del
menú).

10.- COMPONENTE RadioGroup ( Standard ) C++BUILDER

Aunque es común agrupar un conjunto de RadioButton dentro de componentes Panel Y RadioGroup, C+


+Builder proporciona este componente RadioGroup que esta especializado en la agrupación de
RadioButton.

Un componente u objeto RadioGroup es una caja especial que solo contiene componentes RadioButton,
también cuando el usuario marca o selecciona uno de ellos, todos los demás se desmarcan o deseleccionan .

Para añadir los RadioButton a el componente RadioGroup, solo editar la propiedad Items en el Inspector de
Objetos, que entonces nos muestra el minieditor de strings ya visto y practicado en el tema de ListBox, solo
recordar que cada renglón en el editor corresponderá a un RadioButton dentro del RadioGroup.

Para procesar o programar el RadioButton seleccionado por el usuario, solo usar la propiedad ItemIndex
que queda cargada con el numero de RadioButton seleccionado por el usuario.

Este código deberá usarse dentro del evento OnClick de un componente Button(OK).

ejemplo ————————————————————- if(Form5→RadioGroup3→ItemIndex==4){ código


a ejecutar si el usuario selecciono el RadioButton 4 del RadioGroup 3 etc. };
——————————————————– También se pueden desplegar los botones en una o mas
columnas, usando la propiedad Columns en el Inspector de Objetos, para indicarle cuantas columnas de
RadioButton se quieren manejar. TAREAS PROGRAMACION C++BUILDER 1.- CAPTURAR LOS
CINCO DATOS MAS IMPORTANTES DE UN CLIENTE, USANDO RadioButton PARA LAS
RESPUESTAS, UN SEGUNDO PANEL ABAJO EN LA FORMA DESPLIEGA EN COMPONENTES
NORMALES EDIT O LABEL LAS SELECCIONES DEL USUARIO 2.- CONSTRUIR UN CUESTIONARIO
DE 6 PREGUNTAS SOBRE LOS HABITOS DE ESTUDIO DE UN ESTUDIANTE. 3.- CONSTRUIR UN
CUESTIONARIO DE 5 PREGUNTAS CON LAS PREFERENCIAS POLITICAS DE UNA PERSONA, UN
PANEL ABAJO DESPLIEGA UN CONCENTRADO CON TOTALES Y PORCENTAJES ACUMULADOS
POR CADA PREGUNTA. ES DECIR UN USUARIO RESPONDE EL CUESTIONARIO APRIETA EL
BOTON DE OK, EL PANEL DE ABAJO SE ACTUALIZA PARA MOSTRAR TOTALES Y PORCIENTOS DE
CADA PREGUNTA, Y SE LIMPIAN LAS RESPUESTAS, UN SEGUNDO USUARIO RESPONDE EL
CUESTIONARIO…. Y ASI SUCESIVAMENTE. * PARA TOTALES Y PORCENTAJES, SOLO RECORDAR
DOS DE LOS CONCEPTOS MAS ELEMENTALES DE PROGRAMACION BASICA. CONTADORES:
CONT=CONT+1 RESULTADO 1, 2, 3,4,5, ……. ACUMULADORES: ACUM = ACUM + CONT
RESULTADO CON EL EJEMPLO DE ARRIBA 1,3,4,10,15 RECORDAR LAS CAJAS
EDIT→TEXT.TOINT() TAMBIEN PUEDEN FUNCIONAR COMO CONTADORES O ACUMULADORES.
NO SE OCUPA CONVERTIRLAS A VARIABLES, TRABAJARLAS DIRECTAMENTE

11.- COMPONENTE MainMenu C++BUILDER ( Standard )

Con este componente MainMenu se forman las barras de menú normales en cualquier programa de
Windows (la barra que contiene File, Edit, etc.) junto con sus opciones correspondientes.

Cuando se pone este componente en una forma, se deberá entender que form1 ahora mostrara o desplegara
una barra de menú, tal como si fuese una ventana normal de Windows.

Para construir un programa de selección de menú;

1.- Poner un componente MainMenu en una parte de la forma donde no estorbe (esto es porque este
componente queda flotando dentro de Form1 y solo activa o se convierte en barra de menú al momento de
ejecución del programa).

2.- Para cargarle las opciones, no del código que ejecutara cada opción, solo dobleclick dentro de este
componente para que aparezca el siguiente diseñador de menús.

1.- No es Form1, es una forma especial que se parece mucho, pero solo se activa cuando se hace un
dobleclick en un componente MainMenu.

2.- La barra superior es el menú, cada opción del menú ( Moneda, Temperatura, Distancias, etc.) tienen sus
propias subopciones o submenus.

3.- Para escribir las opciones( Moneda, Temperatura, etc.) primero hacer un click en la parte
correspondiente (en el lugar que ocupan o donde se desplegaran) y escribir en la propiedad Caption del
Inspector de Objetos la palabra correspondiente.
4.- Para escribir las subopciones, primero hacer click en la opción correspondiente ( por ejemplo en la parte
donde esta la palabra Distancias) y ya aparece abajo de ella la primera subopcion marcada y seleccionada
(es un cuadrito que se pone abajo de Distancias) y escribir en el Caption Del Inspector de Objetos la
palabra adecuada a la subopcion correspondiente (ejemplo Millas-Kms), al escribir y usar tecla <ENTER>
en el caption ya aparece el cuadrito de la segunda subopcion.

5.- Para marcar una letra de una opción o subopcion como HotKey ( lo siento no se pudo traducir), solo
poner el signo & antes de la letra correspondiente.

6.- Con los pasos 3,4,5 ya queda construido el menú, pero ahora falta cargarles el código o programa a
ejecutar por y a cada opción o subopcion del menú, recordar que estos eventos también se activan al hacer
un click el usuario en cada opción o a seleccionar la primera letra(si se uso el &), para cargar código
entonces.

7.- Solo dobleclick en la opción o subopcion correspondiente y ya aparece el minieditor de programas, listo
con el evento OnClick de la opción o subopcion correspondiente.

8.- El código a escribir en la mayor parte de los casos, solo consiste en ocultar la ventana principal y llamar
la ventana que contendrá el programa correspondiente a la opción deseada.

9.- Para terminar y regresar a la forma principal solo click en la X del diseñador de menús.

TAREAS PROGRAMACION C++BUILDER

1.- EL DE LA MUESTRA CON DOS CONVERSIONES MONETARIAS, DOS OPCIONES DE


TEMPERATURAS Y DOS DE DISTANCIAS.

* PRIMERO DISEÑAR Y CONSTRUIR TODAS LAS FORMAS QUE VA A OCUPAR * NO OLVIDE


PONER ALGUNAS LABELS DE ENCABEZADO EN LA VENTANA PRINCIPAL

EN EL BOTON OK O EN OTRO BOTON SIMILAR DE CADA VENTANA DE TRABAJO NO


OLVIDAR AGREGAR CODIGO PARA OCULTAR DICHA VENTANA Y REGRESAR A LA VENTANA
CON EL MENU PRINCIPAL.

12.- COMPONENTE PopupMenu C++BUILDER (Standard)

Este componente encapsula propiedades, métodos y eventos de un menú popup, este minimenu se activa
cuando el usuario hace un click derecho en muchos componentes que lo pueden contener.

Un ejemplo;
Recordar que este componente PopupMenu se tiene que pegar a otro componente, por ejemplo un Label o
un Edit, etc.

Para crear un PopupMenu, solo seleccionar el componente PopupMenu en la barra de componentes y


ponerlo en una parte de la forma donde no estorbe (también queda flotando).

Para cargarlo de opciones solo dobleclick en dicho componente e igual que en componente MainMenu, sale
el minieditor, click en la parte donde va la opción escrita y escribir la palabra en la propiedad Caption del
Inspector de Objetos.

Para cargarle el código a cada opción , solo dobleclick en la opción correspondiente.

Para salirse del minieditor, solo click en la [X] de arriba.

Por ultimo y muy importante, recuerde que se tiene que pegar a un componente cualesquiera, para esto solo
seleccionar el componente y click en la propiedad popup del componente, sale la lista con todos los
componentes PopupMenu que ya se hayan construidos.

TAREAS PROGRAMACION C++BUILDER

1.- CONSTRUIR UN MENU CON LAS SIGUIENTES OPCIONES:

[AUTOS] ß FINANCIAMIENTO A 2,3,4 años

[LAVADORAS] ß FINANCIAMIENTO A 2,3 años

13.- C++BUILDER Ciclo FOR

Instrucciones para ciclos, resuelven el problema de repetir todo el programa, o cierta parte del programa
mas de una vez.

Este ciclo es uno de los mas usados para repetir una secuencia de instrucciones, sobre todo cuando se
conoce la cantidad exacta de veces que se quiere que se ejecute una instrucción simple o compuesta.
En su forma simple la inicialización es una instrucción de asignación que carga la variable de control de
ciclo con un valor inicial.

La condición es una expresión relacional que evalúa la variable de control de ciclo contra un valor final o
de parada que determina cuando debe acabar el ciclo.

El incremento define la manera en que la variable de control de ciclo debe cambiar cada vez que el
computador repite un ciclo.

Se deben separar esos 3 argumentos con punto y coma ;

Casos Particulares;

1.- El ciclo comienza en uno y se incrementa de uno en uno, este es el caso mas general.

2.- Pero el valor inicial puede se diferente de uno, ejemplo;

for(x=5;x⇐15;x=x+1){ etc.};

3.- Incluso el valor inicial puede ser negativo, ejemplo;

4.- Los incrementos también pueden ser diferentes al de uno en uno, ej.;

for (x=1; x⇐ 20; x=x+3){ etc. };

5.- Incluso pueden ser decrementos, solo que en este caso, recordar;

El valor inicial de la variable debe ser mayor que el valor final.

Cambiar el sentido de la condición.

ejemplo: for (x= 50 ; x >= 10; x= x-4 ) { etcétera };

6.- Solo para los casos de incrementos y decrementos de una en una

UNIDAD, substituir en el for;

el x = x + 1 por x++

el x = x - 1 por x–

7.- Un ejemplo para usarlo en los problemas sugeridos mas adelante;

ejemplo;

desplegar los números enteros, comprendidos entre el 10 y el 20.

Ocupamos ahora un componente que pueda almacenar y desplegar un conjunto de los 10 resultados, el
único componente visto hasta ahora con esta capacidad es el componente ComboBox, sin embargo existe
otro componente llamado ListBox(Standard), muy similar a ComboBox, excepto que no tiene encabezado
y todos sus elementos los mantiene a la vista del usuario, no ocultos como el ComboBox, dicho
componente ListBox se analiza a fondo en la siguiente
UNIDAD, pero es el que de momento permite resolver el problema del for (desplegar un conjunto de
resultados a la vez).

Tanto ComboBox como ListBox permiten cargar todos sus elementos o valores, dentro de un programa,
usando un método llamado Add(valor) en su propiedad Items, como se ve en el siguiente programa
ejemplo;

Para este problema se ocupa poner en Form1, un componente Button OK que en su evento OnClick
contiene el for y la carga del componente ListBox, con el siguiente;

1. Pantalla de diseño

Programa

void __fastcall TForm1::Button1Click(TObject *Sender)

//declaración

int x;

// ciclo for

for (x=10; x<= 20 ; x++)

{ ListBox1->Items->Add(x); };

1. La pantalla de salida debe ser igual o parecida a la siguiente;


Este procedimiento y método igualmente trabaja con un componente ComboBox.

Practicar hasta conseguir tener esta pantalla de salida o de ejecución, cuando se consiga entonces ya se esta
listo para lo siguiente;

TAREAS PROGRAMACION C++BUILDER

1.- CONSTRUIR UN PROGRAMA QUE DESPLIEGUE LOS NUMEROS DEL 20 AL 30.

2.- DESPLEGAR LOS ENTEROS ENTRE 50 Y 30 ACOMPAÑADOS DE SU POTENCIA CUADRADA


Y RAIZ CUBICA RESPECTIVA ( OCUPA TRES ListBox).

3.- DESPLEGAR UNA TABLA DE MULTIPLICAR QUE EL USUARIO INDIQUE .

14.- C++ BUILDER CICLO WHILE

En este ciclo el cuerpo de instrucciones se ejecuta mientras una condición permanezca como verdadera, en
el momento en que la condición se convierte en falsa el ciclo termina.

Su formato general es :

cargar o inicializar variable de condición;

while (condición)

grupo cierto de instrucciones;

instrucción(es) para salir del ciclo;


};

Ejemplo #1 :

x=1;

while(x⇐10)

{ListBox1→Items→Add(“pato”);

x++; };

While puede llevar dos condiciones, en este caso inicializar 2 variables de condición y cuidar que existan 2
de rompimiento de ciclo.

El grupo cierto de instrucciones puede ser una sola instrucción o todo un grupo de instrucciones.

La condición puede ser simple o compuesta.

A este ciclo también se le conoce también como ciclo de condición de entrada prueba por arriba, porque
este ciclo evalúa primero la condición y posteriormente ejecuta las instrucciones.

TAREAS PROGRAMACION C++BUILDER

1.- DESPLEGAR ENTEROS ENTRE 50 Y 80

2.- DESPLEGAR MULTIPLOS DE 4 ENTRE 60 Y 20 ACOMPAÑADOS DE SU LOGARITMOS DE


BASE 10 Y BASE e RESPECTIVOS ( A REVISAR LA AYUDA Y BUSCAR LAS FUNCIONES
MATEMATICAS QUE ESTAN LA LIBRERIA <MATH.H>

3.- CONSTRUIR LA TABLA DE DIVIDIR QUE EL USUARIO INDIQUE.

15.- C++BUILDER CICLO DO WHILE

Su diferencia básica con el ciclo while es que la prueba de condición es hecha al finalizar el ciclo, es decir
las instrucciones se ejecutan cuando menos una vez, porque primero ejecuta las instrucciones y al final
evalúa la condición;

También se le conoce por esta razón como ciclo de condición de salida.

Su formato general es :

ejemplo:

x=1;
{ ListBox1→Items-Add(“pato”);

x++; }while(x⇐10);

Otra diferencia básica con el ciclo while es que, aunque la condición sea falsa desde un principio, el cuerpo
de instrucciones se ejecutara por lo menos una vez.

TAREAS PROGRAMACION C++BUILDER

16.- C++BUILDER CONCLUSIONES ACERCA DE CICLOS

El problema de dado un problema cualesquiera, cual ciclo se debe usar se resuelve con:

Si se conoce la cantidad exacta de veces que se quiere que se ejecute el ciclo o si el programa de alguna
manera puede calcularla usar for. Si se desconoce la cantidad de veces a repetir el ciclo o se quiere mayor
control sobre la salida o terminación del mismo entonces usar while. Si se quiere que al menos una vez se
ejecute el ciclo entonces usar do while.

17.- INSTRUCCION DE SALTO INCONDICIONAL, ETIQUETAS O GOTO

Esta instrucción fue una de las favoritas de la com

UNIDAD de programadores hace 20 años, en la actualidad la aparición de nuevas estructuras o


instrucciones de programación hacen innecesario su uso.

El uso principal que se le dio, acompañada de una instrucción if fue la de simular ciclos condicionales.

Esta instrucción requiere una llamada etiqueta que es un identificador valido de lenguaje C++ seguida de
dos puntos.

ejemplo:

button1_onclick{

x++;

if(x⇐10) goto alfa;

TAREAS PROGRAMACION C++BUILDER


1.- LAS TABLAS DE SUMAR, Y MULTIPLICAR CON IF-GOTO
III UNIDAD C++ BUILDER ARREGLOS

1.- INTRODUCCION C++BUILDER

Uno de los problemas mas comunes en los diversos sistemas de información, es el tratamiento o
procesamiento de una gran volumen de datos o de información.

Variables o componentes visuales manejados hasta ahora, no pueden ayudar a resolver este problema.

Las variables usadas hasta ahora reciben propiamente el nombre de variables escalares, porque solo
permiten almacenar o procesar un dato a la vez.

No confundir esto con el tipo de dato o rango de datos que una variable tiene la capacidad de almacenar.

Por ejemplo si se quiere almacenar nombre y edad de 15 personas, con el método tradicional se ocuparan
30 variables o 30 componentes visuales, y solo es nombre y edad de 15 personas, agreguen mas datos y
mas personas y ya es tiempo de empezar a analizar otro tipo de variables y de componentes.

Es decir, en problemas que exigen manejar mucha información o datos a la vez, variables escalares o
componentes visuales de manipulación de datos normales (edit, label, etc.), no son suficientes, ya que su
principal problema es que solo permiten almacenas un dato a la vez.

Se ocupa entonces variables o sus correspondientes componentes visuales que sean capaces de almacenar y
manipular conjuntos de datos a la vez.

Variables de tipo arreglo y sus correspondientes componentes visuales, si permiten almacenar y procesar
conjuntos de datos del mismo tipo a la vez.

Cada dato dentro del arreglo, se le llama elemento del arreglo y se simboliza y procesa(captura
,operación ,despliegue ), usando el nombre del arreglo respectivo y un subíndice indicando la posición
relativa del elemento con respecto a los demás elementos del arreglo, solo recordar que en C++Builder la
primera posición, elemento o renglón es la 0 (cero), ej.

NOMBRES

Juan

Pedro —> Nombres[1]

José

Ana —→ Nombres[3]

Carmen

EDAD
18 —> Edad[0]

20

25

30 —> Edad[3]

Sin embargo sus problemas son similares a los de variables normales, es decir hay que declararlos,
capturarlos, hacer operaciones con ellos, desplegarlos, compararlos, etc.

Para propósitos del aprendizaje se analiza o clasifican en tres grupos diferentes los arreglos que ofrece C+
+Builder, ellos son;

1.- Arreglos tradicionales en C++ (internos dentro del programa)

2.- Nuevos Arreglos de C++ (Son CLASES e internos dentro del programa)

3.- Componentes Visuales de tipo Arreglo

2.- ARREGLOS TRADICIONALES EN C++BUILDER

En programación tradicional siempre se manejan dos tipos de arreglos, los arreglos tipo listas, vectores o
unidimensionales y los arreglos tipo tablas, cuadros, concentrados, matrices o bidimensionales, en ambos
casos son variables que permiten almacenar un conjunto de datos del mismo tipo a la vez, su diferencia es
en la cantidad de columnas que cada uno de estos tipos contiene, como en los siguientes ejemplos;

1. ARREGLOS TIPO LISTA

Juan

Pedro —> Nombres[1]

José

Ana —> Nombres[3]

Carmen

18 —> Edad[0]

20

25

30 —> Edad[3]
1. ARREGLOS TIPO TABLAS

CIA ACME

ING MENS VTAS

(MILES DE $)

ENE FEB MAR ABR MAY

SUC A 10 12 15 10 9

SUC B 8 7 5 9 6

SUC C 11 18 20 14 17

INST TECN DE TIJUANA

CONCENTRADO DE CALIF

MAT FIS QUIM HIST

JUAN 5 5 5 5

JOSE 4 4 4 4

PEDRO 3 3 3 3

ANA 9 9 9 9

Como se observa, la diferencia principal entre un arreglo tipo lista, y un arreglo tipo tabla, son las
cantidades de columnas que contienen.

NOTA IMPORTANTE.- LOS CONCEPTOS MANEJADOS AQUI ESTAN ENFOCADOS A LOS


SISTEMAS DE INFORMACION CONTABLES FINANCIEROS ADMINISTRATIVOS

EN ALGEBRA MATRICIAL, SI SON IMPORTANTES LOS CONCEPTOS DE VECTORES Y


MATRICES, PERO LAS OPERACIONES Y METODOS SON PRECISAMENTE LOS DEL ALGEBRA
MATRICIAL Y NO ES PROPOSITO O LUGAR INDICADO PARA TRATAR PROBLEMAS Y
OPERACIONES CON MATRICES.

3.- ARREGLOS TIPO LISTA C++BUILDER


Un arreglo tipo lista se define como una variable que permite almacenar un conjunto de datos del mismo
tipo organizados en una sola columna y uno o mas renglones.

También reciben el nombre de vectores en álgebra, o arreglos unidimensionales en programación.

Los procesos normales con una lista o con sus elementos, incluyen declarar toda la lista, capturar sus
elementos, desplegarlos, realizar operaciones con ellos, desplegarlos, etc.

Para declarar una lista se usa el siguiente formato;

tipodato nomlista[cant de elementos o renglones];

ejemplos;

int edades[12];

float sueldos[10];

AnsiString municipios[5];

notas:

Si un solo botón, en toda la ventana va a realizar, todos los procesos ( declaración, captura, operaciones,
comparaciones, despliegue), con la lista, solo hacer la declaración de la lista, al principio del evento
onclick, como lo muestra el programa ejemplo.

Recordar también que la primera posición o renglón en una lista es la posición o renglón 0 (cero).

El dato capturado, proviene de momento de un componente visual escalar y por tanto para capturas se
deben de usar tantos componentes visuales como elementos tenga la lista, ejemplo para capturar una lista
de 4 edades, el código y pantalla se da un poco mas adelante;

1. Programa

void __fastcall TForm1::Button1Click(TObject *Sender)

{ // declaración

int edad[4];

// carga o captura del arreglo

edad[0]=Edit1->Text.ToInt();

edad[1]=Edit2->Text.ToInt();

edad[2]=Edit3->Text.ToInt();
edad[3]=Edit4->Text.ToInt();

2. Pantalla de corrida

Para el caso de operaciones y comparaciones con todos los elementos de la lista a la vez, se deberá usar un
ciclo for con una variable entera llamada renglón, misma que también se usara como índice de la lista, para
el problema ejemplo, suponer que se quieren convertir todas las edades a meses, el código seria;

{ // declaración

// carga o captura del arreglo

// conversión a meses

for(renglon=0;renglon<=3;renglon++)

{ edad[renglón]=edad[renglón]*12; };

Recordar que todos los datos internos de la lista estarán almacenados en la memoria ram del computador,
para despliegues se usara un componente visual que permite manipular un conjunto de datos a la vez, el
ListBox, pero se tiene que usar un ciclo for() para ir añadiendo o agregando elemento por elemento como
se observa en el problema ejemplo que se ha venido desarrollando, en este caso se quiere desplegar las
cuatro edades convertidas a meses;

código y pantalla de salida son;

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

// declaración
int edad[4];

int renglón;

// carga o captura del arreglo

// conversión a meses

{ edad[renglón]=edad[renglón]*12; };

// CONVERSION A STRINGS Y ALMACENANDO EN ListBox

{ ListBox1->Items->Add(edad[renglón]); };

Solo recordar que para capturar una lista de strings, primero se deberá usar un componente visual por cada
elemento o renglón del arreglo y segundo el traspaso de dato es directo, y para desplegarlo en un
componente ListBox de igual forma es directo, como en el siguiente ejemplo;

void __fastcall TForm1::Button1Click(TObject *Sender)

{ // declaración

AnsiString Ciudad[3];

int reng;

//Captura de elementos de la lista

Ciudad[0]=Edit1->Text;

Ciudad[1]=Edit2->Text;

Ciudad[2]=Edit3->Text;

// Pasando lista a ListBox;


{ ListBox1->Items->Add(Ciudad[reng]); };

TAREAS PROGRAMACION C++BUILDER

1.- Capturar y desplegar 5 precios de productos cualesquiera, usando dos panel, uno para capturar y uno
para desplegar.

2.- Capturar 4 sueldos en un panel, desplegarlos aumentados en un 25% en otro panel.

3.- Capturar los datos de 5 productos comprados en una tienda, incluyendo nombre, precio y cantidad en
sus 3 listas respectivas, después calcular una cuarta lista con el gasto total por cada producto desplegarlo
todo en un segundo panel e incluir también el gran total.

4.- Capturar en una lista solamente 6 números múltiplos de 5, se debe de estar capture y capture números
hasta que se completen los 6 múltiplos de

4.- C++BUILDER ARREGLOS TIPO TABLA

Un arreglo tipo tabla se define como un conjunto de datos del mismo tipo organizados en dos o mas
columnas y uno o mas renglones.

Para procesar ( recordar solo operaciones y comparaciones) internamente todos los elementos de la tabla se
ocupan dos ciclos for(), uno externo para controlar renglón y uno interno para controlar columna.

Solo recordar que en capturas, se deberán usar tantos componentes Edit como celdas tenga la tabla y en
despliegue usar tantos componentes ListBox como columnas tenga la tabla, estos métodos son
provisionales mientras se analizan los componentes visuales apropiados y respectivos.
Problema ejemplo, capturar una tabla que nos muestre el peso en lbs de los tres jugadores claves de 4
equipos de fútbol, desplegarlos en otra tabla pero convertidos a kg. ( una libra = .454 kg.), el programa y la
pantalla de salida son;

{ // declaración

double lbrs[3][4];

int reng, col;

//conversión tabla lbrs a kgrs

for(reng=0;reng<=2;reng++)

for(col=0;col<=3;col++)

{ lbrs[reng][col]=lbrs[reng][col]*.454; };

{ ListBox1->Items->Add(FormatFloat("###.##",lbrs[reng][0]) );

ListBox2->Items->Add(FormatFloat("###.##",lbrs[reng][1]) );

ListBox3->Items->Add(FormatFloat("###.##",lbrs[reng][2]) );

ListBox4->Items->Add(FormatFloat("###.##",lbrs[reng][3]) ); };

// observar solo un for renglón, y los cuatro ListBox con // las


columnas
constantes

Recordar que en este nivel de instrucción solo se pretende entender los conceptos asociados a arreglos,
mejores maneras de procesarlos existen, como se vera mas adelante, pero con lo ya descrito y
comprendido, ya es posible;
TAREAS PROGRAMACION C++BUILDER

1.- CONSTRUIR UN CUADRO QUE CONTENGA LOS COSTOS FIJOS DE CUATRO


PRODUCTOSCUALESQUIERA, QUE SE PRODUCEN EN TRES PLANTAS DIFERENTES DE UNA
EMPRESA MAQUILADORA.

2.- CONSTRUIR UN CUADRO QUE CONTENGA LOS INGRESOS MENSUALES POR VENTAS
DURANTE LOS TRES PRIMEROS MESES DEL AÑO DE CUATRO SUCURSALES DE UNA
CADENA DE AUTOREFACCIONES, AGREGAR AL FINAL UNA LISTA QUE MUESTRE LOS
INGRESOS MENSUALES TOTALES POR MESES Y UNA SEGUNDA LISTA QUE MUESTRE LOS
INGRESOS MENSUALES TOTALES POR SUCURSAL.

3.-CONSTRUIR UN CUADRO QUE CONTENGA LAS COMISIONES GANADAS POR TRES


VENDEDORES DIFERENTES DE 5 TIPOS DE MUEBLES DE LINEA BLANCA, AGREGAR
ADEMAS LISTAS DE COMISIONES TOTALES POR VENDEDORES Y POR TIPO DE MUEBLE Y
LISTAS DE COMISIONES PROMEDIO POR VENDEDORES Y POR TIPO DE MUEBLES.

SUGERENCIA: PRIMERO HACER UN BOSQUEJO EN PAPEL DE COMO QUEDARAN LOS


CUADROS Y LAS LISTAS EN PANTALLA.

5.- TLIST TIPOS DE ARREGLOS EN C++BUILDER (CLASES E INTERNOS)

C++Builder nos proporciona cuando menos dos tiposnuevos de arreglos, ellos son;

TList

Se especializa en el almacenamiento y manipulación de varios tipos de OBJETOS u elementos, por


ejemplo enteros, floats, strings, componentes ( edits, labels, forms, etc. ).

Sin embargo TList no es propiamente un tipo de dato como los float, int, double, etcétera, sino que es una
Clase en C++, y como todas las Clases en C++, TList tiene asociados una serie de propiedades y de
métodos (procedimientos y funciones) que facilitan el procesamiento y manipulación de sus elementos.

Consultando la ayuda de C++Builder, estas propiedades y métodos son:

1.-Propiedades;

Capacity.- Es la cantidad o tamaño del arreglo de apuntadores a los objetos en la lista.

Count.- Numero de objetos contenidos actualmente en la lista Items.- Se usa para referenciar o accesar los
objetos en la lista.

Recordar que las propiedades en un programa, se manejan con el formato nomobjeto→nompropiedad.

2.- Métodos;
Add.- Inserta un objeto nuevo al final de la lista y regresa el lugar o posición donde hizo la inserción.

Clear.- Se usa para vaciar el arreglo, también libera la memoria ocupada por los objetos de la lista.

Delete.- Se usa para eliminar un objeto especifico, lleva como argumento o parámetro la posición del
objeto.

Exchange.- Intercambia dos objetos de la lista.

Expand.- Se usa para agregar mas espacio para nuevos objetos en la lista.

First.- Se utiliza para regresar al primero objeto de la l lista.

IndexOf.- Regresa la posición del objeto en la lista.

Insert.- Inserta un objeto en la posición deseada.

Last.- Regresa la posición del ultimo objeto en la lista.

Move.- Mueve el objeto de una posición a otra posición.

Pack .- Compacta todos los objetos en una lista y libera la memoria ocupada por los objetos que estaban en
la parte inferior de la lista.

Remove.- Remueve o elimina un objeto especificado, el resto los recorre a la posición que ocupaba el
objeto eliminado.

Sort.- Ordena los objetos de la lista, usando QuickSort.

Como se observa TList contiene muchas propiedades y métodos que facilitan grandemente el trabajo con
los elementos de una lista.

Una de las características mas importante es que todas las listas que se derivan de TList, son
completamente dinámicas, es decir listas que se crean y se derivan de esta clase, no son de tamaño fijo, sino
que pueden ir admitiendo elementos mientras la memoria del computador alcance, esta característica junto
con las propiedades y métodos que poseen, hacen de esta clase un objeto digno de estudiar, conocer,
comprender y aplicar de forma muy detallada.

6.- TStringList C++BUILDER

De nuevo, TList se especializa en el almacenamiento y procesamiento de toda clase de objetos, TStringList


en principio es una clase derivada de TList, esto significa que HEREDA o que puede usar muchas de las
propiedades y métodos que pertenecen a TList, además de poder usar igualmente algunas propiedades y
métodos que le son propios.

La diferencia básica, con TList, es que TStringList solo permite almacenar strings, como este es el caso
mas común en el ambiente visual que se ha venido desarrollando, así como en los sistemas o problemas de
información de naturaleza administrativa, el resto del capitulo se dedica a estudiar, analizar y construir
aplicaciones con esta clase.

Sus propiedades y métodos son;

1.- Propiedades;

Count.- Cuenta las strings en la lista

Duplicates.- Permite strings duplicadas en una lista ordenada de strings

Objects.- Asocia un objeto a una string existente (ej. un bitmap a una string).

Sorted.- Especifica que las strings en la lista deben ser ordenadas automáticamente, solo poner esta
propiedad en True.

Strings[reng].- La mas importante, se usa para accesar, y leer o modificar una posición o elemento
especifico o determinado.

2.- Métodos;

Add.- Inserta un objeto nuevo al final de la lista y regresa el lugar o posición donde se realizo la inserción.

Clear.- Se usa para vaciar el arreglo, también libera la memoria ocupada por los objetos de la lista.

Delete.- Se usa para eliminar un objeto especifico, lleva como argumento o parámetro la posición del
objeto.

Exchange.- Intercambia dos objetos de la lista.

Find.- Regresa la posición de una string en una lista ordenada.

IndexOf.- Regresa la posición del objeto en la lista.

Insert.- Inserta un objeto en la posición deseada.

Sort.- Ordena los objetos de la lista, usando QuickSort.

Recuerde que objetos(variables) derivadas de TStringList pueden usar también muchas de las propiedades
y métodos de TList.

Se analiza ahora el procesamiento normal de estos objetos o desde una perspectiva mas tradicional
variables arreglo de tipo lista.

Lo mas importante a recordar es combinar lo ya visto para tratamiento de variables tipo lista normales y
usar igualmente las propiedades y métodos que contiene esta clase.
Para declarar un objeto o variable derivada de esta clase, recordar que aquí son dos pasos, primero se debe
declarar el objeto o variable y segundo se debe crear una instancia real en memoria de este objeto o
variable, como se muestran en los siguientes ejemplos;

Creación y declaración de una lista de 8 ciudades

// área de declaración

TStringList *ciudades;

ciudades = new TStringList;

nota recordar que esta listas son dinámicas, y que no tiene sentido asignarle un tamaño fijo, que también se
podría hacer.

Creación y declaración de una lista de 6 edades;

// declaración y creación de las listas

TStringList *edades;

edades = new TStringList;

Recordar que son listas de strings, si ocupan operaciones con números se deberá usar ToInt() y ToDouble().

Recordar además que estos dos renglones que se ocupan para la declaración, van a ir juntos al principio del
onclick del botón Ok, pero si la captura se realiza usando un montón o conjunto de componentes edits y
otros botones realizan otro proceso con la lista, entonces tendrán que ir separados en su lugar respectivo
( mas delante se indica como ).

Para capturar sus elementos usando de momento el método que se analizo en listas normales, es decir un
montón de componentes Edit, como en el siguiente ejemplo;

// área de declaración y creación

TStringList *ciudades;

ciudades = new TStringList;

// captura de datos

ciudades->Strings[0]=Edit1->Text;

ciudades->Strings[1]=Edit2->Text;

párrafos arriba se encuentra la definición de la propiedad Strings[];

Recordar que son listas y por tanto la primera posición, o primer renglón es la posición 0(cero).

Para desplegar los datos recordar que se puede usar un componente ListBox o un componente ComboBox
que permiten manipular el conjunto de datos a la vez, solo usar las propiedades Text, tanto del ListBox, así
como de la variable objeto derivada de TStringList, como en el siguiente ejemplo;

void __fastcall TForm1::Button1Click(TObject *Sender)


{ TStringList *ciudades;

ciudades = new TStringList;

// procesos con la lista

// despliegue de la lista

ListBox1->Items->Text = ciudades->Text;

La pantalla de salida es:

Para el caso de procesos mas comunes como operaciones, comparaciones, etcétera, solo recordar combinar
las propiedades y métodos de TStringList con los métodos vistos y aplicados ya para componentes visuales
y para los de variables de tipo arreglo ya vistas.

Esto es importante porque exige conocer y familiarizarse con esta clase mas a fondo, por ejemplo un caso
sencillo, capturar una lista de 5 edades en años, convertirlos posteriormente a meses y al final desplegar las
edades convertidas a meses.

Una de las posibles soluciones es:

Código

void __fastcall TForm1::Button1Click(TObject *Sender)

{ TStringList *edad;

edad = new TStringList;

int reng;
// captura de datos

edad->Add(Edit1->Text);

edad->Add(Edit2->Text);

edad->Add(Edit3->Text);

edad->Add(Edit4->Text);

edad->Add(Edit5->Text);

// procesos con la lista

for(reng=0;reng<edad->Count;reng++)

{ edad->Strings[reng]=FormatFloat("###.##",edad->Strings[reng].ToInt()
*
12);

};

notas:

En el for se esta usando la propiedad Count que devuelve la cantidad de elementos que contiene la lista,
esto es con la finalidad de no tener mas que procesar los elementos existentes.

La operación es un solo renglón en el programa.

Recordar que Propiedad Strings[] permite manipular una posición especifica dentro de una lista, recordar
igualmente que la primera posición, es la 0(cero).

Para pasar los elementos de edad a ListBox, ambos componente y variable/objeto usan propiedad Text,
porque ambos la comparten o la heredan esto es importante porque demuestra que realmente no son cosas o
elementos diferentes.

Lo mas importante, es que se debe entender, aprender y aplicar combinaciones de propiedades, métodos y
operaciones como en el ejemplo.

La pantalla de salida es;


Para poder usar un solo componente edit para capturar todos los elementos de la lista:

1. La declaración de la lista se pone en dos partes diferentes, dentro y arriba de la Unit, como se observa en
el siguiente ejemplo;

#include <vcl\vcl.h>

#pragma hdrstop

#include "Unit1.h"

//-------------------------------------------

#pragma resource "*.dfm"

TForm1 *Form1;

TStringList *edad;

//-------------------------------------------

__fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner)

edad=new TStringList;

//-------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)

edad->Add(Edit1->Text);

}
La captura no ocupa ciclo for, pero si ocupa su propio BUTTON OK, solo con Caption =“insertar o
agregar” y su código usa el método Add como en el ejemplo de arriba.

Operaciones y comparaciones son normales, es decir un for renglón hasta que sea menor que Count, etc.,
en el onclick del segundo botón.

Despliegues igualmente en forma normal, es decir sin ciclo for e igualando Text en ambos, el TStringList y
el Listbox.

TAREAS PROGRAMACION C++BUILDER

1.- CAPTURAR Y DESPLEGAR 5 MUEBLES DE HOGAR

2.- CAPTURAR EN UNA LISTA 5 ESTATURAS EN CENTIMETROS, DESPLEGARLAS


CONVERTIDAS EN PULGADAS ( 1 PULGADA = 2.54 CM.)

3.- CAPTURAR EN UNA LISTA 6 PESOS EN KG., CONVERTIRLOS POSTERIORMENTE A LIBRAS


Y SOLO DESPLEGAR EN EL ListBox RESPECTIVO PESOS MAYORES DE 120 LIBRAS.

4.- CAPTURAR EN SUS CUATRO LISTAS RESPECTIVAS, MATRICULA, NOMBRE,


CALIFICACION DE MATEMATICAS, CALIFICACION DE FISICA, DE 5 ALUMNOS, CALCULAR
POSTERIORMENTE UNA LISTA DE PROMEDIOS, Y EN LOS ListBox DE SALIDA SOLO
DESPLEGAR LOS DATOS DE ALUMNOS APROBADOS.

7.- COMPONENTE ListBox C++BUILDER ( Standard )

Este componente permite procesar visualmente un conjunto de elementos de tipo string.

Este componente hereda muchas de las propiedades y métodos de TStringList y TStrings, mas algunas
propiedades y métodos propios.

Se puede añadir, eliminar e insertar ítems en la lista usando los métodos Add, Delete, Insert con la
propiedad Items, que también es de tipo TStrings.

Si se quiere que ListBox presente varias columnas, solo cambiar el valor de la propiedad Columns, para
ordenar o clasificar los ítems, usar la propiedad Sorted.

Se puede permitir que un usuario realice una selección múltiple, poniendo la propiedad MultiSelect en true,
la propiedad ExtendedSelect determina como se realiza la selección múltiple.

Para determinar cual ítem en particular esta seleccionado solo validar la propiedad Selected, para conocer
cuantos ítems se han seleccionado revisar los valores de la propiedad SelCount.

Propiedades:
BorderStyle.- Despliega la lista con un marco sencillo o sin marco.

Canvas.- Se utiliza para asociar un área de dibujo o de imagen a un ítem de la lista (consultar ayuda de esta
propiedad en ListBox puesto que es interesante).

Columns.- Define una determinada cantidad de columnas para su despliegue dentro del ListBox.

ItemIndex.- Se utiliza para seleccionar la posición o índice de un ítem o elemento en la lista.

Items.- Es la propiedad que mas se ha venido usando, se utiliza para accesar las diversas propiedades y
métodos de las strings en la lista.

Sorted.- Se usa para ordenar alfabéticamente los elementos de la lista( ListBox1→Sorted= true; )

Style.- Define diversos o varios estilos o formas de ListBox.

Métodos:

Clear.- Elimina todos los elementos a la vez.

En la practica para cargar o capturar sus elementos, se deberá usar el método Add, ya que no se permite
cargar directamente sus datos o elementos por el usuario del programa, solo usar código como el siguiente;

ListBox1→Items→Add(Edit1→Text);

Recordar que se pueden usar todos los métodos, para insertar, eliminar, contar, etc.

Si los valores son de tipo “numérico”, se pueden efectuar procesos con ellos de dos maneras:

Pasando los valores de ListBox a una variable numérica de tipo arreglo y procesando esta ultima variable.

Usar instrucciones directamente de proceso con los métodos ToInt y ToDouble, como se realizo con las
variables/objetos derivadas de TStringList.

Si es necesario pasar el contenido de ListBox1 a ListBox2, solo usar la propiedad Text en ambas, ej.;
(ListBox2→Text=ListBox1→Text).

Ejemplo con ListBox, para este caso se pide capturar 5 edades en un ListBox, luego sumarle 3 años a cada
una usando el mismo ListBox, y desplegarlas en un segundo ListBox convertidas a meses.

Pantalla de diseño:

Código:
void __fastcall TForm1::Button1Click(TObject *Sender)

{ ListBox1→Items→Add(Edit1→Text); }

—————————————————— {ListBox2→Items→Add(ListBox1→Items→Strings[reng].ToInt()
* 12);}; } ————————————————————————— Pantalla de salida:

TAREAS PROGRAMACION C+
+BUILDER 1.- CAPTURAR EN UNA LISTA LOS SUELDOS DE 6 EMPLEADOS Y DESPLEGARLOS EN
UNA SEGUNDA LISTA AUMENTADOS EN UN 30% 2.- CAPTURAR EN UNA LISTA LOS PESOS EN
KILOGRAMOS DE 6 PERSONAS DESPLEGARLOS EN UNA SEGUNDA LISTA CONVERTIDOS A
LIBRAS Y ADEMAS SOLO LOS MAYORES DE 100 LIBRAS. 3.- CAPTURAR EN SUS 4 LISTAS
RESPECTIVAS MATRICULA, NOMBRE Y DOS CALIFICACIONES DE 5 ALUMNOS, DESPUES
CALCULAR UNA LISTA DE PROMEDIOS DE CALIFICACIONES. 4.- CAPTURAR EN SUS LISTAS
RESPECTIVAS NUMEMPLEADO, NOMEMPLEADO, DIAS TRABAJADOS Y SUELDO DIARIO DE 5
EMPLEADOS, DESPLEGAR EN OTRA PANTALLA O PANEL LA NOMINA PERO SOLO DE AQUELLOS
EMPLEADOS QUE GANAN MAS DE $300.00 A LA SEMANA.

8.- COMPONENTE StringGrid C++BUILDER ( adicional )

Este componente es de los mas importantes, para el procesamiento de muchos datos, permite concentrar,
procesar y mostrar gran cantidad de información para la vista del usuario.

Este componente presenta, manipula y procesa conjuntos de datos de tipo strings en forma tabular, es decir
en forma de tablas, matrices, cuadros concentrados, ejemplo;

CIA ACME

INGRESOS POR VENTAS MENSUALES

MILLONES DE PESOS
ENE FEB MAR ABR

SUC A 1 2 3 4

SUC B 5 6 4 5

SUC C 6 7 8 9

Recordar que son los datos numéricos internos quienes se procesan (es decir, se capturan, se realizan
operaciones con ellos, se despliegan, etc.), es la información externa quien le da sentido.

Algunas de sus propiedades y métodos mas interesantes son:

ColCount.- Determina la cantidad de columnas que contendrá la tabla.

Recordar que para efectos de programación, la primera de ellas es la columna 0.

RowCount.- Determina la cantidad de renglones que contendrá la tabla.

Recordar que para efectos de programación, el primero de ellos es el renglón 0.

Fixedcol , Fixedrow.- Determinan la cantidad de columnas y renglones fijos o de encabezado, estas


propiedades ponerlas en 0.

+Options, goediting = true; Para que permita editar o capturar datos al usuario.

+Options, gotab = true; Para que el usuario pueda navegar entre celdas usando la tecla del tabulador.

Cells[columna][renglón], Es la propiedad mas importante, porque es la que permite el acceso a cualquier


celda de la tabla,

StringGrid1→Cells[1][1]=“PATO”;

Edit1→Text=StringGrid1→Cells[0][0];

Edit2→Text=StringGrid→Cells[0][1] * 3.1416;

observar que a pesar de ser de tipo Strings, se pueden efectuar alguna operaciones matemáticas
directamente con las celdas.

Aunque es mas seguro sobre todo en el caso particular de la suma, convertirlos a Cells[][].ToInt() o
ToDouble(), ej.;

Edit2→Text=StringGrid1→Cells[1][0].ToInt()+5;

Las demás propiedades investigarlas en la ayuda del CBuilder.

Para procesar todos los elementos de la tabla, solo recordar que se deben usar dos ciclos for, uno externo
para controlar columnas, y uno interno para controlar renglón ( observar que es lo inverso de las tablas o
arreglos normales).

Ejemplo , capturar una tabla de 3 * 4 enteros, y restarles 4 después;


Pantalla de Diseño:

Programa;

void __fastcall TForm1::Button1Click(TObject *Sender)

{ int col, reng ;

for(col=0;col<=2;col++)

for(reng=0;reng<=3;reng++)

{StringGrid1->Cells[col][reng]=StringGrid1->Cells[col][reng]. ToInt()-
4 ;};

Pantalla de Corrida:

Un proceso muy común con tablas, cuadros y concentrados es agregarles listasde totales y promedios ya
sea por columna o por renglón o ambas , por ejemplo;

CIA ACME

INGRESOS MENSUALES

ENE FEB MARZO TOTALSUC PROMSUC

SUC A 1 2 3 6 2

SUC B 4 5 6 15 5

SUC C 7 8 9 24 8

SUC D 10 11 12 33 11
TOTMES 22 26 30

PROMMES 5.5 6.5 7.8

En este ejemplo aparte de la tabla se ocupan 4 listas, dos para totales y dos para promedios.

El código es sencillo, pero recordarlo y aprenderlo para siempre:

//declaración

float tabla[4][3], totsuc[4], promsuc[4];

float totmes[3], promes[3];

//observar tamaños de listas que referencian renglón

// listas que referencian columnas, se supone que la tabla // ya esta


capturada.

//código para operaciones para totales y promedios //renglones por


sucursal:

for(reng=0;reng<=3;reng++)

for(col=0;col<=2;col++)

{ totsuc[reng]=totsuc[reng]+tabla[reng][col]; };

for(reng=0;reng<=3;reng++) promsuc[reng]=totsuc[reng] / 3.0 ;

// operaciones para totales y promedios por mes

for(reng=0;reng<=3;reng++)

for(col=0;col<=2;col++)

{totmes[col]=totmes[col]+tabla[reng][col]; };

for (col=0;col<=2;col++) prommes[col]=totmes[col]/4.0;

TAREAS PROGRAMACION C++BUILDER

1.- Construir un concentrado que despliegue los costos fijos de tres diversos productos que se fabrican en
cuatro sucursales de una empresa MAQUILADORA.

2.- Construir un concentrado que contenga los ingresos por ventas mensuales de los 4 primeros meses del
año de tres sucursales de una cadena refaccionaría, agregar listas de ingresos totales por mes e ingresos
promedios por sucursal.

3.- Construir un cuadro que contenga las calificaciones de 5 materias de cuatro alumnos cualesquiera,
incluir promedios de calificaciones por materia y por alumno.
IV UNIDAD C++BUILDER INT A LAS BASES DE DATOS

1.- INTRODUCCION C++BUILDER

En este capitulo se analizan en general dos problemas:

Variables que permitan almacenar conjuntos de datos como los arreglos pero de distintos tipos de datos,
este primer problema se resolvía en la antigüedad usando las llamadas variables registro, o tipo struct en C.

Permanencia de los datos, hasta ahora todos los datos capturados, calculados, creados, etc. al terminar o
cerrarse el programa se pierden y es necesario volver a capturarlos, etc., en la siguiente ejecución o corrida
del programa.

Tradicionalmente en programación antigua este segundo problema se resolvía usando el concepto de


archivos, que son medios permanentes de almacenamiento de datos en los dispositivos o periféricos
apropiados, generalmente disco, cinta magnética, etc.

2.- MODELOS DE ALMACENAMIENTO DE DATOS C++BUILDER

En general existen dos modelos de almacenamiento de datos en los sistemas de información.

El modelo tradicional de archivos que se construye con los siguientes elementos:

a.1) Variables Registros, como ya se indico son variables que permiten almacenar conjuntos de datos de
diverso tipo.

También se pueden definir como representaciones simbólicas y programaticas de entidades lógicas de


información, ejemplos de variables registros son alumnos, empleados, clientes, proveedores, productos,
autos, etc.

Esta variables registros, también ocupan programas o rutinas de programas para procesarlas, por ejemplo
un procedimiento, modulo o subrutina, se encargara de capturar los datos que contendrá la variable registro,
otro procedimiento para corregir los datos que ya contiene, otro procedimiento para desplegarlos en
pantalla ya cuando ha sido capturada y así sucesivamente.

a.2) Archivos, que en principio pueden entenderse como una especie de almacenes o bodegas para
almacenamiento de datos en forma permanente en disco, es decir un archivo de empleados en disco
contiene todos los datos de todos los empleados de una empresa.

Igualmente los archivos ocupan su propios programas o subrutinas o procedimientos especializados por
ejemplo, procedimientos para crear los archivos, para almacenar o dar de altas los registros en el archivo,
procedimientos para buscar un registro determinado, procedimiento para dar de baja un registro, etc.

a.3) Una aplicación, que es un programa que se encarga de coordinar todos los programas descritos y
presentárselos a los usuarios de manera clara, fácil y accesible y entendible.
Salta a la vista que construir un sistema de información por ejemplo para una tienda de vídeo o para un
refaccionaría, etc. involucra un gran cantidad de trabajo de programación, puesto que hay que programar
muchas variables registros, muchos archivos en disco, y una o varias aplicaciones.

Este modelo se usa todavía en la actualidad, pero es obvio que mejores maneras, mas rápidas, seguras y
eficientes existen en la actualidad para resolver estos problemas, y esto nos lleva al segundo modelo de
datos.

Modelo de Bases de Datos Relaciónales, este modelo intenta simplificar la construcción de sistemas de
información como los antes descritos, este modelo solo incluye en forma simple los siguientes elementos:

Tablas, es una combinación de las variables registro y de los archivos del modelo anterior.

Es decir cuando un programador moderno define o declara una tabla en un programa, realmente esta
haciendo dos cosas por el precio de una, es decir crea una variable registro en memoria que almacenara los
datos y al mismo tiempo ya esta creando un archivo en disco que se llamara igual que la tabla o variable
registro y que automáticamente se convertirá en un espejo de la tabla en memoria, es decir cuando se
cargan los datos en la tabla en memoria, también se estarán cargando ala vez en disco.

Otra vez cuando el programador escribe código para capturar los datos y mandarlos a la tabla en pantalla-
memoria, realmente también lo esta haciendo para darlos de alta en disco.

Aplicación, que tiene la misma función que en el modelo anterior.

No confundir este concepto de tablas en base de datos con el concepto de tablas, vistos en el capitulo de
arreglos, aunque en la practica se parecen mucho, la diferencia es que los datos no se van a disco.

Como se observa en este modelo, es mas sencillo construir sistemas de información con el, puesto que la
parte programatica se reduce ampliamente.

IV UNIDAD C++BUILDER INT A LAS BASES DE DATOS

3.- TABLAS C++BUILDER

Una Tabla simple, representa una

UNIDAD de información de una entidad lógica de información:

Tabla Empleado:

* Clave Empleado * Nombre Empleado * Dirección Empleado * Edad Empleado * Teléfono Empleado *
etc. Empleado

Tabla Proveedor:
* Clave Proveedor * Nombre Proveedor * Empresa Proveedor * Teléfono Proveedor * Fax Proveedor *
Celular Proveedor * etc. Proveedor

Tabla Autos:

* Numero de Serie * Modelo * Marca * Tipo * Color * Capacidad * etc.

Observar que cada tabla, empieza con una clave generalmente detipo numérica.

Todos los elementos de la tabla, solo hacen referencia hacia el mismo ente o sujeto de información.

Cada elemento solo representa o debe contener un solo dato de información.

No se respetan o siguen al pie de la letra estos tres postulados y empiezan los problemas al tiempo de
programación.

Existe una segunda forma o manera de representar las tablas, ejemplo:

Tabla: Camisas

NumCamisa Marca Estilo Medida Color Material

1 Jeans Manga Corta Grande Azul Algodón

2 Voláis Camiseta Mediana Negra Poliester

3 Genérica Manga Larga Chica Morado Rayón

etc. etc. etc. etc. etc. etc.

Tabla: Clientes

NumCliente NomCliente DirCliente TelCliente

1 Juan Pérez Av. aba 121212

2 Luis Pérez calle zeta 898989

3 José Pérez cjon sss 000000

etc. etc. etc. etc.

Recordar siempre, una tabla almacena o representa un conjunto de datos relacionados entre si, la tabla de
alumnos es para almacenar y manipular muchos alumnos, la tabla de productos es para almacenar y
manipular muchos alumnos, en resumen si en un problema de información solo se presenta una instancia o
renglón de una entidad lógica, entonces no es tabla, es un encabezado.

TAREAS PROGRAMACION C++BUILDER

1.- CONSTRUIR EN CUADERNO LAS SIGUIENTES TABLAS, LA MITAD DE ELLAS CON EL


PRIMER FORMATO Y LA SEGUNDA MITAD CON EL SEGUNDO FORMATO.

4.- C++BUILDER TABLAS (CONTINUACION)

El trabajo correcto con bases de datos relaciónales, se divide en dos grandes pasos o etapas bien
diferenciadas entre si:

En la primera etapa se diseña la tabla , con sus campos, llaves y condiciones especiales, luego se usa un
paquete o programa de software especializado en la construcción, mantenimiento y administración de la
base de datos, este software se usa para convertir la tabla o tablas ya bien diseñadas en un archivo en disco.

Estos paquetes, o software reciben el nombre de DBMS(DATA BASE MANAGEMENT SYSTEM) o


sistema administrador de bases de datos.

Este software se especializa en la creación, mantenimiento, seguridad, privacidad, etc. de un conjunto de


tablas o mejor dicho una base de datos, los DBMS mas comunes son Oracle, SqlServer, Informix, Sysbase,
etc.

Borland la compañía que fabrica C++Builder, proporciona junto con el C++Builder, un miniDBMS
llamado DataBase Desktop, mismo que se encuentra en el mismo folder o subdirectorio que el C++Builder,
y que también se usara para construir las tablas y/o archivos físicos.

La segunda etapa consiste en construir la aplicación o aplicaciones que ya tendrán acceso o podrán
manipular los datos contenidos en la tabla, estas aplicaciones se escriben usando ya sea lenguajes clásicos
de programación como BASIC, PASCAL, COBOL, CBUILDER, DELPHI, etc o también se pueden
accesar paquetes comunes de manipulación de archivos o bases de datos como DBASE, CLIPPER,
VISUALFOX, ACCESS, etc.

DISEÑO Y CREACION DE UNA TABLA

El primer paso antes de usar el paquete correspondiente a esta tarea, es diseñar la tabla completamente, esto
exige:

1. Nombre apropiado y determinación de atributos y campos correspondientes

2. Seleccionar y determinar el atributo principal o campo clave o llave primaria que se utiliza como el
identificador único que permite diferenciar cada instancia o renglón diferente dentro de la tabla.

3. También se puede seleccionar otros campos que puedan servir mas adelante para ordenar de manera
diferente la tabla, es decir una tabla en principio ya está ordenada por el campo clave, por ejemplo, la
matricula de un alumno, el numero de empleado, etc., pero existirán muchas ocasiones mas adelante donde
se puede pedir un orden diferente, por ejemplo, por ciudad, por carrera, por nombre, por edad, etc., la buena
ingeniería de una base de datos exige tomar en cuenta estos y otros muchos problemas y detalles.
4. Escribir restricciones y condiciones apropiadas para ciertos atributos , por ejemplo el número de
empleado deben comenzar en 500, la edad no debe ser mayor de 150 años, etc.

Ya listo el diseño de la tabla, se pasa a el programa correspondiente para su creación y almacenamiento,


dicho programa que se encuentra dentro de el folder o subdirectorio de CBuilder y como ya se dijo es:

5.- DATABASE DESKTOP C++BUILDER

No es un componente de la barra de herramientas, es el icono de un programa que se encuentra en el mismo


folder o directorio que el C++Builder.

El procedimiento completo para construir la tabla, es:

b) Crear una nueva con file, new, table, DD pregunta cual formato de tabla se va a usar;
c) El formato a seleccionar es Paradox 7,(Borland es la compañía propietaria de los arriba mencionados,
otras versiones de C++Builder ya traen licencias para nuevos tipos, como Access, etc.), ya hecha la
selección entramos a el siguiente editor de tablas:

Tomar nota de las dos áreas del editor, la primera de ellas es el field roster y la segunda área es la de
propiedades de la tabla.

d) Se usa ahora la primera área, para escribir los campos o atributos de la tabla, la segunda columna es el
tipo de dato del atributo, para asignar un tipo de dato a un atributo, pulsar dos veces la barra espaciadora en
el teclado para que salga la siguiente lista de tipos de datos:

Como se observa existen muchos e interesantes tipos de datos, de momento solo usar los mas comunes,
enteros, short, numéricos, y alpha para el caso de strings.
La opción size(tamaño) solo se usa cuando el campo es de tipo string ( ALPHA) y se tiene que dar el
tamaño de la string, por ejemplo en campo Dirección el size o tamaño es 30.

La opción Key, es para marcar un atributo o campo, como llave primaria, o llave principal de las instancias
o renglones u objetos diferentes de la tabla, para marcar un campo como llave primaria, solo dobleclick en
esta opción Key.

e) La segunda área de la tabla, son las propiedades de la tabla, todas las propiedades de la tabla están dentro
del siguiente combobox.

Todas y cada una de las propiedades, se definen abajo en la parte de propiedades del editor de tablas, es
decir la propiedad validity check tiene como elementos:

La propiedad siguiente tiene sus propios elementos y así sucesivamente.

De momento solamente dejar las propiedades o sus partes en blanco.

f) No olvidar usar la opción SAVE abajo para guardar la tabla, en esta parte sale la ventana normal de
Windows para grabación, esa ventana donde se puede crear un nuevo folder, etc., solo buscar el directorio
que se creo al principio de la sesión con my computer, abrirlo(OPEN) y escribir un nombre apropiado para
la tabla.

Ya creada la tabla, es conveniente cargarle unos cuantos renglones registros o datos para pruebas, esto se
hace con:

c.1) Usar el icono de OPEN tabla y seleccionar la tabla a cargar.

c.2) Entrar al modo de edición usando el icono de Edit y ya se puede empezar a capturar los datos en
cada renglón.
c.3) Para terminar solo click en la X arriba en la tabla respectiva.

Ejemplo de una tabla;

Recordar que todos los cambios hechos a una, añadir, insertar, eliminar, modificar, etc. quedan grabados
automáticamente en disco, este hecho es la razón por lo que no existe una opción de grabar un renglón o
registro cualesquiera.

Ahora si, ya creada, declarada o definida la tabla, es tiempo ahora de construir la aplicación, para esto se
usara nuevamente el C++Builder .

6.- APLICACIONES O PROGRAMAS CON TABLAS C++BUILDER

Básicamente una aplicación consiste de un programa o forma que permite accesar, manipular, editar,
procesar, etcétera, los datos, registros, o renglones de una tabla, es decir es la aplicación la que constituye,
la vista sobre la que trabaja el usuario del programa.

Como ya se explico en el modelo tradicional de almacenamiento de datos, existían muchos procesos, tanto
para la manipulación de registros en memoria, capturas, modificaciones, etc., como para el almacenamiento
de todos ellos en archivos en disco, el famoso ABC de un sistema de archivos (altas, bajas, consultas,
modificaciones, etc.) y todos ellos había que construirlos programarlos a mano, era terrible la situación de
los programadores de antaño.

En el modelo relacional-visual de datos, mucho de este trabajo no existe, solo se construye una forma, y se
pegan unos cuantos componentes para que aparezcan las propias tablas y componentes para que se
procesen los datos que contendrán la tablas.
Recordar también que la aplicación ya no deberá preocuparse, donde se almacenan los datos, de validar las
condiciones y restricciones impuestas en ellos, etc., todo este trabajo ahora es responsabilidad del
miniDBMS que usado, el DataBase Desktop.

Existen dos maneras sencillas de construir aplicaciones, la primera de ellas es presentarle al usuario un solo
renglón de información para su proceso y manipulación y la segunda es presentarle toda la tabla a la vez,
también para su manipulación y proceso.

7.- APLICACIONES POR RENGLON C++BUILDER

Para construir una aplicación, presentándole un solo renglón al usuario para su procesamiento en C+
+Builder, solo se ocupa una forma (Form1) y solocuatro componentes diferentes de acceso y manipulación
de tablas, estos cuatro componentes son:

PROCEDIMIENTO Y COMPONENTES

1.- Colocar un componente Table (Data Access ) en algún lugar de la forma donde no estorbe( este
componente quedara flotando y no aparece al momento de ejecución del programa).

Este componente Table, sirve de enlace físico entre la tabla real que se creo con el DataBase Desktop y el
resto de los componentes que se usaran para la construcción de la aplicación.

Sus tres propiedades mas importantes son:

* Propiedad DataBaseName = Solo escribir el directorio donde se encuentra la tabla real, por ejemplo
c:\datos

* Propiedad TableName = Solo click a un lado de esta propiedad y seleccionar la tabla a usar, por ejemplo
seleccionar la tabla de clientes.

* Propiedad Active = Ponerlo en valor True.

2.- Colocar un componente DataSource (Data Access) también en algún lugar en la forma donde no
estorbe.

Este Componente actúa como el enlace físico entre el Componente Table y el resto de componentes que
procesan los datos de la tabla, es decir el componente Table apunta a la tabla real en disco, el componente
DataSource apunta al componente Table, y el resto de los componentes apuntan a DataSource.

Su única propiedad a modificar es:

Propiedad DataSet = Click a un lado y seleccionar el componente Table al que se quiere enlazar, por
ejemplo Table1.

3.- Componente DBEdit (Data Controls) .

Este componente permite presentar y manipular un dato de la tabla a la vez.


Es un componente muy similar al componente Edit y comparte muchas de las propiedades y métodos de
este ultimo, su diferencia principal es que Edit, carga sus datos desde el usuario y DBEdit los carga desde la
tabla almacenada en disco.

De este componente se deben colocar tantos de ellos en la forma, como columnas existan en la tabla a
procesar.

Sus dos propiedades mas importantes y en el orden abajo descrito son:

Propiedad DataSource = Click a un lado y seleccionar el DataSource al que se quiere enlazar, por ejemplo
DataSource1.

Propiedad DataField = Click a un lado y seleccionar el campo o atributo o columna que se quiere
representar o enlazar por ejemplo ClaveCliente, NomCliente, etc.

Recordar que se deben colocar tantos DBEdit en la forma, como columnas existan en la tabla, o como
columnas se quieran presentar al usuario para su manipulación.

Recordar poner unos cuantos componentes Label, arriba del componente DBEdit y cargarlos en su
propiedad caption con el nombre del campo o columna respectivo.

4.- Componente DBNavigator (Data Controls) .

Button Significado

First Regreso al primer registro o renglón de la tabla.

Prior Regreso a registro o renglón anterior.

Next Avanza al siguiente renglón.

Last Avanza a el ultimo renglón.

Insert Inserta un nuevo renglón en la tabla.

Delete Borra o elimina el renglón o registro actual.

Edit Pone el registro actual en estado de edición para su modificación

Post Graba el registro o renglón actual en la tabla en disco.

Cancel Cancela modo edición y restaura los datos anteriores que tenia el renglón.

Refresh Refresca o regraba toda la información.

Recordar poner unos cuantos componentes Label arriba de los botones del navegador para su aclaración,
uso y manejo al usuario.
Sus dos propiedades mas importantes son:

Propiedad DataSource = Click a un lado y seleccionar el DataSource al que se quiere enlazar, por ejemplo
DataSource1.

Propiedad +VisibleButtons = Click en el signo +, para activar(True) o desactivar(False) los botones de


proceso de renglones de la tabla, que se quieran mostrar u ocultar al usuario.

Con estos cuatro componentes ya se construye una aplicación, ejemplo;

Pantalla de Diseño:

Pantalla de ejecución:

TAREAS PROGRAMACION C++BUILDER

1.- Construir aplicaciones para la mitad de las tablas hechas en el DataBase Desktop.
8.- APLICACION POR TABLA C++BUILDER

En este tipo de aplicación, al usuario se le presenta toda la tabla completa a la vez para su procesamiento y
manipulación.

Para construir esta tipo de aplicación, solo se ocupan tres componentes y dos de ellos ya son conocidos,
estos componentes son:

Componente Table ( Data Access)

* propiedad DataBaseName = c:\datos

* propiedad TableName = Clientes.db

* propiedad Active = True

Componente DataSource ( Data Access)

* propiedad Dataset = Table1

Componente DBGrid ( Data Controls)

* DataSource = Click a un lado de la propiedad, para seleccionar el DataSource respectivo a enlazar, por
ejemplo DataSource1.

Una característica interesante, es que este componente DBGrid, trae asociado un editor de columnas, solo
poner el componente DBGrid en la forma, enlazarlo al DataSource y luego doble click dentro del DBGrid y
aparece el siguiente editor:

Primero usar el botón Add All Fields para cargar todos los campos columnas a la primera ventana y de esta
ventana ir seleccionando el campo o columna a procesar, observar que se pueden agregar nuevas columnas,
o eliminar columnas existentes y para cada columna que se vaya seleccionando ya funciona la segunda
parte del editor.

Componente DBNavigator( Data Access)

* propiedad DataSource = DataSource1

* propiedad +VisibleButtons = activar o desactivar los botones apropiados

Aunque este componente no se ocupa en este tipo de aplicación, puesto que el usuario puede realizar todos
los procesos básicos directamente dentro de la tabla, es conveniente poner un navegador para darle una
segunda opción o manera de realizar los procesos básicos.

Un ejemplo de aplicación con esta estructura es:

Pantalla de Diseño
Pantalla de ejecución:

TAREAS PROGRAMACION C++BUILDER

1.- CONSTRUIR APLICACIONES CON ESTE FORMATO PARA LA SEGUNDA MITAD DE LAS
TABLAS CREADAS CON EL DATABASE DESKTOP.

9.- PROCESOS BASICOS C++BUILDER

Analizaremos ahora algunos procesos también básicos que pueden realizarse con los dos tipos de
aplicaciones y que además no están contemplados en algunos de los botones del navegador.

OPERACIONES CON CAMPOS


Para el caso de aplicaciones construidas con componentes DBEdit, recordar que comparte muchas
propiedades y métodos con el componente edit, así que es valido por ejemplo en una aplicación donde la
tabla productos tiene el campo costounitario(DBEdit3) y el campo o columna utilidad(DBEdit6), poner un
componente edit1 para el precio de venta y realizar la siguiente operación en el onclick de un botón
apropiado.

//-----------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)

Edit1->Text=DBEdit3->Text.ToDouble()+DBEdit6à Text.ToDouble();

Como se observa se puede accesar y manipular los componentes DBEdit usando la propiedad Text, tanto
para leerlos como para cargarlos.

Problemas sugeridos:

1.- Una tabla de productos con campos costounitario, margen de utilidad y tasa de iva, calcular el precio de
venta.

a.2) Para el caso de aplicaciones con DBGrid, se pueden accesar sus celdas para su lectura y proceso
usando código como en el siguiente ejemplo, en algún botón o evento apropiado:

Edit3→Text = DBGrid1→Fields[2]→AsInteger * 5;

Observar la propiedad Fields[col], es para indicar la columna deseada y además comienza en la 0(cero),
recordar además que este acceso será realizado solamente sobre el renglón seleccionado en la tabla (aquel
que esta seleccionado con un *).

También se esta usando el método AsInteger para leerlo como entero.

Es conveniente usar la ayuda del C++Builder para el componente DBGrid para conocer todas sus
propiedades y métodos.

Para cargar una celda con un nuevo valor, usar código como el siguiente en algún botón o evento
apropiado.

Onclickbutton5(){

DBGrid1→Edit();

DBGrid1→Fields[3]→Value = 300;

1.- Observar que son dos pasos, en el primero se pone todo el DBGrid en modo de edición y en el segundo
se carga ya la celda seleccionada con el nuevo valor.

2.- Recordar que el cambio es en una celda de un solo renglón, y es el renglón seleccionado.
3.- Como primera nota interesante, esta propiedad Edit() es también la del navegador, es decir es valido
DBGrid1→First, etc.

4.- Para la modificación de la celda, se usaron otra vez la propiedad Fields[col] y método Valúe, recordar
nuevamente estudiar propiedades y métodos de DBGrid.

Problema sugerido:

TAREAS PROGRAMACION C++BUILDER

1.- La misma tarea anterior, pero ahora con tabla.

10.- BUSQUEDAS C++BUILDER

Un problema muy común en los sistemas de información basados en bases de datos es el de búsquedas, en
estos casos el usuario proporciona un dato, generalmente la clave del registro, para que se localice toda la
información pertinente.

Para resolver este problema, solo se ocupa:

1. Un botón de ordenes (OK) con el siguiente código:

Los parámetros del método Locate(), son;

Locate(“Columna de búsqueda” ,”Dato a buscar” , opción de búsqueda);

cuando opción = 0; → ignora diferencia entre mayúsculas y minúsculas

cuando opción = 1; → resultado parcial, ejemplo si se busca “ju” se posesiona en el primer renglón donde
ese campo empiece con “ju”, ejemplo Juan, juvenal, etc.

TAREAS PROGRAMACION C++BUILDER

1.- CONSTRUIR UNA APLICACION DE BUSQUEDAS PARA UNA TABLA DE AUTOS, CON
OPCIONES DE BUSQUEDA POR CLAVE, MODELO, COLOR, PRECIO.

11.- FILTROS C++BUILDER

Un filtro es una condición que permite desplegar solo determinada información de una tabla.

Es decir, en ocasiones solo se quiere desplegar información condicionada al usuario, por ejemplo de la
tabla de clientes solo desplegar aquellos que sean de la ciudad de Tijuana, de la tabla de autos, solo
desplegar aquellos de modelo 1990 en adelante.

Como se observa, filtrar una tabla, es condicionar uno o mas campos o columnas.
Formar condiciones simples o compuestas ya no debe ser problema, el real problema es que la librería de
VCL que contiene los componentes visuales, fue portada a C++Builder por parte de la Compañía Borland
usando la librería VCL de Delphi( y este Delphi es Pascal), en otras palabras los filtros o condiciones se
tendrán que programar tomando en cuenta a como Pascal maneja las constantes strings, los operadores
relaciónales y los operadores lógicos.

Existen dos maneras de poner filtros o condiciones para una tabla, ellas son:

1.- Interna, debe haber un DBGrid en la aplicación y para el componente Table, modificar las siguientes
propiedades:

* propiedad Filter = condición, ejemplos para la tabla de clientes:

= ClaveCliente < 3

= Ciudad <> 'Tijuana'

= ClaveCliente > 2 and Ciudad = 'Tijuana'

* propiedad Filtered = true

2,- Externa, es el usuario quien construye el filtro o condición, usando un componente Edit para el filtro y
un botón de ordenes (OK) para que se ejecute y despliegue la tabla filtrada, el código en dicho botón es;

onclickbutton1()

Table1→Filter = Edit1→Text;

Table1→Filtered = true;

TAREAS PROGRAMACION C++BUILDER

1.- UNA TABLA DE AUTOS FILTRADA INTERNAMENTE POR COLOR AZUL Y MODELO DE 1990
EN ADELANTE.

2.- UNA TABLA DE PROVEEDORES Y QUE SEA EL USUARIO QUIEN CONSTRUYA EL FILTRO O
CONDICION.

12 - GRAFICOS O IMAGENES C++BUILDER

Campos de gráficos o de imágenes, se han convertido en una de las grandes atracciones y características de
las bases de datos modernas.

En C++Builder, el manejo de dichos campos es muy fácil solo:

1.- Cuando se crea la tabla en el DataBase Desktop, incluir un campo de tipo de dato Graphics, por ejemplo
en la tabla de clientes, incluir el campo foto de tipo Graphics.
2.- En aplicaciones por renglones , no usar un DBEdit para este campo, sino usar un componente DBImage

(Data Controls) .

Si el renglón o registro ya esta cargado con su imagen respectiva, al hacer la navegación entre renglones,
este componente DBImage las va desplegando.

3.- En aplicaciones por tablas, usar el editor del DBGrid para ocultar el campo de tipo Graphics y poner a
un lado del DBGrid un componente DBImage, esto hace la misma función, es decir al momento que el
usuario navega entre los renglones de la tabla, este componente va desplegando la imagen del renglón
donde se encuentra el cursor.

4.- El problema, es como cargar las imágenes, la respuesta es sencilla, las imágenes solo pueden cargarse,
capturarse o provenir de solo dos fuentes o lugares distintos:

4.1) Un archivo de tipo *.BMP( u otros formatos similares)

4.2) Del Clipboard de Windows

5.- Cualquier dispositivo o periférico de este tipo (scaners, cámaras digitales, etc.) o programas de
imágenes ( paintbrush, paint, corel, etc.) tienen estas dos capacidades, es decir pueden mandar sus
imágenes ya sea al Clipboard o ya sea a un archivo en disco.

6.- Para capturar una imagen en una aplicación ya sea por renglón o por tabla, recordar no usar un campo
DBEdit para este campo, sino un campo DBImage, para usar el Clipboard para capturar se tienen dos
maneras sencillas:

6.1- Colocado el cursor dentro de este campo DBImage, pedirle al usuario, usando un Label por ejemplo
que solo teclee, CTRL V, ( observar el paste en el edit de cualquier ventana de Windows).

6.2.- Usar además del componente DBImage un componente Button de ordenes(OK) con el siguiente
código:

{ DBImage1→PasteFromClipboard(); }

Recordar que para usar estos métodos, el Clipboard de Windows ya debe estar cargado con la imagen, para
pruebas sencillas, minimizar la aplicación, cargar el PaintBrush o Paint, cargar un archivo .BMP,
seleccionarlo luego Edit Copy, cerrar el Paint o PaintBrush y maximizar la aplicación y aplicar cualquiera
de los dos métodos.

Es evidente que también se pueden usar CTRL C, CTRL X, CTRL Del(ver edit de cualquier ventana),
CopyToClipboard() (ver ayuda de DBImage), etc., para diferentes procesos.

Recordar además que la tabla física no actualiza el campo correspondiente con su imagen, si no se avanza
de renglón, o se usan los botones Next, Refresh, Update del navegador.

7.- Para cargar o capturar una imagen directamente desde un archivo en disco de extensión .BMP (u otros
similares) solo usar un componente DBImage ya sea en aplicaciones por renglón o por tabla, un
componente Button de ordenes y el siguiente código;

OnClickButton1()

{ DBImage→Picture→LoadFromFile(“C:\datos\mifoto.bmp”); }
Ya debe estar en el directorio o folder datos dicho archivo .BMP y además otra vez recordar, que aunque la
imagen ya esta en la pantalla, todavía no se manda a la tabla a disco si no se ejecuta un avance de renglón o
un Next, etc.

8.- La propiedad Stretch en DBImage, la amplia, otro método es ponerlas en Clipboard o archivo ya con el
tamaño apropiado.

TAREAS PROGRAMACION C++BUILDER

1.- UNA TABLA DE MAMIFEROS COMPLETA INCLUYENDO IMAGENES

2.- UNA TABLA DE PRODUCTOS O MERCANCIAS INCLUYENDO SU FOTO

13.- IMPRESION O REPORTES QREPORT C++BUILDER

Imprimir tablas o construir reportes sobre las mismas, es también una tarea común en los sistemas de
información basados en bases de datos.

Lo bueno es que se tiene un folder o pestaña llamada QReport cargada de componentes visuales
especializados en la impresión de reportes, esta librería de componentes, no es hecha por Borland, es hecha
por una compañía llamada QSOFT&trade;

QReport

Practica para construir un reporte que contiene la cédula de un y solamente un cliente de la tabla de
clientes.

Los componentes y propiedades a usar son:

1.- Table1

* DataBaseName = c:\datos * TableName = Clientes.db * Active = true * Filter = ClaveCliente = 2


(observar que aquí es donde se determina

cual cliente se imprime)

* Filtered = true

2.- QuickRep1, se encuentra en pestaña QReport.

Es el componente principal para impresión.

Toma la forma y tamaño de una hoja de impresora dentro de Form1.

Sus propiedades a usar son:

* Dataset = Table1 * Zoom = 50

3.- QRShape1
Se usara para crear un rectángulo para encabezados de la cédula de un cliente.

Son varios tipos o formas las que existen de QRShape, rectángulos, líneas, círculos, etc., rectángulo es
default, y la propiedad para cambiar de forma es Shape.

Acomodarlo y expanderlo en la parte superior de la hoja de impresión (QickRep1).

Sus propiedades a usar son:

- +Pen = Click en signo + y poner:

Color = clgreen

Width = 5

4.- QRLabel1

Similar a label, contienen textos o mensajes estáticos.

Colocarlo dentro del rectángulo o sección de encabezado.

Propiedades:

+Font = dar color y tamaño de font

5.- QRSysData1

Componente especiales que contienen datos fijos de impresión, tales como numero de pagina, fecha, hora,
etc.

Colocarlo también dentro de la sección o banda de encabezado.

propiedades:

6.- QRSysData2

Otro del anterior, colocarlo dentro de la banda de encabezado, propiedad

7.- QRShape2

Con este se forma ahora un sección, rectángulo o banda principal.

Cuando un reporte, imprime mas de un renglón, por ejemplo todos los clientes, esta parte de la hoja recibe
el nombre de banda de detalle.

Propiedades:

- +Pen = darle color y tamaño(Width) apropiados.

8.- QRLabel###

Colocar varios dentro de la banda de detalle, con caption apropiado, ejemplo, clave, nombre, foto, etc.

9.- QRDBText1
Componente para desplegar cada dato de una celda o campo o columna de una tabla, es similar a DBEdit
pero es estático, es decir solo despliega.

Se deberán poner tantos componentes QRDBText en esta banda o sección de detalle, como columnas de
datos existan o se quieran desplegar de la tabla.

Propiedades:

* Dataset = Table1 * DataField = seleccionar columna apropiada * Font = color, tamaño, etc. que se
quieran

10 .-QRDBImage

Componente para desplegar e imprimir campos de tipo Graphics ( BMP, ICO, WFW).

Propiedades:

* Dataset = Table1 * DataField = Seleccionar una columna de tipo Graphics * Stretch = true

Notas:

1.- El componente QuickRep, tiene la propiedad +Frame, para que también pueda desplegar e imprimir un
marco apropiado.

2.- Para ir desplegando un Preview de impresión al tiempo del diseño del reporte, solo dobleclick dentro de
la hoja de impresión (QuickRep) para que aparezca una ventana de Preview de impresión.

3.- La CIA Qsoft, ya tiene a la venta QReport V3.0 que ya trae incorporado WYSWYNG.

4.- Para Preview o impresión en tiempo de ejecución, solo añadir un botón de ordenes OK, y usar solo una
de las siguientes instrucciones:

OnClickButton1() {

QuickRep1→Preview();

o QuickRep1→Print();
solo una de las dos } ejemplo: a)Pantalla de diseño

b)Programa:
————————————————–

void __fastcall TForm1::Button1Click(TObject *Sender)

QuickRep1→Preview();

————————————————— c)Pantalla de corrida:

Como ya se indico la versión 3


de QReport ya trae incorporado WYSYNG. d)Pantalla de Preview durante ejecución:
TAREAS
PROGRAMACION C++BUILDER 1.- REPORTE CON UN AUTO DE LA TABLA DE AUTOS 2.-
REPORTE DE UN PROVEEDOR, DE LA TABLA DE PROVEEDORES, PERO EL USUARIO
SELECCIONA EL FILTRO O LA CLAVE DEL PROVEEDOR ( CONSTRUIR DOS PANTALLAS, UNA
CON EL FILTRO Y BOTON DE IMPRESION O PREVIEW Y LA SEGUNDA CON EL REPORTE).

14.- IMPRESION DE TODA LA TABLA C++BUILDER

Imprimir toda la tabla significa muchas hojas de impresora.

Primero se deberá quitar el filtro en la tabla y segundo entender lo que tienen en común todas las hojas de
impresora que se ocupan para imprimir la tabla.

Primero todas las hojas ocupan un mismo encabezado o un mismo pie de pagina, donde puede ir por
ejemplo la fecha o el numero de pagina.

La primera hoja de todo el reporte, cuando menos debe llevar una banda de titulo, con el nombre de la
compañía, el titulo y propósito de la tabla, la fecha, etc.

Todo los renglones de la tabla, ocuparan muchas hojas de impresora para desplegarse, incluyendo un
encabezado para todas las columnas que están en la hoja, repito necesitamos un encabezado para columnas
y que aparezca en todas las paginas.

Probablemente, en la hoja final, seria conveniente añadir algunos contadores y acumuladores, por ejemplo
la cantidad de renglones, algún acumulado de alguna columna numérica en especial, etc.

QReport, usa este modelo de bandas para la construcción de reportes, es decir, en la practica anterior se uso
un componente QRShape, para dividir el reporte en dos partes, secciones o bandas, pero QReport trae
incorporado un componente llamado QRBand que permite dividir en partes, secciones o bandas todo el
reporte.
Este componente QRBand, en su propiedad BandType, permite construir los siguientes seis tipos
importantes de banda.

BANDA NOTAS

PAGE HEADER Banda de encabezados de paginas.

Aparece en todas las hojas impresas.

Poner dentro componentes para numero de pagina, etc.

TITLE Banda de Titulo o encabezados del Reporte.

Solo aparece en la primera hoja impresa.

Poner componentes qrlabel con el nombre de la compañía, el propósito de la tabla, fecha, etc.

COLUMM HEADER Banda de o para encabezados de columnas.

Aparece en todas las hojas impresas.

Poner dentro componentes qrlabel con el encabezado que lleva cada columna de la tabla.

DETAIL Banda de detalle.

Es la mas importante, porque es la que contiene los datos de los renglones de la tabla.

Es la que constituye el grueso de las hojas impresas.

Solo colocar dentro de esta banda los componentes de datos impresos, QRDBText y QRDBImage

SUMMARY Banda de resumen.

Solo aparece en la hoja final de impresión.

Poner dentro de ella componentes de operaciones como es QRExpr y estudiarlo en la ayuda, para conocer
sus métodos (funciones) y aplicarlas.

PAGE FOOTER Banda de pie de pagina.

Aparece en todas las hojas impresas.

Su función es similar a la banda de encabezado.

De hecho, en un reporte solo se usa la b banda de encabezado o la banda de pie de pagina, pero no las dos.

Solo poner dentro de esta banda, componentes de numero de pagina, o de fechas, o de hora, etc.

Lo mas importante a tomar en cuenta es cada componente QRBand que se ponga dentro de un reporte, se
deberá definir usando su propiedad BandType, como una cualquiera de los seis tipos de bandas, es decir,
En general el procedimiento completo es:

1.-Poner un componente Table en la forma y nadamas cargarle sus tres propiedades básicas( no usar filtros).

2.-Poner un Componente QuickRep( es la hoja de impresión) y cargarle las propiedades ya descritas en


procedimiento de impresión anterior.

3.- Colocar y expandir un primer componente QRBand dentro del componente QuickRep y primero
asociarle el tipo de banda que representa, por ejemplo de encabezado o de titulo, recordar que un reporte no
necesariamente tiene que llevar las seis bandas.

A este componente QRBand, cambiarle propiedades de font, frame, color, etc.

4.- Colocar dentro del componente QRBand1, los componentes necesarios y apropiados como se indico en
el cuadro anterior de bandas y significados, por ejemplo QRLabel, etc.

5.-Colocar otro componente QRBand en la hoja de impresión, expanderlo y definirlo como banda de titulo
o banda de encabezado de columnas, etc.

6.-Repetir los pasos anteriores, hasta completar todas las bandas.

7.- Colocar un botón de ordenes OK, y asociarle el código de Preview o de impresión.

TAREAS PROGRAMACION C++BUILDER

1.- Desplegar la tabla de Productos, y agregar un botón de impresión de tabla ( son dos formas una con la
tabla y su navegador y la segunda es la forma de reporte) no olvidar Include File Unit.

15.- MODELO RELACIONAL DE DATOS C++BUILDER

Entre dos tablas básicas o tablas simples cualesquiera, se debe y puede buscar, identificar y establecer una o
varias relaciones entre ellas, ejemplo;

tabla Clientes tabla Productos

tabla Autos tabla TALLERES MECANICOS

R1= El auto ingresa al taller

R2= El auto es diagnosticado en el taller

R3= El auto es reparado en el taller

R4= El auto sale del taller

Una relación simple es la unión o combinación de dos tablas básicas mediante una y solo una acción, hecho
o conducta especifica.

Entiéndase de otra manera, como una frase que relaciona las dos tablas y un y solo un verbo que las une.
Si se analizan detenidamente las relaciones de los ejemplo, es también posible deducir que un conjunto de
relaciones forman o constituyen un proceso administrativo, contable, fiscal, o de otro tipo cualesquiera, en
el primer ejemplo el proceso es el ventas, en el segundo es el proceso de reparación de un auto.

Debe ser obvio que un proceso cualesquiera no se podrá describir completamente, con tres o cuatro
relaciones simples nadamas.

Aun mas, en un sistema de información cualesquiera cada una de las relaciones genera una tabla especial
llamada “de relación”, pero también genera en muchos casos un documento especifico, por ejemplo el
cliente compra al contado productos genera la tabla de relación y el documento llamado “Factura”, en la
relación el auto ingresa al taller se genera la tabla de relación y/o documento llamado “ORDEN DE
ENTRADA”, en la relación el cliente aparta productos se genera la tabla de relación y/o documento
llamado “NOTA O RECIBO DE APARTADO”, etc.

Existirán casos o relaciones donde será casi imposible identificar o nombrar el documento o relación
existente, para resolver este problema, existen dos soluciones básicas, la primera de ellas es crear por
nuestra cuenta el documento, es decir si en un modelo practico no existe un documento para esta parte del
proceso lo mas sencillo es crearlo en la empresa, documentarlo y pedir a la empresa que lo ponga en
practica, en algunos casos es también posible no crear documento alguno, solo llamar a esta relación con el
nombre de las dos tablas, por ejemplo rel perros/gatos, rel clientes/productos, etc. ( aunque no es
recomendable o muy explicativo).

Igualmente es muy recomendable,, al describir un proceso cualquiera y su conjunto de relaciones, no usar o


buscar relaciones muy abstractas, porque será casi imposible pasarlas a un modelo de información
implementado en computadora, por ejemplo la relación al cliente le gustan los autos, por ejemplo los perros
corretean gatos, etcétera.

En resumen las relaciones y en general el proceso deben de ser simples, y documentales.

Para terminar de complicar las cosas un modelo completo de información, no se construye con dos tablas
básicas, un par de procesos y una cuantas relaciones o documentos, el modelo completo incluye un montón
de tablas básicas, otro montón de procesos diferentes entre ellas, y cada proceso contiene un conjunto
amplio de relaciones.

Por ejemplo en una Empresa de “AUTOREFACCIONES”, fácilmente se encuentran las tablas básicas, de
clientes, mecánicos, proveedores, partes, proceso de ventas al publico, proceso de compras a proveedores,
etcétera y cada proceso con su propio conjunto de relaciones y o documentos.

TAREAS PROGRAMACION C++BUILDER

1.- PARA UNA EMPRESA DE VIDEO, IDENTIFICAR SUS TRES TABLAS MAS BASICAS , SUS
DOS PROCESOS MAS IMPORTANTES Y CUANDO MENOS CINCO RELACIONES EN CADA
PROCESO.

2.- CONSTRUIR UN MODELO DE TRES TABLAS BASICAS, DOS PROCESOS Y CUATRO


RELACIONES PARA UNA CASA DE EMPEÑO.

3.- UN EMPRESARIO DE EXITO, TIENE VARIOS LOTES PARA LA VENTA DE AUTOS, VARIOS
TALLERES MECANICOS PARA SU REPARACION, VENDE LOS AUTOS A CREDITO Y AL
CONTADO, CONSTRUIR UN MODELO SIMPLE DE BASE DE DATOS RELACIÓNALES PARA SU
IMPLEMENTACION.

16.- TIPOS DE RELACIONES C++BUILDER


Analizando a fondo, la mayoría de las relaciones y sus documentos son del tipo llamado 1:M ( uno a
muchos), es decir cada tabla de relación o documento contiene un renglón de la primera tabla y muchos
renglones de la segunda tabla, por ejemplo en una factura solo hay o se encuentra, un cliente y muchos
productos, en una receta por ejemplo solo hay un paciente pero hay muchas medicinas, en una orden de
compra o de pedido hay un solo proveedor pero hay muchos productos y así sucesivamente.

En general existen los siguientes tipos de relaciones:

Repitiendo el caso mas común de relaciones, son las de 1:M, en este caso, solamente la tabla de relación no
permite resolver el problema de información, en casos de relaciones 1:M se ocupara una segunda tabla
llamada detalle-relación.

El modelo completo de tablas para una y solamente una relación de tipo 1:M es;

tabla de 1(uno) tabla de M(muchos)

- Clave de uno - Clave de muchos

- otros campos - otros campos

tabla de R(relación) tabla detallerelacion

- Clave de relación - Clave de relación

- Clave de uno - Clave de muchos

- otros campos - otros campos

Este es el modelo principal de una base de datos relacional y se deberá siempre aplicar cuando se tenga que
construir una base de datos que tenga una relación 1:M.

Ejemplo;

Clientes(1) Productos (M)

Facturas(relación) DetalleFactura (detallerelación)

Clave Factura Clave Factura

Clave Cliente Clave Producto

Fecha Factura Cantidad Producto

etcétera Factura Etcétera

ejemplo;

Pacientes (1) Medicinas (muchos)

Recetas (relación) DetalleReceta

Como se observa en los dos ejemplos, las tres claves ( la de uno, la de muchos y la de relación) solo se
repiten una sola vez en otra tabla.
De nuevo un problema o sistema de información, que descansa en una base de datos de tipo relacional, y
solo contiene una relación de tipo 1:M ocupa cuatro tablas ( la de uno, la de muchos, la de relación y la de
detalle-relacion).

Si el problema incluye una segunda relación 1:M por ejemplo NotaDeVentaque se deriva de las mismas dos
tablas básicas, entonces el modelo completo se resuelve con seis tablas ( las dos básicas, las dos de relación
y las dos de detalle) y así sucesivamente.

Como se dijo anteriormente un problema sencillo de información por ejemplo el de una tienda de vídeo,
ocupa unas cuatro o cinco tablas básicas, unos dos o tres procesos y cada proceso dos o tres relaciones
mínimo, entonces el sistema se resuelve con 20 o mas tablas, las quejas sobre este modelo a Codd (creador
del modelo relacional de bases de datos).

El caso de relaciones 1:1 se resuelve con solo tres tablas, solo agregar también en la tabla de relación la
clave de muchos.

El caso de relaciones 1:Cte también se resuelve con tres tablas, solo agregar en la tabla de relaciones tantas
claves de la tabla de constantes como constantes existan en la relación, por ejemplo si la relación es boleta
de calificaciones y solo contiene tres materias, entonces se ocupan la tabla de alumnos, la de materias y la
tabla de boleta, esta ultima tendría clave alumno, clave materia1, clave materia2, clave materia3.

El caso de relaciones M:M solo se resuelve localizando o identificando o de plano construyendo, la dos
relaciones 1:M originales de donde salió este documento, por ejemplo en el informe al gobierno de todos
los distribuidores de equipo de computo y todos los equipos que compraron en el mes, es probable que este
informe se construya con las tablas de relaciones de facturas y notas de ventas.

TAREAS PROGRAMACION C++BUILDER

1.- CONSTRUIR EL MODELO DE LAS CUATRO TABLAS PARA LA RELACION EL CLIENTE


COMPRA A CREDITO PARTES O REFACCIONES EN LA “REFACCIONARÍA”.

2.- CONSTRUIR EL MODELO DEL CLIENTE APARTA JOYAS EN UNA “JOYERIA”.

3.- CONSTRUIR EL MODELO COMPLETO DE CLIENTES Y PELICULAS CON LAS RELACIONES,


RENTA PELICULAS, DEVUELVE PELICULAS, DAÑA PELICULAS, COMPRA PELICULAS.

4.- CONSIDERANDO EL PROBLEMA DE LOTES DE AUTOS, AUTOS, CLIENTES, TALLERES


CONSTRUIR MODELO PARA LOS PROCESOS DE COMPRA DE AUTOS, Y RESTAURACION DE
AUTOS( ES CUANDO EL LOTE COMPRA LOS AUTOS Y LES DA UNA ARREGLADA PARA SU
VENTA).

17.- C++BUILDER MODELO RELACIONAL Y DATABASE DESKTOP

El modelo relacional completo, antes de traspasarlo al DataBase DESKTOP, debe incluir todo lo siguiente:

tabla de uno

* Clave de Uno S, P* (S = ISuno ) * otros

tabla de muchos
* Clave de Muchos S, P* (S = ISmuchos) * otros

tabla de relación

* Clave Relación S, P* (S = ISrelacion) * Clave de Uno S, IR (S = ISReluno)

* otros

tabla de detalle

* Clave Relación C*,S,IR (S = Isdetrel IR = IRDetrel) * Clave Muchos C*,S,IR (S = ISDetmuchos IR =


IRDetmuchos) * otros

notas:

P* , significa que dicho campo es una clave o llave primaria, en DataBase Desktop, recordar que solo se
ocupa un click en la columna llamada KEY para que aparezca la *

C* , se conocen como claves o llaves compuestas, para crear una clave o llave compuesta solo marcar con
*, los dos campos involucrados

S, es un llamado índice secundario ( secondary índex), se usa para dar un orden o clasificación alterno a la
tabla indicada, por ejemplo en la tabla clientes, se puede marcar ciudad como índice secundario, para que
de ser necesario en lugar de desplegarse ordenada por clave o numero de cliente, se despliegue ordenadas
por ciudades, o por nombres, o por teléfonos, etc.

El (S = ISuno ) es el nombre que va a recibir el índice secundario, por ejemplo si la tabla es clientes el
índice secundario se llamara Isclientes, otra vez en el caso (S = ISmuchos ) si la tabla es productos al índice
secundario se le pondrá el nombre de Isproductos.

Párrafos mas adelante, se muestra el procedimiento para crearlos dentro del Database Desktop.

IR, se conocen como integridad referencial ( integrity referential), se utiliza para garantizar que nuevos
elementos en una tabla ya existan en la otra tabla, por ejemplo de IR entre la tabla de relación y la tabla de
uno, en el caso de Facturas y Clientes, garantiza que no se pueda capturar la clave de un cliente
cualesquiera, si este cliente no existe o esta dado de alta en la tabla de clientes.

Otra vez la IR entre la tabla de detalle y la tabla de muchos, en el caso de DETALLEFACTURA y


PRODUCTOS, garantiza que no se pueda capturar la clave de un producto, en la tabla de detalle, si este
producto no existe, en la tabla de relación y así sucesivamente.

(IR = IRReluno) es el nombre que se le va a asignar a la relación, para el ejemplo que se esta siguiendo se
llamaría IRFacturaCliente, y así sucesivamente.

El procedimiento para crear un índice secundario (S) dentro del DataBase Desktop es:

A)Tools, Utilities, Restructure y seleccionar tabla a indexar.

B)Click en ComboBox de la derecha, hasta que aparezca y seleccionar la opción Secondary Indexes.

C)Click abajo en botón Define.

D)Aparece ahora el siguiente editor de índices:


E)Solo seleccionar el campo o atributo a indexar y luego click en flecha negra ADD para que pase a la
segunda ventana, luego click en OK.

F)DD pregunta ahora por el nombre del índice mediante la siguiente ventana:

G)Escribir el nombre ya propuesto por ejemplo ISNomProducto y click en OK.

H)DD regresa ahora ala tabla principal, click en botón SAVE para grabarla con los nuevos cambios.

I) Cerrar la tabla, con click en X arriba.

J) Repetir los pasos desde inciso A, para construir los índices de las otras tablas.

El Procedimiento para crear las integridades referenciales es:

1.- Tools, Utilities, Restructure y seleccionar tabla a construirle la integridad referencial.

2.- Click en ComboBox de la derecha, hasta que aparezca y seleccionar la opción Referential Integrity.

3.- Click abajo en botón Define.

4.- Aparece ahora el siguiente editor:


5.- En la primera ventana están todos los campos de la tabla a enlazar (factura) solo doble click en el campo
de enlace (Clave Cliente) y observar que se pase a la ventana chica.

6.- En la segunda ventana están todas las tablas del directorio, solo doble click en la tabla a enlazar
(clientes), con eso el campo de enlace (Clave Cliente) de dicha tabla también pasa a la ventanilla izquierda,
como se observa en la gráfica anterior.

7.- En resumen la integridad referencial permite el enlace entre las dos tablas, su efecto practico, como ya
se indicó es que tablas unidas de esta manera no permiten altas o captura de un renglón, si dicho renglón de
información, no existe en la tabla enlazada.

8.- Para terminar este proceso solo click en el botón OK.

9.- DD pregunta ahora por el nombre que tendrá, esta integridad referencial o enlace usando la siguiente
ventana:

10.-Escribir el nombre ya propuesto por ejemplo IRFacturaCliente, en este ejemplo, se esta simbolizando
un enlace de la tabla de factura hacia la tabla de cliente, usando el campo común en ambas de Clave
Cliente.

11.-DD regresa ahora a la tabla principal, click en botón SAVE para grabarla con los nuevos cambios.

12.-Cerrar la tabla, con click en X arriba.

13.-Repetir los pasos desde inciso A, para construir los enlaces o integridad referencial con las otras tablas.

Como una nota u observación importante, recordar que es muy simple el proceso de que enlazar o de a que
construirle las integridades referenciales, en este ejemplo es de Factura hacia Cliente con Clave Cliente,
luego es de DETALLEFACTURA a Factura con Clave Factura y al final es de DETALLEFACTURA hacia
Producto con Clave Producto.

Otra vez, siempre es lo mismo, de Receta hacia Paciente con Clave Paciente, es de DetalleReceta hacia
Receta con Clave Receta y al final de DetalleReceta hacia Medicina con Clave Medicina.

Recordar que solo son tres campos claves y solo están repetidos dos veces, y dos de ellos siempre están en
Detalle, por eso solo son tres enlaces o IR y dos de ellos se encuentran en Detalle.

El procedimiento general para crear las cuatro tablas, en DataBase Desktop y en el siguiente y estricto
orden es:

1.- Crear un directorio o folder especifico para almacenar las cuatro tablas, con explorer o my computer de
Windows.

2.- Crear las cuatro tablas, solo marcando las llaves primarias y llaves compuestas, ( estrellitas).

3.- Ir cargando las cuatro tablas para aplicarles el procedimiento que se dio para índices secundarios.

4.- Hasta al final ir cargando las dos tablas que solo se ocupan para crear los enlaces o Integridad
Referencial ( observar las notas, solo se crean enlaces con la tabla de relación y dos veces con la tabla de
detalle).

5.- Abrir e ir cargando las tablas también en orden (1,M,R,D) para capturarles unos cuantos renglones de
pruebas.

TAREAS PROGRAMACION C++BUILDER

1.- CONSTRUIR Y CARGAR EN DATABASE DESKTOP LA RELACION RECETA(SON CUATRO


TABLAS).

2.- CONSTRUIR Y CARGAR EN DATABASE DESKTOP LA RELACION ORDEN DE COMPRA.

3.- CONSTRUIR EN DATABASE DESKTOP LA RELACION DE LA NOTA DE RENTA DE


PELICULA.

4.- CONSTRUIR EN DATABASE DESKTOP LA RELACION RECIBO DE RENTA( AQUI SOLO SON
TRES TABLAS Y EXISTE TAMBIEN UNA IR O ENLACE DE RECIBO A DEPARTAMENTOS).

18.- APLICACIONES CON TABLA DE RELACION C++BUILDER

Es tiempo ahora de construir la aplicación final con las tablas construidas con el modelo relacional de bases
de datos.

Recordar primero que en general, el usuario solo tendrá acceso y podrá manipular tres de ellas, la tabla de
uno, la tabla de muchos y la tabla de relación, las dos primeras de ellas son construidas usando aplicaciones
normales por renglón y por tabla, como se realizo en los primeros temas del capitulo, es recomendación y
sugerencia que la tabla de uno se construya usando el formato de renglón y la tabla de muchos se construya
usando el formato de tabla(DBGrid).
En cuanto a la aplicación a construir con la tabla de relación, también dentro de C++Builder se debe
construir los enlaces con las tablas ya descritas, con los siguientes considerandos ;

T1-->TR ; TM-->TDET ; TDET-->TREL

Ej. 1) CTE-->FACTURA ; PROD-->DETFAC ; DETFACT-->FACT

ej. 2) PAC-->RECETA ; MED-->DETREC ; DETREC-->RECETA

OBSERVAR Y TOMAR EN CUENTA COMO Y DE DONDE HACIA DONDE SE GENERAN LOS


TRES ENLACES DENTRO de C++BUILDER.

Tomar nota de las diferencias entre los enlaces en DD y en C++Builder.

Estos enlaces se hacen usando dos propiedades extras en los componentes Table dentro del C++Builder,
propiedades que se explican y demuestran mas adelante.

Recordar ademas, que es en la primera tabla de cada uno de estos tres tipos de enlaces. donde se establece
la relación de enlace o donde se manipula la propiedad correspondiente.

Para construir una aplicación para la tabla de relación:

1.- Aunque es solo la tabla de relacion, la que está aparentemente a la vista del usuario, la forma debera
contener los cuatro componentes Table, puesto que esta relación, descansa y ocupa las cuatro tablas.

2.- Estos cuatro componentes Table se colocaran y usaran en el siquiente orden para el ejercicio de
aplicación:

Table1 →Tabla de uno (ej. clientes)

Table2 →Tabla de muchos (ej. productos)

Table3 → Tabla de relación (ej. facturas)

Table4 → Tabla de detalle (ej. detallefactura)

3) Igualmente se ocupan cuatro componentes DataSource en el mismo orden, es decir DataSource1 apunta
a Table1, DS2 a T2, y así sucesivamente.

4.- La Forma que contiene la tabla de relación se organiza usando tres componentes Panel para su mejor
distribución, estos componentes Panel, se construyen y contienen:

DBNav1(DS3) Nva Fact

DBEdit(DS3)

Panel de uno

Cve Cte Nom Cte Dir Cte etc.Cte NVO Cte

DBEdit DBEdit DBEdit DBEdit Buttonl


(DS3) (DS1) (DS1) (DS1)

Panel de detalle

NUM Prod. Nom Prod. etc. Prod.

DBEdit DBEdit DBEdit

(DS4) (DS2) (DS2)

DDBNav2(DS4)

Notas:

1.- Es muy importante que se respete el tipo de componente que va dentro de cada panel y mas importante
aún que dichos componentes apunten a el DataSource indicado entre paréntesis.

2.- Igualmente es muy importante, el siguiente código que se deberá poner en el evento OnExit del ultimo
DBEdit que se tenga en pantalla y que se cargue o capture por parte del usuario de la tabla de relación y su
DataSource3 correspondiente, generalmente es la clave relación o fecha, en particular seria el ultimo
componente que se tenga apuntado a DS3, es en este componente, donde se debe usar:

OnExitDBEdit#() { Table3→Refresh();}

Esta instrucción actualiza los datos o renglón de la tabla de relación, antes que la tabla de detalle, haga una
búsqueda, dentro de la tabla de relación.

3.- El código de los tres botones de ordenes, es el siguiente:

OnClickButton1(){

//ocultar la pantalla de factura y desplegar o llamar la pantalla de


clientes

OnClickButton2(){

Table4->Insert();

// para insertar un nuevo renglón en tabla de detalle

OnClickButton3(){

// primero operaciones pertinentes si es que existen y

// al final cerrar con la instrucción

Table4->Refresh();
// para cargar en disco el ultimo renglón de la tabla

// de detalle

}
\

4.- Como se observa los métodos Insert() y Refresh(), usados se derivan y se pueden sustituir con
DDBnavegadores y sus botones visibles correspondientes, pero se debe buscar que el usuario los presione
en el momento indicado.

5.- Este esquema se puede aplicar a cualquier tabla relacional(recetas, ordenes de compra, solicitudes de
servicios, etc.) solo realizar los ajustes correspondientes.

PROCEDIMIENTO PARA CONSTRUCCION DE TABLA RELACIONAL

1.- CARGAR C++Builder.

2.- PONER LOS CUATRO COMPONENTES TABLE EN LA FORMA, Y CARGARLES SUS TRES
PROPIEDADES BASICAS(DATABASENAME, TableName, Active),RESPETANDO EL ORDEN
SUGERIDO (Table1→Tabla de uno, Table2→Tabla de muchos, Table3→Tabla de relación, Table4→Tabla
de detalle).

3.- PONER LOS CUATRO COMPONENTES DataSource QUE SE OCUPAN Y APUNTARLOS A SU


TABLA CORRESPONDIENTE EN ORDEN, ES DECIR DS1→TABLE1, DS2→Table2, DS3→Table3,
DS4→Table4, USANDO LA PROPIEDAD DATASET DEL COMPONENTE DataSource.

4.- ARMAR Y CARGAR LOS TRES ENLACES ENTRE TABLAS YA SUGERIDOS, ESTO ES T1→TR,
2) TM→ TDET, 3) TDET→TREL, USANDO LAS PROPIEDADES MASTERSOURCE Y
MASTERFIELD EN LA PRIMERA DE LAS DOS TABLAS EN CADA RELACION, COMO SE
DEMUESTRA CON EL SIGUIENTE EJEMPLO DE LA PRIMERA RELACION ES DECIR, T1→TR.

1. SELECCIONAR LA TABLA DE CLIENTES ( LA DE UNO)

2. CLICK A UN LADO DE LA PROPIEDAD MASTERSOURCE Y SELECCIONAR


DATASOURCE3( QUE ES LA DE RELACION O FACTURA) CLICK A UN LADO EN LA
PROPIEDAD MASTERFIELD (DONDE ESTAN LOS TRES PUNTILLOS) Y SALE EL SIGUIENTE
EDITOR DE CAMPOS DE ENLACE:
3.

4. OBSERVAR QUE EN LA PRIMERA VENTANA ESTA EL CAMPO DE ENLACE DE LA TABLA DE


UNO, Y EN LA SEGUNDA ESTAN TODOS LOS CAMPOS POSIBLES A ENLAZAR DE LA TABLA
DE RELACION( FACTURA)

5. COMO SE VAN A ENLAZAR AMBAS USANDO EL MISMO CAMPO (CLAVE CLIENTE),


SELECCIONAR (CLICK) ESTE MISMO CAMPO (CLAVE CLIENTE) EN LAS DOS VENTANAS Y
LUEGO CLICK EN BOTON ADD, EL ENLACE DEBE APARECER EN LA VENTANA DE ABAJO,
COMO SE MUESTRA EN LA SIGUIENTE GRAFICA:

6.

7. LUEGO CLICK EN BOTON OK PARA FINALIZAR EL PROCESO

5.- EL PROCEDIMIENTO ANTERIOR 4.1) A 4.6) SE DEBERA REPETIR PARA LOS DOS CASOS
RESTANTES(TM→TDET, TDET→TREL).

6.- PONER LOS TRES COMPONENTES PANEL EN LA FORMA Y DENTRO DE CADA PANEL,
PONER Y APUNTAR LOS COMPONENTES YA DESCRITOS EN EL MODELO ANTERIOR.

7.- RECORDAR PONER LOS TRES COMPONENTES BUTTON Y CARGARLOS CON EL CODIGO
QUE TAMBIEN YA SE INDICO.
EJEMPLO:

1. PANTALLA DE DISEÑO

1. CODIGO

//---------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)

{ // En esta parte se oculta la ventana de factura

// y se llama la ventana de cliente

//--------------------------------------------------

void __fastcall TForm1::DBEdit3Exit(TObject *Sender)

{ Table3->Refresh();

//---------------------------------------------------

void __fastcall TForm1::Button2Click(TObject *Sender)

Table4->Insert();

//---------------------------------------------------

void __fastcall TForm1::Button3Click(TObject *Sender)

{
// operaciones y terminar con:

Table4->Refresh();

//---------------------------------------------------

PANTALLA DE EJECUCION

TAREAS PROGRAMACION C++BUILDER

1.- CONSTRUIR UN MENU QUE CONTENGA Y LLAME LAS TABLAS CLIENTES, PELICULAS Y
RECIBO DE RENTA DE UNA VIDEOTIENDA

2.- CONSTRUIR UN MENU QUE CONTENGA Y LLAME LAS TABLAS PACIENTES, MEDICINAS Y
RECETAS DE UNA FARMACIA

3.- CONSTRUIR UN MENU QUE CONTENGA Y LLAME LAS TABLAS PROVEEDOR,


PRODUCTOS Y ORDEN DE COMPRA DE UNA REFACCIONARIA
V UNIDAD C++BUILDER COMPONENTES

1.- INTRODUCCION PROGRAMACION ORIENTADA OBJETOS C++BUILDER

Los componentes son los elementos u objetos mas básicos de la programación visual moderna, con ellos se
construyen las diversas aplicaciones que se ejecutan bajo un ambiente Windows.

En esta

UNIDAD, se pretende profundizar en el estudio de estos elementos básicos de construcción de programas,


en esta

UNIDAD se pretende:

* Comprender los conceptos de componentes , clases y objetos, tanto visuales como no visuales.

* Instalación y mantenimiento de nuevos componentes visuales.

* Creación e instalación de componentes visuales.

* Creación e instalación de componentes no visuales.

2.- C++BUILDER COMPONENTES, CLASES Y OBJETOS

Como ya se menciono anteriormente, componentes son las piezas basicas, con las que se arma, construye y
diseña, una aplicacion cualesquiera.

Como se explico al principio del libro, la programacion moderna o actual, es de tipo visual, pero su fondo o
esencia es la llamada programacion orientada a objetos.

En orden o principio, recordar que todo en la vida o el universo, no es mas que un objeto de cualquier clase
o naturaleza ya sea material o inmaterial, todos los objetos tienen sentido, forma, tamaño y un gran
conjunto de caracteristicas que permiten diferenciarlos, pero tambien clasificarlos y agruparlos, entre si.

Desde este punto de vista un programa en ejecucion o un sistema de información, se puede considerar
como un conjunto de objetos que como en la vida real interactuan entre si, creandose entre ellos ya se una
serie de relaciones e interacciones, programacion de punta o avanzada ya toma en cuenta, la naturaleza
dinamica de los propios objetos(esto es llamada concurrencia, es decir la capacidad de existir en forma
independiente y a la vez que el resto de los objetos del sistema, esto se estudia mas a fondo en el siguiente
capitulo de este libro).

Sin embargo, su manifestacion programatica de los objetos, en los lenguajes modernos de programacion,
son las llamadas clases, es decir una clase es la representacion simbolica y computacional de toda una serie
de objetos con caracteristicas comunes entre si, por eso existe la clase gatos, empleados, arboles, listas,
reportes, vectores, etc, es decir pueden existir tantas clases como objetos existen en el universo y cada clase
contiene todos los objetos con caraceristicas comunes entre si, o de la misma categoria o clasificaacion, un
ejemplo de una clase en un lenguaje de programacion es:

Class gatos{
public:

int edadgato;

AnsiString nombregato;

maullar();

capturardatosgato();

}gatonegro, garfield, gatotijuanense;

gatos::maullar(){ cin»“miauuuu”;}

gatos::capturardatos(){ cin»“dame edad”; cout«edad; }

Como se observa, comprender, localizar y programar todas las carecteristicas o atributos de una sola clase,
es una tarea bastante grande, mientras que los comportamientos ( metodos en oop) es todavia mas laborioso
y complejo y si agregamos la interaccion natural existente entre objetos ( los llamados eventos en oop),
garantiza que existiran la necesidad de ingenieros de software por mucho tiempo en el futuro.

Observar del ejemplo, que del conjunto de objetos que representa la clase, se derivan instancias(gatonegro,
garfield) individuales de esa clase, desgraciadamente a esas instancias individuales tambien se les conoce
como objetos y esto manifiesta o conduce a la confusion entre las dos interpretaciones de el concepto
objeto, en su sentido generico o universal y su sentido particular o programatico, como una instancia
derivada de una clase, problema viejo en los ambientes de programacion.

Por ultimo un componente, se puede entender como la manifestacion visible de un objeto en un ambiente
de desarrollo visual, es decir un componente no son mas que algunos aspectos o propiedades del objeto,
que permiten la conceptualizacion y manipulacion de los objetos en los programas de aplicaciones visuales.

En resumen objeto→clase→componente, es la escencia o trilogia clasica en la programacion visual


moderna.

3.- C++BUILDER INSTALACION Y MANTENIMIENTO DE COMPONENTES VISUALES

En este tema, se estudia la manera de manipular, eliminar, etc, nuevos componentes y folders o paginas de
nuevos componentes, usando el menu de componentes que proporciona C++Builder.

Para efectuar procesos simples con paginas y componentes ya contenidos en C++builder, usar en la barra
de menu, la opcion de componentes, donde su opcion mas elemental, es “configure palette”, que muestra la
siquiente ventana:
La primera ventananita, permite manipular las paginas de componentes y la segunda ventanita permite
manipular los componentes, las operaciones mas elementales y a la vista son, reaacomodar el orden de
paginas o componentes, solo click en ellos y luego, usar las flechas, eliminar y renombrar, para mover un
componenente de una pagina a otra pagina, solo arrastrarlo a la nueva pagina y borrarlo de la antigua.

Solo recordar que al final que para que todas las operaciones indicadas se lleven a cabo, se debera
reconstruir la libreria de componentes con la orden Component, Rebuild Library.

En principio se debera entender claramente que en la actualidad, miles de Ingenieros de Software, se


encuentran desarrollando cantidades increibles de componentes y galerias o paginas de componentes,
especializados en muchas y diversas tareas de programacion, incluyendo empresas o compañias de diverso
ambito y espcialidad que desarrollan software, muchos de estos componentes e incluso paginas completas
de ellas, estan a la disposicion de todos los programadores, en el INTERNET, una visita rapida a la pagina
de www.borland.com, y concretamente de C++Builder muestra los siguientes lugares y categorias:

Trademarks & Copyright © 1997 Borland International, Inc.

En muchos de ellos, ademas existen mas bibliotecas o paginas de componentes, asi como nuevas ligas o
enlaces a otros lugares tambien muy interesantes.

Tambien aqui en y de Borland, se encuentra una biblioteca de componentes, especializados en internet, que
no fueron agregados a la version normal de C++Builder actualmente en el mercado.

Otra manera de localizar componentes, es usar busquedas de “C++Builder”, “C++Builder Component” o


“Delphi Component” en los lugares de busquedas habituales, Yahoo, Altavista, Excite, etc.

Ya localizados y en disco duro, los componentes o galerias, bibliotecas o paginas de componentes y


bajados al disco duro de nuestra maquina, se procede a dar el procedimiento, para incorporlos a una de las
paginas en C++Builder:

4 INSTALACION PRACTICA DE COMPONENTES C++BUILDER


Ejemplo, un componente llamado my_panel que se encuentra en

www.nh.ultranet.com/~bsturk , (el componente se llama my_panel.zip, si no se encuentra en el lugar


indicado, rastrearlo por los medios ya dichos o usar un sitio de busqueda de archivos como
http://ftpsearch.ntnu.no/ftpsearch) este componente permite poner un panel con un fondo tipo wallpaper en
la ventana de la aplicacion:

PROCEDIMIENTO

1.-Bajarlo de Internet y ponerlo en un directorio temporal en disco duro.

2.-Descomprimirlo, observar que deberá haber cuando menos un archivo de tipo *.pas, *.cpp, *.obj

3.-Copiar los archivos fuentes (.pas, .cpp, .obj, .res. etc.) a el folder BIN de C++Builder, si C++Builder se
instalo con las opciones de default, entonces el path es c:\program files\borland\cbuilder\bin

4.- Cargar o arrancar el C++Builder.

5.- Dentro de menú principal, primero click en component.

6.- Click en Install (sale ventana Install component).

7.- Click en botón Add (sale una ventana llamada Add module).

8.- Click en botón browse (sale una ventana llamada Add component).

9.- Abajo cambiar el tipo de archivo ( Files of Type) de a .CPP o .PAS dependiendo del código fuente
obtenido con el componente.

10.- Ir subiendo arriba desde el directorio de projects hasta llegar al directorio BIN.

11.- Aquí en este directorio Bin, debe existir y aparecer ahora un archivo llamado my_panel.cpp o .pas

12.- Seleccionar este ultimo archivo y click en botón open.

13.- C++Builder regresa ahora a la ventana Install Component,

14.- Click en botón OK.

15.- Empieza ahora un proceso de compilación de librerías, esperar hasta que Done=Make, click en OK,
sigue reconstruyendo.

16.- Revisar que ahora en la barra de componentes, se encuentre una nueva pestaña (Samples),con sus
nuevo componentes.

17.- Recordar que con opción Configure Palete y Rebuild Library, se pueden reorganizar paginas y
componentes.

TAREAS PROGRAMACION C++BUILDER

1.- Buscar e instalar los componentes de Internet de Borland

2.- Buscar e Instalar un componente llamado wallpaper


3.- Buscar e instalar una pagina completa de componentes matemáticos.

5 CREACION E INSTALACION DE COMPONENTES VISUALES C++BUILDER

La herramienta mas poderosa de la programacion moderna (objeto-visual) es la capacidad increible y la


manera tan sencilla de poder crear y manipular nuestros propios componentes, que seguramente seran,
mucho mas faciles de usar y de entender, que los que trae de default el C++Builder o los obtenidos de
Internet.

Supongase que se quiere un componente muy especializado o mas estetico, por ejemplo TRadio o
TGrabadora (observar que componentes personales empiezan con la letra T, esto es una convencion), solo
se tiene que :

* primero derivarlo de algún componente del C++Builder que se le parezca o sea apropiado, por ejemplo el
media player.

* luego modificarle, o agregarle algunas o nuevas propiedades, esto se hace mediante código ya conocido,

* después agregarle nuevos eventos, o programarle, algún default a los ya heredados.

* al final, instalarlo en alguna de las paginas de componentes.

Notas.

1.- Todo nuevo componente visual, se debera derivar de algun componente ya creado.

2.- Todo componente hereda todas las propiedades (caracteristicas), metodos(procedimientos o funciones
propios) y eventos (respuestas programadas del componente a una interacción con otro objeto o
componente) del componente padre.

3.- Borland provee de una tabla, que muestra todos los componentes de caracter visual y no visual, dicha
tabla es necesario conocerla, para poder localizar el componente apropiado, para derivar el componente que
se esta creando.

Diagrama Simplificado de la jerarquía de componentes


* tomado de Component Writer's Guide

* El diagrama jerárquico completo, es muy grande y muestra mas de 100 clases y objetos, es necesario
conseguirlo y tenerlo a la mano.

El ejemplo será muy simple, se derivara un componente llamado miboton a partir del componente visual
TButton, solo se modificaran algunas propiedades.

1.- Cargar el C++Builder

2.- File, Close All

3.- Component, new y aparece la siguiente ventana:

Class Name = miboton.

Ancestor Type= usar flechita para buscar y seleccionar TButton.

Palette Page = usar flechita para buscar y seleccionar Standar.

Click en Ok

4.- Aparece ahora el siguiente código dentro de unit1.cpp:

observar las cuatro partes o áreas bien diferenciadas entre si y la notas (encerradas entre {{}} personales
puestas ahí para su aclaración.

//----------------------------------------------------------------

{{ primera área, solo código para incluir la librería de componentes


visuales(vcl.h) y una librería de interfase(mas adelante se explica que
significa(ver Pascal)) llamada unit.h }}

#include <vcl\vcl.h>

//----------------------------------------------------------------

{{ segunda parte, código de C++Builder para verificar que el componente


creado miboton, es derivado de un componente valido y visual existente,
en este caso de TButton }}

static inline miboton *ValidCtrCheck()

{
return new miboton(NULL);

//----------------------------------------------------------------

{{ tercera área y la mas importante, es el constructor (primer


procedimiento o función que se ejecuta cuando se usa este componente,
es
decir se activa automáticamente en el momento de ponerlo en Form1), es
decir es en esta parte donde se pueden agregar las modificaciones a las
propiedades que se pretenden hacer, posteriormente desde aquí también
se
puede enlazar o llamar o invocar a otros métodos propios }}

__fastcall miboton::miboton(TComponent* Owner): TButton(Owner)

//----------------------------------------------------------------

{{ cuarta área, código de C++Builder para registrar nuestro componente


en
la pagina "Standar" }}

namespace Unit1

{void __fastcall Register()

TComponentClass classes[1] = {__classid(miboton)};

RegisterComponents("Standard", classes, 0);

//----------------------------------------------------------------

Como se observa, solo se deberá usar la tercera área, solo escribir el


siguiente código dentro de las llaves que están abajo del constructor.

//----------------------------------------------------------------

__fastcall miboton::miboton(TComponent* Owner): TButton(Owner)

Height = Height * 2;

Width = Width * 3;

Font->Color=clGreen;
Caption = "Hola, Bienvenido a C++Builder";

Se ha insistido bastante, que es necesario conocer y estudiar y aprender todas las propiedades, métodos y
eventos de todos los componentes visuales.

5.- File, Save As, escribir miboton y luego click en Save.

Con este paso el nuevo componente miboton, queda en el directorio Bin(en dos archivos, miboton.cpp y
miboton.h) de C++Builder, listo para instalarlo en la paleta de componentes, los siguientes pasos son
similares a la instalación de componentes bajados de Internet.

6.- File, Close All

7.- Componente, Install

8.- Add

9.- Browse y click en miboton

10.- Open, y ya debe aparecer abajo en la ventana izquierda de componentes instalados.

12.- Click en OK, y empieza a compilar la librería de componentes, y esperar hasta que Done=Make y
entonces click en OK.

Si no hay errores, el componente miboton ya se encuentra en la pagina standard y listo para que lo use
cualquier aplicación, si hay errores, usar el siguiente procedimiento de corrección y modificación de errores
y componentes.

6 CORRECCION Y MODIFICACION DE COMPONENTES VISUALES C++BUILDER

Procedimiento:

1.- File, Close All

2.- File, Open y subir hasta el directorio Bin de C++Builder, click en miboton.cpp, para cargarlo.

3.- Corregirlo o modificarlo.

4.- File, Save

5.- File, Close All

6.- Component, Rebuild Librery

7.- Done=MaKe, entonces click OK


7 ELIMINACION DE COMPONENTES C++BUILDER

Recordar que con la opción de Delete en configure Palette, solo se eliminan lógicamente los componentes
visuales instalados.

Este procedimiento elimina completamente los componentes o paginas, para recuperar paginas se deberá
reinstalar C++Builder, para recuperar componentes propios se deberán crearlos e instalarlos de nueva
cuenta.

Procedimiento:

1.- File, Close All

2.- Componente, Install

3.- Seleccionar y click en la ventana derecha, la pagina o componente a remover

4.- Click en botón Remove

5.- Click en OK y empieza la compilación hasta que Done=Make y OK

6.- Cerrar Builder y con el explorer o Mycomputer de Windows ir al directorio Bin de C++Builder, buscar
y eliminar los dos archivos del componente, en este ejemplo miboton.cpp y miboton.h

8.- AGREGANDO UN RECURSO BITMAP AL COMPONENTE C++BUILDER

A cada componente se le puede asociar tres tipos de recursos graficos:

a) Un bitmap.- Es un icono grafico creado para sustituir, el icono de default en la barra de componentes.

b) Un icon.- Grafico pequeño que aparece en la parte superior de un componente.(observar Form1).

c) Un cursor.- Algunos componentes tiene la propiedad de manejar un cursor diferente al default(la


flechita), es posible crear cursores especiales y asignarlos al componente( si el componente tiene está
propiedad), en el momento que el componente recibe el focus del programa, es decir en el momento que
entra el cursor de default, se activara el nuevo cursor.

Procedimiento:

Se supone que ya esta creado e instalado el componente original, en este ejemplo miboton.cpp y miboton.h

1.- File, Close All

2.- Component, Install, seleccionar miboton.cpp, Remove, Ok, esperar hasta Done=Make, Ok

* Este paso remueve el componente con su viejo bitmap, de la paleta de cmponentes.


3.- Tools, Image Editor, que es una ventana muy parecida al paint.

4.- Dentro del editor de imagenes:

4.1.- File, new, Resource File, y aparece una nueva ventanita, que tiene como primer renglon, -Contents

4.2- Cursor sobre Contents y click derecho para un minimenu y crearle un bitmap, un icon y un cursor

4.3.- Cursor sobre bitmap y click derecho para, primerlo editarlo y segundo renombrarlo con miboton
( atención es necesario que el bitmap se llame igual que el componente)

4.4.- Cursor sobre icon y click derecho para, primero editarlo y luego renomrarlo a miboton

4.5.- Cursor sobre cursor y click derecho para, primerlo editarlo y luego renombrarlo a miboton tambien.

*Esta ventanita debe verse como lo siguiente:

4.6.- File, Save As, conmo miboton.res

4.7.- File, Exit

5.- En C++Builder:

Component, Install, Add, Browse, miboton.cpp, open, ok,

esperar a Done=Make, Ok y ya debe aparecer el componente en la paleta con su nuevo bitmap.

9 CREACION DE COMPONENTES NO VISUALES C++BUILDER

En este temas se analiza, la creación y construcción de componentes no visuales.


La necesidad de este tipo de componentes se desprende del hecho de que existen muchas tareas de
programación de carácter repetitivo a lo largo de la construcción de muchas aplicaciones, por ejemplo se
manejan en 10 programas, o tareas o aplicaciones distintas el mismo conjunto de tres fórmulas matemáticas
o financieras, etc.

En caso como estos, es mas conveniente crear un componente especializado en solución de dichas fórmulas
y estarlo reutilizando en las diversas aplicaciones que lo ocupen.

Para realizar esto primero diseñamos la clase correspondiente, tal como el ejemplo de clases en paginas
anteriores:

// declaración de la clase, sus variables y sus métodos

Class fórmulas

int areatriangulo( int base, int altura);

float pesosdolares (int pesos, float tipocambio);

double promedio(int calif1, int calif2);

// implementacion de los métodos de la clase

int formulas::areatriangulo(int base, int altura)

{ return base* altura /2 ;}

float formulas::pesosdolares(int pesos, float tipocambio)

{ return pesos/tipocambio; }

double formulas::promedio(int calif1, int calif2)

{return (calif1+calif2)/2.0 ;}

La pasamos ahora al C++Builder, el procedimiento comentado es:

Procedimiento:

1.- File, Close All

2.- Componente New,

Clase Name = fórmulas

Ancestor = TComponent

Page = Standard
* Observar que todo clase no visual, se deriva de TComponent, con esto se asegura un mínimo visual de
propiedades, incluyendo un icono de default, para la barra de componentes y un par de eventos, los
métodos de la clase es lo que se va a construir y programar.

3.- File Save As, fórmulas, Save

4.- A la vista queda el editor con formulas.cpp , en la parte de arriba donde dice #include <formulas.h>,
poner cursor encima y click derecho para el popupmenu, seleccionar la primera opción, de open
source/header file, y con esto ya se tendrán a la vista los dos archivos que se ocupan para construir la clase,
ellos son formulas.cpp y formulas.h

En estos dos archivos se construye la clase, la parte declarativa de la clase queda en el archivo formulas.h y
la parte de implementacion o los métodos quedan en el archivo formulas.cpp, como observación en
PASCAL solo se ocupa el archivo llamado unit.pas y ahí quedan juntos pero en su área apropiada las dos
partes de una clase, su declaración y su implementación.

Observar el código ya generado por C++Builder de formulas.h;

//----------------------------------------------------------

#ifndef formulasH

#define formulasH

//----------------------------------------------------------

#include <vcl\SysUtils.hpp>

#include <vcl\Controls.hpp>

#include <vcl\Classes.hpp>

#include <vcl\Forms.hpp>

//----------------------------------------------------------

class fórmulas : public TComponent

prívate:

protected:

public:

__fastcall fórmulas(TComponent* Owner);

__published:

};

//----------------------------------------------------------

#endif
1.- Recordar que es en este archivo el .h donde se hace la declaración de la clase.

2.- Observar que C++Builder ya definió la clase y la hizo un descendiente publico de TComponent, esto de
publico es para permitir que todos los demás componentes puedan accesar las propiedades y métodos de la
clase Fórmulas.

3.- Variables, métodos( procedimientos y funciones) y propiedades que ocupe la clase fórmulas deberán
declararse dentro de la llaves.

4.- Tomar nota que pueden existir cuatro tipos diferente de variables, métodos y propiedades, ellos son:

prívate: solo métodos dentro de la propia clase, tienen

acceso y pueden manipularlos.

protected: No pueden ser accesados por código fuera de la la clase, pero si por métodos de la propia clase.

public: Código externo, otras clases y métodos propios pueden accesarlos.

_published: Solo para propiedades que se quiera que aparezcan en el inspector de objetos.

5.- Para el ejemplo de la clase que se esta manejando, se escriben o mejor dicho declaran los métodos en la
parte publica de la clase, como en el siguiente ejemplo

//----------------------------------------------------------------

#ifndef formulasH

#define formulasH

//----------------------------------------------------------------

#include <vcl\SysUtils.hpp>

#include <vcl\Controls.hpp>

#include <vcl\Classes.hpp>

#include <vcl\Forms.hpp>

//----------------------------------------------------------------

class fórmulas : public TComponent

prívate:

protected:

public:

__fastcall fórmulas(TComponent* Owner);

int areatriangulo( int base, int altura);


float pesosdolares (int pesos, float tipocambio);

double promedio(int calif1, int calif2);

__published:

};

//----------------------------------------------------------------

#endif

6.- La parte de implementacion, se escribe al final del archivo .cpp, como se muestra en el siguiente
ejemplo.

//----------------------------------------------------------------

#include <vcl\vcl.h>

#pragma hdrstop

#include "formulas.h"

//----------------------------------------------------------------

static inline fórmulas *ValidCtrCheck()

return new fórmulas(NULL);

//----------------------------------------------------------------

__fastcall formulas::formulas(TComponent* Owner):TComponent(Owner)

//----------------------------------------------------------------

namespace Fórmulas

void __fastcall Register()

TComponentClass classes[1] = {__classid(fórmulas)};

RegisterComponents("Standard", classes, 0);

}
}

//----------------------------------------------------------------

// implementacion de los métodos de la clase

int formulas::areatriangulo(int base, int altura)

{ return base* altura /2 ;}

float formulas::pesosdolares(int pesos, float tipocambio)

{ return pesos/tipocambio; }

double formulas::promedio(int calif1, int calif2)

{return (calif1+calif2)/2.0 ;}

* Solo se escriben los últimos renglones y en la posición indicada, es decir al final del archivo .cpp

7.- Files, Save All

8.- File, Close All

9.- Component, Install, Add, Browse, formulas.cpp, Open, Ok hasta

que Done=Make, entonces OK

* Observar el nuevo icono de fórmulas en la barra de componentes.

Ejemplo de aplicación:

1. Pantalla de Diseño:

b) Código
//----------------------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)

Edit3->Text=formulas1->promedio(Edit1->Text.ToInt(),

Edit2->Text.ToInt() );

//----------------------------------------------------------------

3. Pantalla de corrida
VI UNIDAD C++BUILDER MULTIPROCESAMIENTO

I INTRODUCCION

Uno de los elementos o aspectos mas usados y aprovechados por todos los usuarios de Windows, es la
propiedad que tiene Windows de realizar múltiples tareas a la vez, es con esta característica por la que se
puede tener abiertas tres o mas ventanas a la vez y cada una de ellas realizando su propia tarea, por ejemplo
se puede estar checando ortografía en una ventana de word, al mismo tiempo buscando un ítem en una
columna muy grande de excel, y a la vez dos o mas ventanas de netscape están bajando software, etc.

Esta capacidad de MULTIPROCESAMIENTO ha sido muy poco aprovechada en los ambientes de


programación, C++Builder hace fácil la tarea de construir programas o aplicaciones que tomen ventaja de
esta capacidad.

Una de las principales razones de este problema, es que los ingenieros de software (programadores) todavía
están muy acostumbrados a razonar los programas o aplicaciones como un conjunto secuencial y finito de
procesos, donde la ejecución de uno de ellos depende enteramente de la ejecución de los anteriores.

Es mejor y necesario considerar un programa o aplicación, como un conjunto de objetos interactuando


entre si, desde este punto de vista, algunos o muchos de los objetos pueden tener su propia existencia y
tiempo de ejecución en forma autónoma e independiente del resto de los demás.

Por ejemplo en una aplicación cualquiera, existirán objetos que efectivamente dependan de la terminación
de la funcionalidad de otro objeto, pero es claro que también existirán partes u objetos con una finalidad
propia e independiente de los demás, estos últimos son candidatos para convertirse en objetos de tipo
multiproceso, es decir objetos que se ejecutan ya no en forma secuencial sino concurrente es decir al mismo
tiempo que los demás.

Ejemplo de ellos, se puede construir un objeto cuya función sea exclusivamente a localizar u dato en una
tabla o base de datos muy grande, en este caso, el programa principal solo tendrá que ir creando instancias
de este objeto y mandarle su parámetro de búsqueda, de esta manera se podrán hacer muchas consultas al
mismo tiempo a la tabla, sin tener que esperar que termine una consulta, para empezar otra.

Una situación similar seria múltiples reportes de impresión, donde cada uno de ellos seria un hilo de un
proceso.

Mas ejemplos:

- Un objeto que este generando continuamente números aleatorios

- Un objeto reloj

- Un objeto que este desplegando dos o mas imágenes muy similares continuamente(30 frames o imágenes
por segundo y se tiene una película)

- Un objeto que este actualizando continuamente una base de datos

- etc. ( este etc. es problema sugerido)

C++Builder, recomienda solo hasta 16 procesos ejecutándose concurrentemente a la vez.


2 OBJETOS CONCURRENTES C++BUILDER

La buena noticia, C++Builder ya trae incorporado un objeto de tipo concurrente llamado Thread object, que
pertenece a la clase TThread ( ver en ayuda sus propiedades y métodos)

Se analiza el objeto Thread en su perspectiva mas simple y se anexan comentarios para su comprensión:

Procedimiento:

1.- File, Close All

2.- File, New, Thread Object class name = proceso1

3.- File, Save As

- abrir folder tarea1

- proceso1

4.- Click derecho en donde dice #include “proceso1.h” y open source/header, para tener a la vista los dos
archivos normales de un componente proceso1.cpp y proceso1.h

* Observar que este objeto, crea una clase llamada proceso1 derivada de la clase Thread.

* Esto también significa que en proceso1.h se almacena la declaración o definición de la nueva clase
proceso1 y que en el archivo proceso1.cpp se almacenara la implementación de los métodos que contenga
la clase proceso1, tal como se analizo en la

UNIDAD de componentes.

5.- El Código de proceso1.h es;

//----------------------------------------------------------

#ifndef proceso1H

#define proceso1H

//----------------------------------------------------------

#include <vcl\Classes.hpp>

//----------------------------------------------------------

class proceso1 : public TThread

prívate:

protected:
void __fastcall Execute();

public:

__fastcall proceso1(bool CreateSuspended);

};

//----------------------------------------------------------

#endif

* Una clase proceso1 descendiente de la clase TThread, no hay sorpresas aquí.

* Un método protegido llamado Execute(), este método es muy importante porque cuando se crea una
instancia de la clase proceso1, todo el código que contiene es ejecutado automáticamente, en otras palabras,
es dentro de este método donde se coloca el código del proceso ( en el archivo de implementación).

* El constructor proceso1, lleva como parámetro una variable booleana es decir con valor true o valor false.

* Además el propio constructor como se observa en el código crea el proceso, pero el hilo lo tiene
suspendido, en cuanto se active o continúe el proceso, este constructor llama o activa el método Execute().

6.- El código de proceso1.cpp es:

//----------------------------------------------------------

#include <vcl\vcl.h>

#pragma hdrstop

#include "proceso1.h"

//----------------------------------------------------------

// Important: Methods and properties of objects in VCL can

// only be used in a method called using Synchronize, for // //


example:

//

// Synchronize(UpdateCaption);

//

// where UpdateCaption could look like:

//

// void __fastcall proceso1::UpdateCaption()

// {

// Form1->Caption = "Updated in a thread";


// }

//----------------------------------------------------------

__fastcall proceso1::proceso1(bool CreateSuspended)

: TThread(CreateSuspended)

//----------------------------------------------------------

void __fastcall proceso1::Execute()

//---- Place thread code here ----

//---------------------------------------------------------

* No hay muchas sorpresas, solo la implementación de los dos métodos que contiene la clase:

1.- El constructor proceso1, con su parámetro

2.- El método Execute() que deberá contener el código del proceso y que se activara cuando se resuma o se
pida que se continúe el proceso.

* Pero si existen unos comentarios o recomendaciones muy importantes que siempre deberán tenerse en
cuenta.

El resumen de la recomendación es que nunca se deberá poner dentro del código del método Execute(),
ninguna instrucción que referencie directamente un componente de VCL, incluyendo Form1 o cualquier
componente visual.

* Si el Método Execute(), necesita procesar cualquier elemento o componente visual, deberá hacer una
llamada a un segundo método que si podrá manipular directamente la forma o el componente necesitado, y
además la llamada de Execute() al segundo método, deberá ser dentro de un método especial de Execute(),
llamado Synchronize(segundo método).

* El ejemplo que se da en el comentario, es que se pretende que dentro de un proceso concurrente o hilo, se
actualice el Caption de Form1, recordando lo anterior, ese actualización no puede hacerse directamente
dentro del método Execute(), en su lugar Execute(), hace un llamado a otro método(UpdateCaption) de la
clase, para que este ultimo método lo actualice.

Se construye el primer programa concurrente, usando el ejemplo que esta en el comentario.

Procedimiento:

1.- Crear el Thread Object, grabarlo como se indico, y cargar a la vista los dos archivos, proceso1.h y
proceso1.cpp
2.- Modificar los códigos con las siguientes instrucciones:

2.1.- proceso1.h

//----------------------------------------------------------

#ifndef proceso1H

#define proceso1H

//----------------------------------------------------------

#include <vcl\Classes.hpp>

//----------------------------------------------------------

class proceso1 : public TThread

prívate:

protected:

void __fastcall UpdateCaption();

void __fastcall Execute();

public:

__fastcall proceso1(bool CreateSuspended);

};

//----------------------------------------------------------

#endif

* Observar que como se ocupa un segundo método especializado, en accesar componentes visuales, se
tiene que declarar dentro de la clase, ya sea en su parte protegida o en su parte publica.

2.2.- proceso1.cpp

//----------------------------------------------------------

#include <vcl\vcl.h>

#pragma hdrstop

#include "proceso1.h"

//----------------------------------------------------------

// Important: Methods and properties of objects in VCL can // only be


used in a method called using Synchronize, for // example:

//

// Synchronize(UpdateCaption);

//

// where UpdateCaption could look like:

//

// void __fastcall proceso1::UpdateCaption()

// {

// Form1->Caption = "Updated in a thread";

// }

//----------------------------------------------------------

__fastcall proceso1::proceso1(bool CreateSuspended)

: TThread(CreateSuspended)

{ }

//----------------------------------------------------------

void __fastcall proceso1::Execute()

//---- Place thread code here ----

Synchronize(UpdateCaption);

//----------------------------------------------------------

void __fastcall proceso1::UpdateCaption()

Form1->Caption = "Updated in a thread";

* Observar que Execute(), en este caso solo llama a un segundo método(), usando su método especial.

* El segundo método, es un caso normal, se declaro en el archivo proceso1.h y se construyo o implemento


al final del archivo proceso1.cpp

* Grabar los dos archivos con File, Save All o CTRL S con cada uno, ya grabados en folder tarea1, usar
File, Close All
La preguntas son:

1.- Como se incorpora este objeto concurrente a una aplicación

2.- Como se activa o se continua la ejecución del proceso concurrente.

R.- esperar a la tercera edición del libro :>)

Procedimiento:

1.- Crear y almacenar el objeto thread, llamado proceso1 con el procedimiento anterior, asegurarse de que
ya todo este CLOSE All y los archivos en folder tarea1.

2.- File, New Aplication

3.- File, Save Project as, y asegurarse que se grabe dentro del folder tarea1

4.- Poner un BUTTON OK y solo se escriben los siguientes tres renglones de código:

#include "proceso1.cpp"

proceso1 *pro1;

pro1 = new proceso1(false);

* observar dentro de Unit1, donde va cada uno de ellos;

4.1.- Unit1.cpp

//----------------------------------------------------------

#include <vcl\vcl.h>

#pragma hdrstop

#include "Unit1.h"

//----------------------------------------------------------

#pragma resource "*.dfm"

TForm1 *Form1;

#include "proceso1.cpp"

//----------------------------------------------------------

__fastcall TForm1::TForm1(TComponent* Owner)

: TForm(Owner)

{
}

//----------------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)

proceso1 *pro1;

pro1 = new proceso1(false);

//----------------------------------------------------------

* #include “proceso1.cpp”, es para que Form1 o sus componentes, puedan accesar proceso1.

* proceso1 *pro1; crea un variable de tipo proceso1 llamada pro1 derivada o instancia de la clase proceso1

* pro1 = New proceso1(false); crea físicamente o en memoria el objeto, llamando a su constructor.

* false.- Recordar que el constructor crea el objeto concurrente pero suspendido, es decir en proceso1,
CreateSuspend = true(default), por esa razón en la llamada al constructor se le informa que CreateSuspend
= false, por tanto el proceso se reactiva y hace la llamada al método Execute().

* Como se observa, no es necesario ni tampoco se puede llamar directamente al método Execute(), es decir
no es valido pro1→Execute(); pero si es valido

pro1→Resume(), pro1→Suspend(), pro1→Terminate(), etc., ver la ayuda de la clase TThread.

La pantalla de salida es:


3 Aplicaciones Concurrentes c++builder

Se construye ahora, una aplicación con dos objetos concurrentes, el primero despliega los números del uno
al mil, y el segundo lo mismo pero de dos en dos.

Procedimiento:

1.- File, Close All

2.- Crear el Thread Object, llamarlo y grabarlo como proceso1 con el procedimiento anteriormente descrito,
no olvidar al final File, Close All

2.1.-Codigo de proceso1.h

//---------------------------------------------------------

#ifndef proceso1H

#define proceso1H

//----------------------------------------------------------

#include <vcl\Classes.hpp>

//----------------------------------------------------------

class proceso1 : public TThread

prívate:

protected:

int alfa;

void __fastcall Editar();

void __fastcall Execute();

public:

__fastcall proceso1(bool CreateSuspended);

};

//----------------------------------------------------------

#endif

2.2.-Codigo de proceso1.cpp

//----------------------------------------------------------
#include <vcl\vcl.h>

#pragma hdrstop

#include "proceso1.h"

//----------------------------------------------------------

__fastcall proceso1::proceso1(bool CreateSuspended)

: TThread(CreateSuspended)

//----------------------------------------------------------

void __fastcall proceso1::Execute()

{ //---- Place thread code here ----

for(alfa=1;alfa<=1000;alfa++)

{ Synchronize(Editar); };

//---------------------------------------------------------

void __fastcall proceso1::Editar()

{ Form1->Edit1->Text=alfa;

3.- Crear otro Thread Object, llamarlo y grabarlo como proceso2 con el procedimiento ya descrito, no
olvidar al final File, Close All

3.1- Código de proceso2.h

//----------------------------------------------------------

#ifndef proceso2H

#define proceso2H

//---------------------------------------------------------

#include <vcl\Classes.hpp>

//----------------------------------------------------------

class proceso2 : public TThread


{

prívate:

protected:

int beta;

void __fastcall Editar();

void __fastcall Execute();

public:

__fastcall proceso2(bool CreateSuspended);

};

//----------------------------------------------------------

#endif

3.2- Código de proceso2.cpp

//----------------------------------------------------------

#include <vcl\vcl.h>

#pragma hdrstop

#include "proceso2.h"

//---------------------------------------------------------

__fastcall proceso2::proceso2(bool CreateSuspended)

: TThread(CreateSuspended)

//----------------------------------------------------------

void __fastcall proceso2::Execute()

{ //---- Place thread code here ----

for(beta=1;beta<=2000;beta=beta+2)

{ Synchronize(Editar); }

//----------------------------------------------------------
void __fastcall proceso2::Editar()

{ Form1->Edit2->Text = beta;

4.- File, New Aplication y no olvidar File, Save Project As dentro del folder tarea1.

5.- Colocar dos edits y dos buttons, en la aplicación, el

código de Unit1.cpp, es;

//----------------------------------------------------------

#include <vcl\vcl.h>

#pragma hdrstop

#include "Unit1.h"

//----------------------------------------------------------

#pragma resource "*.dfm"

TForm1 *Form1;

#include "proceso1.cpp"

#include "proceso2.cpp"

//----------------------------------------------------------

__fastcall TForm1::TForm1(TComponent* Owner)

: TForm(Owner)

//----------------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)

{ proceso1 *pro1;

pro1 = new proceso1(false);

pro1->Terminate();

//----------------------------------------------------------

void __fastcall TForm1::Button2Click(TObject *Sender)


{ proceso2 *pro2;

pro2 = new proceso2(false);

pro2->Terminate();

//---------------------------------------------------------

* Observar que ahora hay dos include arriba

* cada botón activa su propio proceso

* Se usa el método Termínate(), para asegurarse que termine el proceso, pero es redundante porque el
destructor se activa la terminar el ámbito del buttonclick();

1. La pantalla de salida es:

No parece impresionante, pero las dos cajas Edits, se están cargando al mismo tiempo, es decir
concurrentemente.