Tutorial BORLAND C++Builder de Programacion
Tutorial BORLAND C++Builder de Programacion
Tutorial BORLAND C++Builder de Programacion
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 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.
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.
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.
* 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.
PROBLEMAS SUGERIDOS:
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).
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.
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.
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 ).
Un operador es un símbolo especial que indica al compilador que debe efectuar una operación matemática
o lógica.
Operador Operación
+ Suma
- Resta
* Multiplicación
/ División
% Residuo o Módulo
float a;
// área de operaciones
a = 10 / 4;
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
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:
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:
1.
2.
3.
7.- C++BUILDER JERARQUIA DE OPERACIONES
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: 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.
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:
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:
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.
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.
Additional.- BitBtn, SpeedButton, MaskEdit, StringGrid, DrawGrid, Image, Shape, Bevel, ScrollBox.
Data Access.- DataSource, Table, Query, StoredProc, DataBase, Session, BatchMove, UpdateSQL.
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.
Analizaremos ahora los dos primeros componentes, que también se usaran para construir o diseñar nuestro
primer programa en C++Builder y Visual.
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.
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.
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.
8.- Ahora ya esta lista la forma o programa para ejecutarse, también existen dos maneras:
1.
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.
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:
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.
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;
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;
En particular, se deberá asociar los Edit con las variables, y solo existirán en principio cuatro tipo de edits.
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.
Edit3->Text=Edit1->Text.ToInt() * Edit2->Text.ToInt();
notas:
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;
Label3->Caption = AnsiString(alfa);
Edit4->Text = AnsiString(beta);
<code>
<code>
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;
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;
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.
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
// conversión y despliegue
También es valido usar FormatFloat() con lo visto en Edit, es decir es valido y mas correcto;
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í;
Edit3->Text=FormatFloat("###.##",Edit1->Text.ToDouble() *
Edit2->Text.ToDouble()/ 2 );
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.
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:
* 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().
';' Se utiliza para separar los tres campos o partes de una mascara
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.
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
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.
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.
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.- REEDITAR E INCLUIR ESTE COMPONENTE PANEL, EN TODOS LOS PROGRAMAS IMPARES
HECHOS.
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.
1.- REEDITAR E INCLUIR ESTE COMPONENTE GroupBox PARA TODOS LOS PROBLEMAS
PARES YA CONSTRUIDOS
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
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;
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.
Instrucciones Condicionales que en C++Builder se implementan con las instrucciones if() y switch().
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.
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.
Una condición simple se define como el conjunto de variables y/o constantes unidas por los llamados
operadores relaciónales.
Operador Significado
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.
Es la instrucción condicional mas usada en los diversos lenguajes de programación, su formato completo y
de trabajo en C++Builder es :
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.
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.
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.
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.
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.
};
Recordar que la propiedad Text de cualquier componente, puede usar o accesar cualquier [posición o
carácter] usando los corchetes por ejemplo;
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
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.
El componente CheckBox, permite seleccionar una opción al usuario del programa o tomar una decisión,
directamente en pantalla.
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.
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ú).
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).
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.
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.
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 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.
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.
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.
Casos Particulares;
1.- El ciclo comienza en uno y se incrementa de uno en uno, este es el caso mas general.
for(x=5;x⇐15;x=x+1){ etc.};
4.- Los incrementos también pueden ser diferentes al de uno en uno, ej.;
5.- Incluso pueden ser decrementos, solo que en este caso, recordar;
el x = x + 1 por x++
el x = x - 1 por x–
ejemplo;
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
//declaración
int x;
// ciclo for
{ ListBox1->Items->Add(x); };
Practicar hasta conseguir tener esta pantalla de salida o de ejecución, cuando se consiga entonces ya se esta
listo para lo siguiente;
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 :
while (condición)
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.
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.
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;
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.
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.
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++;
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
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;
2.- Nuevos Arreglos de C++ (Son CLASES e internos dentro del programa)
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;
Juan
José
Carmen
18 —> Edad[0]
20
25
30 —> Edad[3]
1. ARREGLOS TIPO TABLAS
CIA ACME
(MILES DE $)
SUC A 10 12 15 10 9
SUC B 8 7 5 9 6
SUC C 11 18 20 14 17
CONCENTRADO DE CALIF
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.
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.
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
{ // declaración
int edad[4];
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
// 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;
// declaración
int edad[4];
int renglón;
// conversión a meses
{ edad[renglón]=edad[renglón]*12; };
{ 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;
{ // declaración
AnsiString Ciudad[3];
int reng;
Ciudad[0]=Edit1->Text;
Ciudad[1]=Edit2->Text;
Ciudad[2]=Edit3->Text;
1.- Capturar y desplegar 5 precios de productos cualesquiera, usando dos panel, uno para capturar y uno
para desplegar.
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
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];
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]) ); };
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
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.
C++Builder nos proporciona cuando menos dos tiposnuevos de arreglos, ellos son;
TList
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.
1.-Propiedades;
Count.- Numero de objetos contenidos actualmente en la lista Items.- Se usa para referenciar o accesar los
objetos en la lista.
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.
Expand.- Se usa para agregar mas espacio para nuevos objetos en la lista.
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.
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.
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.
1.- Propiedades;
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.
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;
// área de declaración
TStringList *ciudades;
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.
TStringList *edades;
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;
TStringList *ciudades;
// captura de datos
ciudades->Strings[0]=Edit1->Text;
ciudades->Strings[1]=Edit2->Text;
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;
// despliegue de la lista
ListBox1->Items->Text = ciudades->Text;
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.
Código
{ TStringList *edad;
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);
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.
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.
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"
//-------------------------------------------
TForm1 *Form1;
TStringList *edad;
//-------------------------------------------
edad=new TStringList;
//-------------------------------------------
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.
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.
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; )
Métodos:
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.
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
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.
+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.
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;
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).
Programa;
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
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
En este ejemplo aparte de la tabla se ocupan 4 listas, dos para totales y dos para promedios.
//declaración
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++)
for(col=0;col<=2;col++)
{totmes[col]=totmes[col]+tabla[reng][col]; };
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
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.
a.1) Variables Registros, como ya se indico son variables que permiten almacenar conjuntos de datos de
diverso tipo.
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.
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.
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:
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.
No se respetan o siguen al pie de la letra estos tres postulados y empiezan los problemas al tiempo de
programación.
Tabla: Camisas
Tabla: Clientes
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.
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.
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.
El primer paso antes de usar el paquete correspondiente a esta tarea, es diseñar la tabla completamente, esto
exige:
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.
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:
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.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.
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 .
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.
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.
* 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.
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.
Propiedad DataSet = Click a un lado y seleccionar el componente Table al que se quiere enlazar, por
ejemplo Table1.
De este componente se deben colocar tantos de ellos en la forma, como columnas existan en la tabla a
procesar.
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.
Button Significado
Cancel Cancela modo edición y restaura los datos anteriores que tenia el rengló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.
Pantalla de Diseño:
Pantalla de ejecución:
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:
* 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.
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.
Pantalla de Diseño
Pantalla de ejecución:
1.- CONSTRUIR APLICACIONES CON ESTE FORMATO PARA LA SEGUNDA MITAD DE LAS
TABLAS CREADAS CON EL DATABASE DESKTOP.
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.
//-----------------------------------------------------
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 *).
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:
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.
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.
1.- CONSTRUIR UNA APLICACION DE BUSQUEDAS PARA UNA TABLA DE AUTOS, CON
OPCIONES DE BUSQUEDA POR CLAVE, MODELO, COLOR, PRECIO.
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:
= ClaveCliente < 3
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;
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.
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.
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:
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.
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™
QReport
Practica para construir un reporte que contiene la cédula de un y solamente un cliente de la tabla de
clientes.
1.- Table1
* Filtered = true
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.
Color = clgreen
Width = 5
4.- QRLabel1
Propiedades:
5.- QRSysData1
Componente especiales que contienen datos fijos de impresión, tales como numero de pagina, fecha, hora,
etc.
propiedades:
6.- QRSysData2
7.- QRShape2
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:
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:
————————————————–
QuickRep1→Preview();
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
Poner componentes qrlabel con el nombre de la compañía, el propósito de la tabla, fecha, etc.
Poner dentro componentes qrlabel con el encabezado que lleva cada columna de la tabla.
Es la mas importante, porque es la que contiene los datos de los renglones de la tabla.
Solo colocar dentro de esta banda los componentes de datos impresos, QRDBText y QRDBImage
Poner dentro de ella componentes de operaciones como es QRExpr y estudiarlo en la ayuda, para conocer
sus métodos (funciones) y aplicarlas.
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).
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.
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.
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.
Entre dos tablas básicas o tablas simples cualesquiera, se debe y puede buscar, identificar y establecer una o
varias relaciones entre ellas, ejemplo;
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).
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.
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.
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.
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;
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;
ejemplo;
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.
El modelo relacional completo, antes de traspasarlo al DataBase DESKTOP, debe incluir todo lo siguiente:
tabla de uno
tabla de muchos
* Clave de Muchos S, P* (S = ISmuchos) * otros
tabla de relación
* otros
tabla de detalle
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.
(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:
B)Click en ComboBox de la derecha, hasta que aparezca y seleccionar la opción Secondary Indexes.
F)DD pregunta ahora por el nombre del índice mediante la siguiente ventana:
H)DD regresa ahora ala tabla principal, click en botón SAVE para grabarla con los nuevos cambios.
J) Repetir los pasos desde inciso A, para construir los índices de las otras tablas.
2.- Click en ComboBox de la derecha, hasta que aparezca y seleccionar la opción Referential Integrity.
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.
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.
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.
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).
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 ;
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.
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:
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:
DBEdit(DS3)
Panel de uno
Panel de detalle
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.
OnClickButton1(){
OnClickButton2(){
Table4->Insert();
OnClickButton3(){
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.
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).
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.
6.
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
//---------------------------------------------------
//--------------------------------------------------
{ Table3->Refresh();
//---------------------------------------------------
Table4->Insert();
//---------------------------------------------------
{
// operaciones y terminar con:
Table4->Refresh();
//---------------------------------------------------
PANTALLA DE EJECUCION
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
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:
* Comprender los conceptos de componentes , clases y objetos, tanto visuales como no visuales.
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();
gatos::maullar(){ cin»“miauuuu”;}
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 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 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.
PROCEDIMIENTO
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
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
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.
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,
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.
* 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.
Click en Ok
observar las cuatro partes o áreas bien diferenciadas entre si y la notas (encerradas entre {{}} personales
puestas ahí para su aclaración.
//----------------------------------------------------------------
#include <vcl\vcl.h>
//----------------------------------------------------------------
{
return new miboton(NULL);
//----------------------------------------------------------------
//----------------------------------------------------------------
namespace Unit1
//----------------------------------------------------------------
//----------------------------------------------------------------
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.
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.
8.- Add
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.
Procedimiento:
2.- File, Open y subir hasta el directorio Bin de C++Builder, click en miboton.cpp, para cargarlo.
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:
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
a) Un bitmap.- Es un icono grafico creado para sustituir, el icono de default en la barra de componentes.
Procedimiento:
Se supone que ya esta creado e instalado el componente original, en este ejemplo miboton.cpp y miboton.h
2.- Component, Install, seleccionar miboton.cpp, Remove, Ok, esperar hasta Done=Make, Ok
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.
5.- En C++Builder:
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:
Class fórmulas
{ return pesos/tipocambio; }
{return (calif1+calif2)/2.0 ;}
Procedimiento:
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.
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.
//----------------------------------------------------------
#ifndef formulasH
#define formulasH
//----------------------------------------------------------
#include <vcl\SysUtils.hpp>
#include <vcl\Controls.hpp>
#include <vcl\Classes.hpp>
#include <vcl\Forms.hpp>
//----------------------------------------------------------
prívate:
protected:
public:
__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:
protected: No pueden ser accesados por código fuera de la la clase, pero si por métodos de la propia clase.
_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>
//----------------------------------------------------------------
prívate:
protected:
public:
__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"
//----------------------------------------------------------------
//----------------------------------------------------------------
//----------------------------------------------------------------
namespace Fórmulas
}
}
//----------------------------------------------------------------
{ return pesos/tipocambio; }
{return (calif1+calif2)/2.0 ;}
* Solo se escriben los últimos renglones y en la posición indicada, es decir al final del archivo .cpp
Ejemplo de aplicación:
1. Pantalla de Diseño:
b) Código
//----------------------------------------------------------------
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.
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.
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 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)
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:
- 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.
//----------------------------------------------------------
#ifndef proceso1H
#define proceso1H
//----------------------------------------------------------
#include <vcl\Classes.hpp>
//----------------------------------------------------------
prívate:
protected:
void __fastcall Execute();
public:
};
//----------------------------------------------------------
#endif
* 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().
//----------------------------------------------------------
#include <vcl\vcl.h>
#pragma hdrstop
#include "proceso1.h"
//----------------------------------------------------------
//
// Synchronize(UpdateCaption);
//
//
// {
//----------------------------------------------------------
: TThread(CreateSuspended)
//----------------------------------------------------------
//---------------------------------------------------------
* No hay muchas sorpresas, solo la implementación de los dos métodos que contiene la clase:
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.
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>
//----------------------------------------------------------
prívate:
protected:
public:
};
//----------------------------------------------------------
#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"
//----------------------------------------------------------
//
// Synchronize(UpdateCaption);
//
//
// {
// }
//----------------------------------------------------------
: TThread(CreateSuspended)
{ }
//----------------------------------------------------------
Synchronize(UpdateCaption);
//----------------------------------------------------------
* Observar que Execute(), en este caso solo llama a un segundo método(), usando su método especial.
* 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:
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.
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;
4.1.- Unit1.cpp
//----------------------------------------------------------
#include <vcl\vcl.h>
#pragma hdrstop
#include "Unit1.h"
//----------------------------------------------------------
TForm1 *Form1;
#include "proceso1.cpp"
//----------------------------------------------------------
: TForm(Owner)
{
}
//----------------------------------------------------------
proceso1 *pro1;
//----------------------------------------------------------
* #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
* 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
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:
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>
//----------------------------------------------------------
prívate:
protected:
int alfa;
public:
};
//----------------------------------------------------------
#endif
2.2.-Codigo de proceso1.cpp
//----------------------------------------------------------
#include <vcl\vcl.h>
#pragma hdrstop
#include "proceso1.h"
//----------------------------------------------------------
: TThread(CreateSuspended)
//----------------------------------------------------------
for(alfa=1;alfa<=1000;alfa++)
{ Synchronize(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
//----------------------------------------------------------
#ifndef proceso2H
#define proceso2H
//---------------------------------------------------------
#include <vcl\Classes.hpp>
//----------------------------------------------------------
prívate:
protected:
int beta;
public:
};
//----------------------------------------------------------
#endif
//----------------------------------------------------------
#include <vcl\vcl.h>
#pragma hdrstop
#include "proceso2.h"
//---------------------------------------------------------
: TThread(CreateSuspended)
//----------------------------------------------------------
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.
//----------------------------------------------------------
#include <vcl\vcl.h>
#pragma hdrstop
#include "Unit1.h"
//----------------------------------------------------------
TForm1 *Form1;
#include "proceso1.cpp"
#include "proceso2.cpp"
//----------------------------------------------------------
: TForm(Owner)
//----------------------------------------------------------
{ proceso1 *pro1;
pro1->Terminate();
//----------------------------------------------------------
pro2->Terminate();
//---------------------------------------------------------
* 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();
No parece impresionante, pero las dos cajas Edits, se están cargando al mismo tiempo, es decir
concurrentemente.