You are on page 1of 63

UNIDAD C++BUILDER INT A LAS BASES DE DATOS

1.- INTRODUCCION
2.- MODELOS DE ALMACENAMIENTO DE DATOS
3.- TABLAS
4.- TABLAS CONTINUACION
5.- DATABASE DESKTOP
6.- APLICACIONES O PROGRAMAS CON TABLAS
7.- APLICACIONES POR RENGLON
8.- APLICACION POR TABLA
9.- PROCESOS BASICOS
10.- BUSQUEDAS
11.- FILTROS
12.- GRAFICOS O IMAGENES
13.- IMPRESION O REPORTES
14.- IMPRESION DE TODA LA TABLA
15.- MODELO RELACIONAL DE DATOS
16.- TIPOS DE RELACIONES
17.- MODELO RELACIONAL Y DATABASE DESKTOP
18.- APLICACIONES CON TABLAS DE RELACION
V UNIDAD C++BUILDER COMPONENTES
1.- INTRODUCCION
2.- COMPONENTES, CLASES Y OBJETOS
3.- INSTALACION Y MANTENIMIENTO DE COMPONENTES VISUALES
4.- INSTALACION PRACTICA DE COMPONENTES
5.- CREACION E INSTALACION DE COMPONENTES VISUALES

6.- EDICION DE COMPONENTES VISUALES


7.- ELIMINACION COMPONENTES VISUALES
8.- BITMAPS A COMPONENTES VISUALES
9.- CREACION COMPONENTES NO VISUALES
VI UNIDAD C++BUILDER MULTIPROCESAMIENTO
1.- INTRODUCCCION
2.- OBJETOS CONCURRENTES
3.- APLICACIONES CONCURRENTES
UNIDAD C++BUILDER INT A LAS BASES DE DATOS
1.- INTRODUCCION C++BUILDER

En este capitulo se analizan en general dos problemas:


Variables que permitan almacenar conjuntos de datos como los arreglos pero de
distintos tipos de datos, este primer problema se resolva en la antigedad 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 ejecucin o corrida del programa.
Tradicionalmente en programacin antigua este segundo problema se resolva usando el
concepto de archivos, que son medios permanentes de almacenamiento de datos en los
dispositivos o perifricos apropiados, generalmente disco, cinta magntica, etc.

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

En general existen dos modelos de almacenamiento de datos en los sistemas de


informacin.
El modelo tradicional de archivos que se construye con los siguientes elementos:
a.1) Variables Registros, como ya se indico son variables que permiten almacenar
conjuntos de datos de diverso tipo.

Tambin se pueden definir como representaciones simblicas y programaticas de


entidades lgicas de informacin, ejemplos de variables registros son alumnos,
empleados, clientes, proveedores, productos, autos, etc.
Esta variables registros, tambin 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 aplicacin, que es un programa que se encarga de coordinar todos los
programas descritos y presentrselos a los usuarios de manera clara, fcil y accesible y
entendible.
Salta a la vista que construir un sistema de informacin por ejemplo para una tienda de
vdeo o para un refaccionara, etc. involucra un gran cantidad de trabajo de
programacin, puesto que hay que programar muchas variables registros, muchos
archivos en disco, y una o varias aplicaciones.
Este modelo se usa todava en la actualidad, pero es obvio que mejores maneras, mas
rpidas, 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 Relacinales, este modelo intenta simplificar la construccin
de sistemas de informacin como los antes descritos, este modelo solo incluye en forma
simple los siguientes elementos:
Tablas, es una combinacin 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
automticamente se convertir en un espejo de la tabla en memoria, es decir cuando se
cargan los datos en la tabla en memoria, tambin se estarn cargando ala vez en disco.
Otra vez cuando el programador escribe cdigo para capturar los datos y mandarlos a la
tabla en pantalla-memoria, realmente tambin lo esta haciendo para darlos de alta en
disco.

Aplicacin, que tiene la misma funcin que en el modelo anterior.


No confundir este concepto de tablas en base de datos con el concepto de tablas, vistos
en el capitulo de arreglos, aunque en la practica se parecen mucho, la diferencia es que
los datos no se van a disco.
Como se observa en este modelo, es mas sencillo construir sistemas de informacin con
el, puesto que la parte programatica se reduce ampliamente.

3.- TABLAS C++BUILDER

Una Tabla simple, representa una


UNIDAD de informacin de una entidad lgica de informacin:

Tabla Empleado:
* Clave Empleado * Nombre Empleado * Direccin Empleado * Edad Empleado *
Telfono Empleado * etc. Empleado

Tabla Proveedor:
* Clave Proveedor * Nombre Proveedor * Empresa Proveedor * Telfono Proveedor *
Fax Proveedor * Celular Proveedor * etc. Proveedor

Tabla Autos:
* Numero de Serie * Modelo * Marca * Tipo * Color * Capacidad * etc.

Observar que cada tabla, empieza con una clave generalmente detipo numrica.
Todos los elementos de la tabla, solo hacen referencia hacia el mismo ente o sujeto de
informacin.
Cada elemento solo representa o debe contener un solo dato de informacin.
No se respetan o siguen al pie de la letra estos tres postulados y empiezan los problemas
al tiempo de programacin.
Existe una segunda forma o manera de representar las tablas, ejemplo:

Tabla: Camisas
NumCamisa Marca Estilo Medida Color Material
1 Jeans Manga Corta Grande Azul Algodn
2 Volis Camiseta Mediana Negra Poliester
3 Genrica Manga Larga Chica Morado Rayn
etc. etc. etc. etc. etc. etc.

Tabla: Clientes
NumCliente NomCliente DirCliente TelCliente
1 Juan Prez Av. aba 121212
2 Luis Prez calle zeta 898989
3 Jos Prez cjon sss 000000
etc. etc. etc. etc.

Recordar siempre, una tabla almacena o representa un conjunto de datos relacionados


entre si, la tabla de alumnos es para almacenar y manipular muchos alumnos, la tabla de
productos es para almacenar y manipular muchos alumnos, en resumen si en un
problema de informacin solo se presenta una instancia o rengln de una entidad lgica,
entonces no es tabla, es un encabezado.
TAREAS PROGRAMACION C++BUILDER
1.- CONSTRUIR EN CUADERNO LAS SIGUIENTES TABLAS, LA MITAD DE
ELLAS CON EL PRIMER FORMATO Y LA SEGUNDA MITAD CON EL
SEGUNDO FORMATO.

4.- C++BUILDER TABLAS (CONTINUACION)

El trabajo correcto con bases de datos relacinales, se divide en dos grandes pasos o
etapas bien diferenciadas entre si:
En la primera etapa se disea la tabla , con sus campos, llaves y condiciones especiales,
luego se usa un paquete o programa de software especializado en la construccin,
mantenimiento y administracin de la base de datos, este software se usa para convertir
la tabla o tablas ya bien diseadas en un archivo en disco.

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


MANAGEMENT SYSTEM) o sistema administrador de bases de datos.
Este software se especializa en la creacin, mantenimiento, seguridad, privacidad, etc.
de un conjunto de tablas o mejor dicho una base de datos, los DBMS mas comunes son
Oracle, SqlServer, Informix, Sysbase, etc.
Borland la compaa 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 tambin se usara para construir las tablas y/o
archivos fsicos.
La segunda etapa consiste en construir la aplicacin o aplicaciones que ya tendrn
acceso o podrn manipular los datos contenidos en la tabla, estas aplicaciones se
escriben usando ya sea lenguajes clsicos de programacin como BASIC, PASCAL,
COBOL, CBUILDER, DELPHI, etc o tambin se pueden accesar paquetes comunes de
manipulacin de archivos o bases de datos como DBASE, CLIPPER, VISUALFOX,
ACCESS, etc.
DISEO Y CREACION DE UNA TABLA
El primer paso antes de usar el paquete correspondiente a esta tarea, es disear la tabla
completamente, esto exige:
1. Nombre apropiado y determinacin de atributos y campos correspondientes
2. Seleccionar y determinar el atributo principal o campo clave o llave primaria que se
utiliza como el identificador nico que permite diferenciar cada instancia o rengln
diferente dentro de la tabla.
3. Tambin 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 existirn muchas ocasiones mas adelante donde se puede pedir un orden diferente,
por ejemplo, por ciudad, por carrera, por nombre, por edad, etc., la buena ingeniera 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
nmero de empleado deben comenzar en 500, la edad no debe ser mayor de 150 aos,
etc.
Ya listo el diseo de la tabla, se pasa a el programa correspondiente para su creacin y
almacenamiento, dicho programa que se encuentra dentro de el folder o subdirectorio de
CBuilder y como ya se dijo es:
5.- DATABASE DESKTOP C++BUILDER

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


encuentra en el mismo folder o directorio que el C++Builder.
El procedimiento completo para construir la tabla, es:

b) Crear una nueva con file, new, table, DD pregunta cual formato de tabla se va a usar;

c) El formato a seleccionar es Paradox 7,(Borland es la compaa propietaria de los


arriba mencionados, otras versiones de C++Builder ya traen licencias para nuevos tipos,
como Access, etc.), ya hecha la seleccin 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, numricos, y alpha para el caso de strings.

La opcin size(tamao) solo se usa cuando el campo es de tipo string ( ALPHA) y se


tiene que dar el tamao de la string, por ejemplo en campo Direccin el size o tamao es
30.
La opcin 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 opcin Key.
e) La segunda rea de la tabla, son las propiedades de la tabla, todas las propiedades de
la tabla estn dentro del siguiente combobox.

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

La propiedad siguiente tiene sus propios elementos y as sucesivamente.


De momento solamente dejar las propiedades o sus partes en blanco.
f) No olvidar usar la opcin SAVE abajo para guardar la tabla, en esta parte sale la
ventana normal de Windows para grabacin, esa ventana donde se puede crear un nuevo
folder, etc., solo buscar el directorio que se creo al principio de la sesin con my
computer, abrirlo(OPEN) y escribir un nombre apropiado para la tabla.
Ya creada la tabla, es conveniente cargarle unos cuantos renglones registros o datos para
pruebas, esto se hace con:

c.1) Usar el icono de OPEN tabla

y seleccionar la tabla a cargar.

c.2) Entrar al modo de edicin usando el icono de Edit


capturar los datos en cada rengln.

y ya se puede empezar a

c.3) Para terminar solo click en la X arriba en la tabla respectiva.


Ejemplo de una tabla;

Recordar que todos los cambios hechos a una, aadir, insertar, eliminar, modificar, etc.
quedan grabados automticamente en disco, este hecho es la razn por lo que no existe
una opcin de grabar un rengln o registro cualesquiera.
Ahora si, ya creada, declarada o definida la tabla, es tiempo ahora de construir la
aplicacin, para esto se usara nuevamente el C++Builder .
6.- APLICACIONES O PROGRAMAS CON TABLAS C++BUILDER

Bsicamente una aplicacin consiste de un programa o forma que permite accesar,


manipular, editar, procesar, etctera, los datos, registros, o renglones de una tabla, es
decir es la aplicacin 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, existan
muchos procesos, tanto para la manipulacin 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 haba que construirlos programarlos a mano, era terrible la situacin de los
programadores de antao.
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 contendrn la tablas.
Recordar tambin que la aplicacin 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 rengln de informacin para su proceso y manipulacin y
la segunda es presentarle toda la tabla a la vez, tambin para su manipulacin y proceso.
7.- APLICACIONES POR RENGLON C++BUILDER

Para construir una aplicacin, presentndole un solo rengln al usuario para su


procesamiento en C++Builder, solo se ocupa una forma (Form1) y solocuatro
componentes diferentes de acceso y manipulacin de tablas, estos cuatro componentes
son:
PROCEDIMIENTO Y COMPONENTES
1.- Colocar un componente Table (Data Access )
en algn lugar de la forma donde
no estorbe( este componente quedara flotando y no aparece al momento de ejecucin
del programa).
Este componente Table, sirve de enlace fsico entre la tabla real que se creo con el
DataBase Desktop y el resto de los componentes que se usaran para la construccin de
la aplicacin.
Sus tres propiedades mas importantes son:
* Propiedad DataBaseName = Solo escribir el directorio donde se encuentra la tabla
real, por ejemplo c:\datos
* Propiedad TableName = Solo click a un lado de esta propiedad y seleccionar la tabla a
usar, por ejemplo seleccionar la tabla de clientes.
* Propiedad Active = Ponerlo en valor True.
2.- Colocar un componente DataSource (Data Access)
forma donde no estorbe.

tambin en algn lugar en la

Este Componente acta como el enlace fsico entre el Componente Table y el resto de
componentes que procesan los datos de la tabla, es decir el componente Table apunta a

la tabla real en disco, el componente DataSource apunta al componente Table, y el resto


de los componentes apuntan a DataSource.
Su nica propiedad a modificar es:
Propiedad DataSet = Click a un lado y seleccionar el componente Table al que se quiere
enlazar, por ejemplo Table1.
3.- Componente DBEdit (Data Controls)

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


Es un componente muy similar al componente Edit y comparte muchas de las
propiedades y mtodos de este ultimo, su diferencia principal es que Edit, carga sus
datos desde el usuario y DBEdit los carga desde la tabla almacenada en disco.
De este componente se deben colocar tantos de ellos en la forma, como columnas
existan en la tabla a procesar.
Sus dos propiedades mas importantes y en el orden abajo descrito son:
Propiedad DataSource = Click a un lado y seleccionar el DataSource al que se quiere
enlazar, por ejemplo DataSource1.
Propiedad DataField = Click a un lado y seleccionar el campo o atributo o columna que
se quiere representar o enlazar por ejemplo ClaveCliente, NomCliente, etc.
Recordar que se deben colocar tantos DBEdit en la forma, como columnas existan en la
tabla, o como columnas se quieran presentar al usuario para su manipulacin.
Recordar poner unos cuantos componentes Label, arriba del componente DBEdit y
cargarlos en su propiedad caption con el nombre del campo o columna respectivo.
4.- Componente DBNavigator (Data Controls)

Button Significado

First Regreso al primer registro o rengln de la tabla.


Prior Regreso a registro o rengln anterior.
Next Avanza al siguiente rengln.
Last Avanza a el ultimo rengln.

Insert Inserta un nuevo rengln en la tabla.


Delete Borra o elimina el rengln o registro actual.
Edit Pone el registro actual en estado de edicin para su modificacin
Post Graba el registro o rengln actual en la tabla en disco.
Cancel Cancela modo edicin y restaura los datos anteriores que tenia el rengln.
Refresh Refresca o regraba toda la informacin.

Recordar poner unos cuantos componentes Label arriba de los botones del navegador
para su aclaracin, uso y manejo al usuario.
Sus dos propiedades mas importantes son:
Propiedad DataSource = Click a un lado y seleccionar el DataSource al que se quiere
enlazar, por ejemplo DataSource1.
Propiedad +VisibleButtons = Click en el signo +, para activar(True) o desactivar(False)
los botones de proceso de renglones de la tabla, que se quieran mostrar u ocultar al
usuario.
Con estos cuatro componentes ya se construye una aplicacin, ejemplo;
Pantalla de Diseo:

Pantalla de ejecucin:

TAREAS PROGRAMACION C++BUILDER


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

En este tipo de aplicacin, al usuario se le presenta toda la tabla completa a la vez para
su procesamiento y manipulacin.
Para construir esta tipo de aplicacin, solo se ocupan tres componentes y dos de ellos ya
son conocidos, estos componentes son:
Componente Table ( Data Access)
* propiedad DataBaseName = c:\datos
* propiedad TableName = Clientes.db
* propiedad Active = True
Componente DataSource ( Data Access)
* propiedad Dataset = Table1
Componente DBGrid ( Data Controls)
* DataSource = Click a un lado de la propiedad, para seleccionar el DataSource
respectivo a enlazar, por ejemplo DataSource1.

Una caracterstica 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 botn Add All Fields para cargar todos los campos columnas a la
primera ventana y de esta ventana ir seleccionando el campo o columna a procesar,
observar que se pueden agregar nuevas columnas, o eliminar columnas existentes y para
cada columna que se vaya seleccionando ya funciona la segunda parte del editor.
Componente DBNavigator( Data Access)
* propiedad DataSource = DataSource1
* propiedad +VisibleButtons = activar o desactivar los botones apropiados
Aunque este componente no se ocupa en este tipo de aplicacin, puesto que el usuario
puede realizar todos los procesos bsicos directamente dentro de la tabla, es conveniente
poner un navegador para darle una segunda opcin o manera de realizar los procesos
bsicos.
Un ejemplo de aplicacin con esta estructura es:
Pantalla de Diseo

Pantalla de ejecucin:

TAREAS PROGRAMACION C++BUILDER


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

9.- PROCESOS BASICOS C++BUILDER

Analizaremos ahora algunos procesos tambin bsicos que pueden realizarse con los
dos tipos de aplicaciones y que adems no estn contemplados en algunos de los
botones del navegador.
OPERACIONES CON CAMPOS
Para el caso de aplicaciones construidas con componentes DBEdit, recordar que
comparte muchas propiedades y mtodos con el componente edit, as que es valido por
ejemplo en una aplicacin donde la tabla productos tiene el campo
costounitario(DBEdit3) y el campo o columna utilidad(DBEdit6), poner un componente
edit1 para el precio de venta y realizar la siguiente operacin en el onclick de un botn
apropiado.
//----------------------------------------------------void __fastcall TForm1::Button1Click(TObject *Sender)
{
Edit1->Text=DBEdit3->Text.ToDouble()+DBEdit6 Text.ToDouble();
}

Como se observa se puede accesar y manipular los componentes DBEdit usando la


propiedad Text, tanto para leerlos como para cargarlos.
Problemas sugeridos:
1.- Una tabla de productos con campos costounitario, margen de utilidad y tasa de iva,
calcular el precio de venta.
a.2) Para el caso de aplicaciones con DBGrid, se pueden accesar sus celdas para su
lectura y proceso usando cdigo como en el siguiente ejemplo, en algn botn o evento
apropiado:
Edit3Text = DBGrid1Fields[2]AsInteger * 5;
Observar la propiedad Fields[col], es para indicar la columna deseada y adems
comienza en la 0(cero), recordar adems que este acceso ser realizado solamente sobre
el rengln seleccionado en la tabla (aquel que esta seleccionado con un *).
Tambin se esta usando el mtodo AsInteger para leerlo como entero.
Es conveniente usar la ayuda del C++Builder para el componente DBGrid para conocer
todas sus propiedades y mtodos.
Para cargar una celda con un nuevo valor, usar cdigo como el siguiente en algn botn
o evento apropiado.
Onclickbutton5(){
DBGrid1Edit();
DBGrid1Fields[3]Value = 300;
}
1.- Observar que son dos pasos, en el primero se pone todo el DBGrid en modo de
edicin 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 rengln, y es el rengln
seleccionado.
3.- Como primera nota interesante, esta propiedad Edit() es tambin la del navegador, es
decir es valido DBGrid1First, etc.
4.- Para la modificacin de la celda, se usaron otra vez la propiedad Fields[col] y
mtodo Vale, recordar nuevamente estudiar propiedades y mtodos de DBGrid.
Problema sugerido:
TAREAS PROGRAMACION C++BUILDER

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

10.- BUSQUEDAS C++BUILDER

Un problema muy comn en los sistemas de informacin basados en bases de datos es


el de bsquedas, en estos casos el usuario proporciona un dato, generalmente la clave
del registro, para que se localice toda la informacin pertinente.
Para resolver este problema, solo se ocupa:
1. Un botn de ordenes (OK) con el siguiente cdigo:
Los parmetros del mtodo Locate(), son;
Locate(Columna de bsqueda ,Dato a buscar , opcin de bsqueda);
cuando opcin = 0; ignora diferencia entre maysculas y minsculas
cuando opcin = 1; resultado parcial, ejemplo si se busca ju se posesiona en el
primer rengln donde ese campo empiece con ju, ejemplo Juan, juvenal, etc.
TAREAS PROGRAMACION C++BUILDER
1.- CONSTRUIR UNA APLICACION DE BUSQUEDAS PARA UNA TABLA DE
AUTOS, CON OPCIONES DE BUSQUEDA POR CLAVE, MODELO, COLOR,
PRECIO.
11.- FILTROS C++BUILDER

Un filtro es una condicin que permite desplegar solo determinada informacin de una
tabla.
Es decir, en ocasiones solo se quiere desplegar informacin 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 librera de VCL que contiene los componentes visuales, fue portada a C+
+Builder por parte de la Compaa Borland usando la librera VCL de Delphi( y este
Delphi es Pascal), en otras palabras los filtros o condiciones se tendrn que programar
tomando en cuenta a como Pascal maneja las constantes strings, los operadores
relacinales y los operadores lgicos.
Existen dos maneras de poner filtros o condiciones para una tabla, ellas son:

1.- Interna, debe haber un DBGrid en la aplicacin y para el componente Table,


modificar las siguientes propiedades:
* propiedad Filter = condicin, ejemplos para la tabla de clientes:
= ClaveCliente < 3
= Ciudad <> 'Tijuana'
= ClaveCliente > 2 and Ciudad = 'Tijuana'
* propiedad Filtered = true
2,- Externa, es el usuario quien construye el filtro o condicin, usando un componente
Edit para el filtro y un botn de ordenes (OK) para que se ejecute y despliegue la tabla
filtrada, el cdigo en dicho botn es;
onclickbutton1()
{
Table1Filter = Edit1Text;
Table1Filtered = true;
}
TAREAS PROGRAMACION C++BUILDER
1.- UNA TABLA DE AUTOS FILTRADA INTERNAMENTE POR COLOR AZUL Y
MODELO DE 1990 EN ADELANTE.
2.- UNA TABLA DE PROVEEDORES Y QUE SEA EL USUARIO QUIEN
CONSTRUYA EL FILTRO O CONDICION.

GRAFICOS O IMAGENES C++BUILDER

Campos de grficos o de imgenes, se han convertido en una de las grandes atracciones


y caractersticas de las bases de datos modernas.
En C++Builder, el manejo de dichos campos es muy fcil solo:
1.- Cuando se crea la tabla en el DataBase Desktop, incluir un campo de tipo de dato
Graphics, por ejemplo en la tabla de clientes, incluir el campo foto de tipo Graphics.

2.- En aplicaciones por renglones , no usar un DBEdit para este campo, sino usar un
componente DBImage (Data Controls)

Si el rengln o registro ya esta cargado con su imagen respectiva, al hacer la navegacin


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
funcin, es decir al momento que el usuario navega entre los renglones de la tabla, este
componente va desplegando la imagen del rengln donde se encuentra el cursor.
4.- El problema, es como cargar las imgenes, la respuesta es sencilla, las imgenes solo
pueden cargarse, capturarse o provenir de solo dos fuentes o lugares distintos:
4.1) Un archivo de tipo *.BMP( u otros formatos similares)
4.2) Del Clipboard de Windows
5.- Cualquier dispositivo o perifrico de este tipo (scaners, cmaras digitales, etc.) o
programas de imgenes ( paintbrush, paint, corel, etc.) tienen estas dos capacidades, es
decir pueden mandar sus imgenes ya sea al Clipboard o ya sea a un archivo en disco.
6.- Para capturar una imagen en una aplicacin ya sea por rengln 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 adems del componente DBImage un componente Button de ordenes(OK)
con el siguiente cdigo:
{ DBImage1PasteFromClipboard(); }
Recordar que para usar estos mtodos, el Clipboard de Windows ya debe estar cargado
con la imagen, para pruebas sencillas, minimizar la aplicacin, cargar el PaintBrush o
Paint, cargar un archivo .BMP, seleccionarlo luego Edit Copy, cerrar el Paint o
PaintBrush y maximizar la aplicacin y aplicar cualquiera de los dos mtodos.
Es evidente que tambin se pueden usar CTRL C, CTRL X, CTRL Del(ver edit de
cualquier ventana), CopyToClipboard() (ver ayuda de DBImage), etc., para diferentes
procesos.
Recordar adems que la tabla fsica no actualiza el campo correspondiente con su
imagen, si no se avanza de rengln, o se usan los botones Next, Refresh, Update del
navegador.

7.- Para cargar o capturar una imagen directamente desde un archivo en disco de
extensin .BMP (u otros similares) solo usar un componente DBImage ya sea en
aplicaciones por rengln o por tabla, un componente Button de ordenes y el siguiente
cdigo;
OnClickButton1()
{ DBImagePictureLoadFromFile(C:\datos\mifoto.bmp); }
Ya debe estar en el directorio o folder datos dicho archivo .BMP y adems otra vez
recordar, que aunque la imagen ya esta en la pantalla, todava no se manda a la tabla a
disco si no se ejecuta un avance de rengln o un Next, etc.
8.- La propiedad Stretch en DBImage, la amplia, otro mtodo es ponerlas en Clipboard
o archivo ya con el tamao apropiado.
TAREAS PROGRAMACION C++BUILDER
1.- UNA TABLA DE MAMIFEROS COMPLETA INCLUYENDO IMAGENES
2.- UNA TABLA DE PRODUCTOS O MERCANCIAS INCLUYENDO SU FOTO

GRAFICOS O IMAGENES C++BUILDER

Campos de grficos o de imgenes, se han convertido en una de las grandes atracciones


y caractersticas de las bases de datos modernas.
En C++Builder, el manejo de dichos campos es muy fcil solo:
1.- Cuando se crea la tabla en el DataBase Desktop, incluir un campo de tipo de dato
Graphics, por ejemplo en la tabla de clientes, incluir el campo foto de tipo Graphics.
2.- En aplicaciones por renglones , no usar un DBEdit para este campo, sino usar un
componente DBImage (Data Controls)

Si el rengln o registro ya esta cargado con su imagen respectiva, al hacer la navegacin


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
funcin, es decir al momento que el usuario navega entre los renglones de la tabla, este
componente va desplegando la imagen del rengln donde se encuentra el cursor.
4.- El problema, es como cargar las imgenes, la respuesta es sencilla, las imgenes solo
pueden cargarse, capturarse o provenir de solo dos fuentes o lugares distintos:

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


4.2) Del Clipboard de Windows
5.- Cualquier dispositivo o perifrico de este tipo (scaners, cmaras digitales, etc.) o
programas de imgenes ( paintbrush, paint, corel, etc.) tienen estas dos capacidades, es
decir pueden mandar sus imgenes ya sea al Clipboard o ya sea a un archivo en disco.
6.- Para capturar una imagen en una aplicacin ya sea por rengln 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 adems del componente DBImage un componente Button de ordenes(OK)
con el siguiente cdigo:
{ DBImage1PasteFromClipboard(); }
Recordar que para usar estos mtodos, el Clipboard de Windows ya debe estar cargado
con la imagen, para pruebas sencillas, minimizar la aplicacin, cargar el PaintBrush o
Paint, cargar un archivo .BMP, seleccionarlo luego Edit Copy, cerrar el Paint o
PaintBrush y maximizar la aplicacin y aplicar cualquiera de los dos mtodos.
Es evidente que tambin se pueden usar CTRL C, CTRL X, CTRL Del(ver edit de
cualquier ventana), CopyToClipboard() (ver ayuda de DBImage), etc., para diferentes
procesos.
Recordar adems que la tabla fsica no actualiza el campo correspondiente con su
imagen, si no se avanza de rengln, o se usan los botones Next, Refresh, Update del
navegador.
7.- Para cargar o capturar una imagen directamente desde un archivo en disco de
extensin .BMP (u otros similares) solo usar un componente DBImage ya sea en
aplicaciones por rengln o por tabla, un componente Button de ordenes y el siguiente
cdigo;
OnClickButton1()
{ DBImagePictureLoadFromFile(C:\datos\mifoto.bmp); }
Ya debe estar en el directorio o folder datos dicho archivo .BMP y adems otra vez
recordar, que aunque la imagen ya esta en la pantalla, todava no se manda a la tabla a
disco si no se ejecuta un avance de rengln o un Next, etc.
8.- La propiedad Stretch en DBImage, la amplia, otro mtodo es ponerlas en Clipboard
o archivo ya con el tamao apropiado.

TAREAS PROGRAMACION C++BUILDER


1.- UNA TABLA DE MAMIFEROS COMPLETA INCLUYENDO IMAGENES
2.- UNA TABLA DE PRODUCTOS O MERCANCIAS INCLUYENDO SU FOTO
13.- IMPRESION O REPORTES QREPORT C++BUILDER

Imprimir tablas o construir reportes sobre las mismas, es tambin una tarea comn en
los sistemas de informacin basados en bases de datos.
Lo bueno es que se tiene un folder o pestaa llamada QReport cargada de componentes
visuales especializados en la impresin de reportes, esta librera de componentes, no es
hecha por Borland, es hecha por una compaa llamada QSOFT&trade;
QReport
Practica para construir un reporte que contiene la cdula de un y solamente un cliente de
la tabla de clientes.
Los componentes y propiedades a usar son:
1.- Table1
* DataBaseName = c:\datos * TableName = Clientes.db * Active = true * Filter =
ClaveCliente = 2 (observar que aqu es donde se determina
cual cliente se imprime)

* Filtered = true
2.- QuickRep1, se encuentra en pestaa QReport.
Es el componente principal para impresin.
Toma la forma y tamao de una hoja de impresora dentro de Form1.
Sus propiedades a usar son:
* Dataset = Table1 * Zoom = 50
3.- QRShape1
Se usara para crear un rectngulo para encabezados de la cdula de un cliente.
Son varios tipos o formas las que existen de QRShape, rectngulos, lneas, crculos, etc.,
rectngulo es default, y la propiedad para cambiar de forma es Shape.
Acomodarlo y expanderlo en la parte superior de la hoja de impresin (QickRep1).

Sus propiedades a usar son:


- +Pen = Click en signo + y poner:
Color = clgreen
Width = 5
4.- QRLabel1
Similar a label, contienen textos o mensajes estticos.
Colocarlo dentro del rectngulo o seccin de encabezado.
Propiedades:
+Font = dar color y tamao de font
5.- QRSysData1
Componente especiales que contienen datos fijos de impresin, tales como numero de
pagina, fecha, hora, etc.
Colocarlo tambin dentro de la seccin o banda de encabezado.
propiedades:
6.- QRSysData2
Otro del anterior, colocarlo dentro de la banda de encabezado, propiedad
7.- QRShape2
Con este se forma ahora un seccin, rectngulo o banda principal.
Cuando un reporte, imprime mas de un rengln, por ejemplo todos los clientes, esta
parte de la hoja recibe el nombre de banda de detalle.
Propiedades:
- +Pen = darle color y tamao(Width) apropiados.
8.- QRLabel###
Colocar varios dentro de la banda de detalle, con caption apropiado, ejemplo, clave,
nombre, foto, etc.
9.- QRDBText1

Componente para desplegar cada dato de una celda o campo o columna de una tabla, es
similar a DBEdit pero es esttico, es decir solo despliega.
Se debern poner tantos componentes QRDBText en esta banda o seccin de detalle,
como columnas de datos existan o se quieran desplegar de la tabla.
Propiedades:
* Dataset = Table1 * DataField = seleccionar columna apropiada * Font = color,
tamao, 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 tambin pueda
desplegar e imprimir un marco apropiado.
2.- Para ir desplegando un Preview de impresin al tiempo del diseo del reporte, solo
dobleclick dentro de la hoja de impresin (QuickRep) para que aparezca una ventana de
Preview de impresin.
3.- La CIA Qsoft, ya tiene a la venta QReport V3.0 que ya trae incorporado
WYSWYNG.
4.- Para Preview o impresin en tiempo de ejecucin, solo aadir un botn de ordenes
OK, y usar solo una de las siguientes instrucciones:
OnClickButton1() {
QuickRep1Preview();
o QuickRep1Print();

solo una de las dos } ejemplo: a)Pantalla de diseo

b)Programa:

void __fastcall TForm1::Button1Click(TObject *Sender)


{
QuickRep1Preview();
}
//
c)Pantalla de corrida:

Como ya se indico la versin 3 de QReport ya trae incorporado WYSYNG.

d)Pantalla de Preview durante ejecucin:

TAREAS PROGRAMACION C++BUILDER


1.- REPORTE CON UN AUTO DE LA TABLA DE AUTOS
2.- REPORTE DE UN PROVEEDOR, DE LA TABLA DE PROVEEDORES, PERO
EL USUARIO SELECCIONA EL FILTRO O LA CLAVE DEL PROVEEDOR
( CONSTRUIR DOS PANTALLAS, UNA CON EL FILTRO Y BOTON DE
IMPRESION O PREVIEW Y LA SEGUNDA CON EL REPORTE).

14.- IMPRESION DE TODA LA TABLA C++BUILDER

Imprimir toda la tabla significa muchas hojas de impresora.


Primero se deber quitar el filtro en la tabla y segundo entender lo que tienen en comn
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 compaa, el titulo y propsito 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 estn en la hoja, repito
necesitamos un encabezado para columnas y que aparezca en todas las paginas.
Probablemente, en la hoja final, seria conveniente aadir algunos contadores y
acumuladores, por ejemplo la cantidad de renglones, algn acumulado de alguna
columna numrica en especial, etc.
QReport, usa este modelo de bandas para la construccin de reportes, es decir, en la
practica anterior se uso un componente QRShape, para dividir el reporte en dos partes,
secciones o bandas, pero QReport trae incorporado un componente llamado QRBand
que permite dividir en partes, secciones o bandas todo el reporte.
Este componente QRBand, en su propiedad BandType, permite construir los siguientes
seis tipos importantes de banda.
BANDA NOTAS

PAGE HEADER Banda de encabezados de paginas.


Aparece en todas las hojas impresas.
Poner dentro componentes para numero de pagina, etc.
TITLE Banda de Titulo o encabezados del Reporte.
Solo aparece en la primera hoja impresa.
Poner componentes qrlabel con el nombre de la compaa, el propsito de la tabla,
fecha, etc.
COLUMM HEADER Banda de o para encabezados de columnas.
Aparece en todas las hojas impresas.
Poner dentro componentes qrlabel con el encabezado que lleva cada columna de la
tabla.
DETAIL Banda de detalle.
Es la mas importante, porque es la que contiene los datos de los renglones de la tabla.
Es la que constituye el grueso de las hojas impresas.
Solo colocar dentro de esta banda los componentes de datos impresos, QRDBText y
QRDBImage
SUMMARY Banda de resumen.

Solo aparece en la hoja final de impresin.


Poner dentro de ella componentes de operaciones como es QRExpr y estudiarlo en la
ayuda, para conocer sus mtodos (funciones) y aplicarlas.
PAGE FOOTER Banda de pie de pagina.
Aparece en todas las hojas impresas.
Su funcin es similar a la banda de encabezado.
De hecho, en un reporte solo se usa la b banda de encabezado o la banda de pie de
pagina, pero no las dos.
Solo poner dentro de esta banda, componentes de numero de pagina, o de fechas, o de
hora, etc.

Lo mas importante a tomar en cuenta es cada componente QRBand que se ponga dentro
de un reporte, se deber definir usando su propiedad BandType, como una cualquiera de
los seis tipos de bandas, es decir,
En general el procedimiento completo es:
1.-Poner un componente Table en la forma y nadamas cargarle sus tres propiedades
bsicas( no usar filtros).
2.-Poner un Componente QuickRep( es la hoja de impresin) y cargarle las propiedades
ya descritas en procedimiento de impresin anterior.
3.- Colocar y expandir un primer componente QRBand dentro del componente
QuickRep y primero asociarle el tipo de banda que representa, por ejemplo de
encabezado o de titulo, recordar que un reporte no necesariamente tiene que llevar las
seis bandas.
A este componente QRBand, cambiarle propiedades de font, frame, color, etc.
4.- Colocar dentro del componente QRBand1, los componentes necesarios y apropiados
como se indico en el cuadro anterior de bandas y significados, por ejemplo QRLabel,
etc.
5.-Colocar otro componente QRBand en la hoja de impresin, expanderlo y definirlo
como banda de titulo o banda de encabezado de columnas, etc.
6.-Repetir los pasos anteriores, hasta completar todas las bandas.
7.- Colocar un botn de ordenes OK, y asociarle el cdigo de Preview o de impresin.
TAREAS PROGRAMACION C++BUILDER

1.- Desplegar la tabla de Productos, y agregar un botn de impresin de tabla ( son dos
formas una con la tabla y su navegador y la segunda es la forma de reporte) no olvidar
Include File Unit.
15.- MODELO RELACIONAL DE DATOS C++BUILDER

Entre dos tablas bsicas o tablas simples cualesquiera, se debe y puede buscar,
identificar y establecer una o varias relaciones entre ellas, ejemplo;
tabla Clientes tabla Productos
tabla Autos tabla TALLERES MECANICOS
R1= El auto ingresa al taller
R2= El auto es diagnosticado en el taller
R3= El auto es reparado en el taller
R4= El auto sale del taller
Una relacin simple es la unin o combinacin de dos tablas bsicas mediante una y
solo una accin, hecho o conducta especifica.
Entindase 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 tambin 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 reparacin 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 informacin cualesquiera cada una de las relaciones genera
una tabla especial llamada de relacin, pero tambin genera en muchos casos un
documento especifico, por ejemplo el cliente compra al contado productos genera la
tabla de relacin y el documento llamado Factura, en la relacin el auto ingresa al
taller se genera la tabla de relacin y/o documento llamado ORDEN DE ENTRADA,
en la relacin el cliente aparta productos se genera la tabla de relacin y/o documento
llamado NOTA O RECIBO DE APARTADO, etc.
Existirn casos o relaciones donde ser casi imposible identificar o nombrar el
documento o relacin existente, para resolver este problema, existen dos soluciones
bsicas, 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 tambin posible no crear documento alguno, solo llamar a esta relacin

con el nombre de las dos tablas, por ejemplo rel perros/gatos, rel clientes/productos, etc.
( aunque no es recomendable o muy explicativo).
Igualmente es muy recomendable,, al describir un proceso cualquiera y su conjunto de
relaciones, no usar o buscar relaciones muy abstractas, porque ser casi imposible
pasarlas a un modelo de informacin implementado en computadora, por ejemplo la
relacin al cliente le gustan los autos, por ejemplo los perros corretean gatos, etctera.
En resumen las relaciones y en general el proceso deben de ser simples, y documentales.
Para terminar de complicar las cosas un modelo completo de informacin, no se
construye con dos tablas bsicas, un par de procesos y una cuantas relaciones o
documentos, el modelo completo incluye un montn de tablas bsicas, otro montn de
procesos diferentes entre ellas, y cada proceso contiene un conjunto amplio de
relaciones.
Por ejemplo en una Empresa de AUTOREFACCIONES, fcilmente se encuentran las
tablas bsicas, de clientes, mecnicos, proveedores, partes, proceso de ventas al publico,
proceso de compras a proveedores, etctera y cada proceso con su propio conjunto de
relaciones y o documentos.
TAREAS PROGRAMACION C++BUILDER
1.- PARA UNA EMPRESA DE VIDEO, IDENTIFICAR SUS TRES TABLAS MAS
BASICAS , SUS DOS PROCESOS MAS IMPORTANTES Y CUANDO MENOS
CINCO RELACIONES EN CADA PROCESO.
2.- CONSTRUIR UN MODELO DE TRES TABLAS BASICAS, DOS PROCESOS Y
CUATRO RELACIONES PARA UNA CASA DE EMPEO.
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 RELACINALES PARA SU IMPLEMENTACION.
16.- TIPOS DE RELACIONES C++BUILDER

Analizando a fondo, la mayora de las relaciones y sus documentos son del tipo llamado
1:M ( uno a muchos), es decir cada tabla de relacin o documento contiene un rengln
de la primera tabla y muchos renglones de la segunda tabla, por ejemplo en una factura
solo hay o se encuentra, un cliente y muchos productos, en una receta por ejemplo solo
hay un paciente pero hay muchas medicinas, en una orden de compra o de pedido hay
un solo proveedor pero hay muchos productos y as sucesivamente.
En general existen los siguientes tipos de relaciones:
Repitiendo el caso mas comn de relaciones, son las de 1:M, en este caso, solamente la
tabla de relacin no permite resolver el problema de informacin, en casos de relaciones
1:M se ocupara una segunda tabla llamada detalle-relacin.

El modelo completo de tablas para una y solamente una relacin de tipo 1:M es;
tabla de 1(uno) tabla de M(muchos)
- Clave de uno - Clave de muchos
- otros campos - otros campos
tabla de R(relacin) tabla detallerelacion
- Clave de relacin - Clave de relacin
- Clave de uno - Clave de muchos
- otros campos - otros campos
Este es el modelo principal de una base de datos relacional y se deber siempre aplicar
cuando se tenga que construir una base de datos que tenga una relacin 1:M.
Ejemplo;
Clientes(1) Productos (M)
Facturas(relacin) DetalleFactura (detallerelacin)
Clave Factura Clave Factura
Clave Cliente Clave Producto
Fecha Factura Cantidad Producto
etctera Factura Etctera
ejemplo;
Pacientes (1) Medicinas (muchos)
Recetas (relacin) DetalleReceta
Como se observa en los dos ejemplos, las tres claves ( la de uno, la de muchos y la de
relacin) solo se repiten una sola vez en otra tabla.
De nuevo un problema o sistema de informacin, que descansa en una base de datos de
tipo relacional, y solo contiene una relacin de tipo 1:M ocupa cuatro tablas ( la de uno,
la de muchos, la de relacin y la de detalle-relacion).
Si el problema incluye una segunda relacin 1:M por ejemplo NotaDeVentaque se
deriva de las mismas dos tablas bsicas, entonces el modelo completo se resuelve con
seis tablas ( las dos bsicas, las dos de relacin y las dos de detalle) y as sucesivamente.

Como se dijo anteriormente un problema sencillo de informacin por ejemplo el de una


tienda de vdeo, ocupa unas cuatro o cinco tablas bsicas, unos dos o tres procesos y
cada proceso dos o tres relaciones mnimo, 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 tambin en la
tabla de relacin la clave de muchos.
El caso de relaciones 1:Cte tambin se resuelve con tres tablas, solo agregar en la tabla
de relaciones tantas claves de la tabla de constantes como constantes existan en la
relacin, por ejemplo si la relacin 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 tendra clave alumno, clave materia1, clave materia2, clave materia3.
El caso de relaciones M:M solo se resuelve localizando o identificando o de plano
construyendo, la dos relaciones 1:M originales de donde sali este documento, por
ejemplo en el informe al gobierno de todos los distribuidores de equipo de computo y
todos los equipos que compraron en el mes, es probable que este informe se construya
con las tablas de relaciones de facturas y notas de ventas.
TAREAS PROGRAMACION C++BUILDER
1.- CONSTRUIR EL MODELO DE LAS CUATRO TABLAS PARA LA RELACION
EL CLIENTE COMPRA A CREDITO PARTES O REFACCIONES EN LA
REFACCIONARA.
2.- CONSTRUIR EL MODELO DEL CLIENTE APARTA JOYAS EN UNA
JOYERIA.
3.- CONSTRUIR EL MODELO COMPLETO DE CLIENTES Y PELICULAS CON
LAS RELACIONES, RENTA PELICULAS, DEVUELVE PELICULAS, DAA
PELICULAS, COMPRA PELICULAS.
4.- CONSIDERANDO EL PROBLEMA DE LOTES DE AUTOS, AUTOS,
CLIENTES, TALLERES CONSTRUIR MODELO PARA LOS PROCESOS DE
COMPRA DE AUTOS, Y RESTAURACION DE AUTOS( ES CUANDO EL LOTE
COMPRA LOS AUTOS Y LES DA UNA ARREGLADA PARA SU VENTA).
17.- C++BUILDER MODELO RELACIONAL Y DATABASE DESKTOP

El modelo relacional completo, antes de traspasarlo al DataBase DESKTOP, debe


incluir todo lo siguiente:
tabla de uno
* Clave de Uno S, P* (S = ISuno ) * otros
tabla de muchos

* Clave de Muchos S, P* (S = ISmuchos) * otros


tabla de relacin
* Clave Relacin S, P* (S = ISrelacion) * Clave de Uno S, IR (S = ISReluno)
* otros
tabla de detalle
* Clave Relacin C*,S,IR (S = Isdetrel IR = IRDetrel) * Clave Muchos C*,S,IR (S =
ISDetmuchos IR = IRDetmuchos) * otros
notas:
P* , significa que dicho campo es una clave o llave primaria, en DataBase Desktop,
recordar que solo se ocupa un click en la columna llamada KEY para que aparezca la *
C* , se conocen como claves o llaves compuestas, para crear una clave o llave
compuesta solo marcar con *, los dos campos involucrados
S, es un llamado ndice secundario ( secondary ndex), se usa para dar un orden o
clasificacin 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 telfonos, 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.
Prrafos 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 relacin y la tabla de uno, en el caso de Facturas y Clientes,
garantiza que no se pueda capturar la clave de un cliente cualesquiera, si este cliente no
existe o esta dado de alta en la tabla de clientes.
Otra vez la IR entre la tabla de detalle y la tabla de muchos, en el caso de
DETALLEFACTURA y PRODUCTOS, garantiza que no se pueda capturar la clave de
un producto, en la tabla de detalle, si este producto no existe, en la tabla de relacin y
as sucesivamente.
(IR = IRReluno) es el nombre que se le va a asignar a la relacin, para el ejemplo que se
esta siguiendo se llamara IRFacturaCliente, y as sucesivamente.
El procedimiento para crear un ndice secundario (S) dentro del DataBase Desktop es:

A)Tools, Utilities, Restructure y seleccionar tabla a indexar.


B)Click en ComboBox de la derecha, hasta que aparezca y seleccionar la opcin
Secondary Indexes.
C)Click abajo en botn Define.
D)Aparece ahora el siguiente editor de ndices:

E)Solo seleccionar el campo o atributo a indexar y luego click en flecha negra ADD
para que pase a la segunda ventana, luego click en OK.
F)DD pregunta ahora por el nombre del ndice mediante la siguiente ventana:

G)Escribir el nombre ya propuesto por ejemplo ISNomProducto y click en OK.


H)DD regresa ahora ala tabla principal, click en botn SAVE para grabarla con los
nuevos cambios.
I) Cerrar la tabla, con click en X arriba.
J) Repetir los pasos desde inciso A, para construir los ndices de las otras tablas.
El Procedimiento para crear las integridades referenciales es:

1.- Tools, Utilities, Restructure y seleccionar tabla a construirle la integridad referencial.


2.- Click en ComboBox de la derecha, hasta que aparezca y seleccionar la opcin
Referential Integrity.
3.- Click abajo en botn Define.
4.- Aparece ahora el siguiente editor:

5.- En la primera ventana estn todos los campos de la tabla a enlazar (factura) solo
doble click en el campo de enlace (Clave Cliente) y observar que se pase a la ventana
chica.
6.- En la segunda ventana estn 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
tambin pasa a la ventanilla izquierda, como se observa en la grfica 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 rengln, si dicho rengln de informacin, no existe en la tabla enlazada.
8.- Para terminar este proceso solo click en el botn OK.
9.- DD pregunta ahora por el nombre que tendr, esta integridad referencial o enlace
usando la siguiente ventana:

10.-Escribir el nombre ya propuesto por ejemplo IRFacturaCliente, en este ejemplo, se


esta simbolizando un enlace de la tabla de factura hacia la tabla de cliente, usando el
campo comn en ambas de Clave Cliente.
11.-DD regresa ahora a la tabla principal, click en botn SAVE para grabarla con los
nuevos cambios.
12.-Cerrar la tabla, con click en X arriba.
13.-Repetir los pasos desde inciso A, para construir los enlaces o integridad referencial
con las otras tablas.
Como una nota u observacin 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 estn repetidos dos veces, y dos de
ellos siempre estn 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 relacin
y dos veces con la tabla de detalle).

5.- Abrir e ir cargando las tablas tambin en orden (1,M,R,D) para capturarles unos
cuantos renglones de pruebas.
TAREAS PROGRAMACION C++BUILDER
1.- CONSTRUIR Y CARGAR EN DATABASE DESKTOP LA RELACION
RECETA(SON CUATRO TABLAS).
2.- CONSTRUIR Y CARGAR EN DATABASE DESKTOP LA RELACION ORDEN
DE COMPRA.
3.- CONSTRUIR EN DATABASE DESKTOP LA RELACION DE LA NOTA DE
RENTA DE PELICULA.
4.- CONSTRUIR EN DATABASE DESKTOP LA RELACION RECIBO DE RENTA(
AQUI SOLO SON TRES TABLAS Y EXISTE TAMBIEN UNA IR O ENLACE DE
RECIBO A DEPARTAMENTOS).
18.- APLICACIONES CON TABLA DE RELACION C++BUILDER

Es tiempo ahora de construir la aplicacin 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 relacin, las dos primeras de
ellas son construidas usando aplicaciones normales por rengln y por tabla, como se
realizo en los primeros temas del capitulo, es recomendacin y sugerencia que la tabla
de uno se construya usando el formato de rengln y la tabla de muchos se construya
usando el formato de tabla(DBGrid).
En cuanto a la aplicacin a construir con la tabla de relacin, tambin dentro de C+
+Builder se debe construir los enlaces con las tablas ya descritas, con los siguientes
considerandos ;
T1-->TR ; TM-->TDET ; TDET-->TREL
Ej. 1) CTE-->FACTURA ; PROD-->DETFAC ; DETFACT-->FACT
ej. 2) PAC-->RECETA ; MED-->DETREC ; DETREC-->RECETA

OBSERVAR Y TOMAR EN CUENTA COMO Y DE DONDE HACIA DONDE SE


GENERAN LOS TRES ENLACES DENTRO de C++BUILDER.
Tomar nota de las diferencias entre los enlaces en DD y en C++Builder.
Estos enlaces se hacen usando dos propiedades extras en los componentes Table dentro
del C++Builder, propiedades que se explican y demuestran mas adelante.

Recordar ademas, que es en la primera tabla de cada uno de estos tres tipos de enlaces.
donde se establece la relacin de enlace o donde se manipula la propiedad
correspondiente.
Para construir una aplicacin para la tabla de relacin:
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 relacin,
descansa y ocupa las cuatro tablas.
2.- Estos cuatro componentes Table se colocaran y usaran en el siquiente orden para el
ejercicio de aplicacin:
Table1 Tabla de uno (ej. clientes)
Table2 Tabla de muchos (ej. productos)
Table3 Tabla de relacin (ej. facturas)
Table4 Tabla de detalle (ej. detallefactura)
3) Igualmente se ocupan cuatro componentes DataSource en el mismo orden, es decir
DataSource1 apunta a Table1, DS2 a T2, y as sucesivamente.
4.- La Forma que contiene la tabla de relacin se organiza usando tres componentes
Panel para su mejor distribucin, estos componentes Panel, se construyen y contienen:

DBNav1(DS3) Nva Fact


DBEdit(DS3)

Panel de uno
Cve Cte Nom Cte Dir Cte etc.Cte NVO Cte
DBEdit DBEdit DBEdit DBEdit Buttonl
(DS3) (DS1) (DS1) (DS1)

Panel de detalle
NUM Prod. Nom Prod. etc. Prod.
DBEdit DBEdit DBEdit
(DS4) (DS2) (DS2)

DDBNav2(DS4)

Notas:
1.- Es muy importante que se respete el tipo de componente que va dentro de cada panel
y mas importante an que dichos componentes apunten a el DataSource indicado entre
parntesis.
2.- Igualmente es muy importante, el siguiente cdigo 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 relacin y su DataSource3 correspondiente, generalmente es la
clave relacin o fecha, en particular seria el ultimo componente que se tenga apuntado a
DS3, es en este componente, donde se debe usar:
OnExitDBEdit#() { Table3Refresh();}
Esta instruccin actualiza los datos o rengln de la tabla de relacin, antes que la tabla
de detalle, haga una bsqueda, dentro de la tabla de relacin.
3.- El cdigo de los tres botones de ordenes, es el siguiente:
OnClickButton1(){
//ocultar la pantalla de factura y desplegar o llamar la pantalla de
clientes
}
OnClickButton2(){
Table4->Insert();
// para insertar un nuevo rengln en tabla de detalle
}
OnClickButton3(){
// primero operaciones pertinentes si es que existen y
// al final cerrar con la instruccin
Table4->Refresh();
// para cargar en disco el ultimo rengln de la tabla
// de detalle
}
\

4.- Como se observa los mtodos Insert() y Refresh(), usados se derivan y se pueden
sustituir con DDBnavegadores y sus botones visibles correspondientes, pero se debe
buscar que el usuario los presione en el momento indicado.
5.- Este esquema se puede aplicar a cualquier tabla relacional(recetas, ordenes de
compra, solicitudes de servicios, etc.) solo realizar los ajustes correspondientes.
PROCEDIMIENTO PARA CONSTRUCCION DE TABLA RELACIONAL
1.- CARGAR C++Builder.
2.- PONER LOS CUATRO COMPONENTES TABLE EN LA FORMA, Y
CARGARLES SUS TRES PROPIEDADES BASICAS(DATABASENAME,
TableName, Active),RESPETANDO EL ORDEN SUGERIDO (Table1Tabla de uno,
Table2Tabla de muchos, Table3Tabla de relacin, Table4Tabla de detalle).
3.- PONER LOS CUATRO COMPONENTES DataSource QUE SE OCUPAN Y
APUNTARLOS A SU TABLA CORRESPONDIENTE EN ORDEN, ES DECIR
DS1TABLE1, DS2Table2, DS3Table3, DS4Table4, USANDO LA
PROPIEDAD DATASET DEL COMPONENTE DataSource.
4.- ARMAR Y CARGAR LOS TRES ENLACES ENTRE TABLAS YA SUGERIDOS,
ESTO ES T1TR, 2) TM TDET, 3) TDETTREL, 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, T1TR.
1. SELECCIONAR LA TABLA DE CLIENTES ( LA DE UNO)
2. CLICK A UN LADO DE LA PROPIEDAD MASTERSOURCE Y SELECCIONAR
DATASOURCE3( QUE ES LA DE RELACION O FACTURA) CLICK A UN LADO
EN LA PROPIEDAD MASTERFIELD (DONDE ESTAN LOS TRES PUNTILLOS) Y
SALE EL SIGUIENTE EDITOR DE CAMPOS DE ENLACE:

3.

4. OBSERVAR QUE EN LA PRIMERA VENTANA ESTA EL CAMPO DE ENLACE


DE LA TABLA DE UNO, Y EN LA SEGUNDA ESTAN TODOS LOS CAMPOS
POSIBLES A ENLAZAR DE LA TABLA DE RELACION( FACTURA)
5. COMO SE VAN A ENLAZAR AMBAS USANDO EL MISMO CAMPO (CLAVE
CLIENTE), SELECCIONAR (CLICK) ESTE MISMO CAMPO (CLAVE CLIENTE)
EN LAS DOS VENTANAS Y LUEGO CLICK EN BOTON ADD, EL ENLACE
DEBE APARECER EN LA VENTANA DE ABAJO, COMO SE MUESTRA EN LA
SIGUIENTE GRAFICA:

6.
7. LUEGO CLICK EN BOTON OK PARA FINALIZAR EL PROCESO
5.- EL PROCEDIMIENTO ANTERIOR 4.1) A 4.6) SE DEBERA REPETIR PARA
LOS DOS CASOS RESTANTES(TMTDET, TDETTREL).
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 DISEO

1. CODIGO
//--------------------------------------------------void __fastcall TForm1::Button1Click(TObject *Sender)
{ // En esta parte se oculta la ventana de factura
// y se llama la ventana de cliente
}
//-------------------------------------------------void __fastcall TForm1::DBEdit3Exit(TObject *Sender)
{ Table3->Refresh();
}
//--------------------------------------------------void __fastcall TForm1::Button2Click(TObject *Sender)
{
Table4->Insert();
}
//--------------------------------------------------void __fastcall TForm1::Button3Click(TObject *Sender)
{
// operaciones y terminar con:

Table4->Refresh();
}
//---------------------------------------------------

PANTALLA DE EJECUCION

TAREAS PROGRAMACION C++BUILDER


1.- CONSTRUIR UN MENU QUE CONTENGA Y LLAME LAS TABLAS
CLIENTES, PELICULAS Y RECIBO DE RENTA DE UNA VIDEOTIENDA
2.- CONSTRUIR UN MENU QUE CONTENGA Y LLAME LAS TABLAS
PACIENTES, MEDICINAS Y RECETAS DE UNA FARMACIA
3.- CONSTRUIR UN MENU QUE CONTENGA Y LLAME LAS TABLAS
PROVEEDOR, PRODUCTOS Y ORDEN DE COMPRA DE UNA
REFACCIONARIA
http://www.programacionfacil.com/cpp_builder/start

TEMA 9 CREACION DE COMPONENTES NO VISUALES C++BUILDER

En este temas se analiza, la creacin y construccin de componentes no visuales.

La necesidad de este tipo de componentes se desprende del hecho de que existen


muchas tareas de programacin de carcter repetitivo a lo largo de la construccin de
muchas aplicaciones, por ejemplo se manejan en 10 programas, o tareas o aplicaciones
distintas el mismo conjunto de tres frmulas matemticas o financieras, etc.
En caso como estos, es mas conveniente crear un componente especializado en solucin
de dichas frmulas y estarlo reutilizando en las diversas aplicaciones que lo ocupen.
Para realizar esto primero diseamos la clase correspondiente, tal como el ejemplo de
clases en paginas anteriores:
// declaracin de la clase, sus variables y sus mtodos
Class frmulas
{
int areatriangulo( int base, int altura);
float pesosdolares (int pesos, float tipocambio);
double promedio(int calif1, int calif2);
}
// implementacion de los mtodos de la clase
int formulas::areatriangulo(int base, int altura)
{ return base* altura /2 ;}
float formulas::pesosdolares(int pesos, float tipocambio)
{ return pesos/tipocambio; }
double formulas::promedio(int calif1, int calif2)
{return (calif1+calif2)/2.0 ;}

La pasamos ahora al C++Builder, el procedimiento comentado es:


Procedimiento:
1.- File, Close All
2.- Componente New,
Clase Name = frmulas
Ancestor = TComponent
Page = Standard

* Observar que todo clase no visual, se deriva de TComponent, con esto se asegura un
mnimo visual de propiedades, incluyendo un icono de default, para la barra de
componentes y un par de eventos, los mtodos de la clase es lo que se va a construir y
programar.
3.- File Save As, frmulas, Save
4.- A la vista queda el editor con formulas.cpp , en la parte de arriba donde dice
#include <formulas.h>, poner cursor encima y click derecho para el popupmenu,
seleccionar la primera opcin, de open source/header file, y con esto ya se tendrn 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 mtodos quedan en el archivo
formulas.cpp, como observacin 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 declaracin
y su implementacin.
Observar el cdigo ya generado por C++Builder de formulas.h;
//---------------------------------------------------------#ifndef formulasH
#define formulasH
//---------------------------------------------------------#include <vcl\SysUtils.hpp>
#include <vcl\Controls.hpp>
#include <vcl\Classes.hpp>
#include <vcl\Forms.hpp>
//---------------------------------------------------------class frmulas : public TComponent
{
prvate:
protected:
public:
__fastcall frmulas(TComponent* Owner);
__published:
};
//----------------------------------------------------------

#endif

1.- Recordar que es en este archivo el .h donde se hace la declaracin 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 dems componentes puedan
accesar las propiedades y mtodos de la clase Frmulas.
3.- Variables, mtodos( procedimientos y funciones) y propiedades que ocupe la clase
frmulas debern declararse dentro de la llaves.
4.- Tomar nota que pueden existir cuatro tipos diferente de variables, mtodos y
propiedades, ellos son:
prvate: solo mtodos dentro de la propia clase, tienen
acceso y pueden manipularlos.
protected: No pueden ser accesados por cdigo fuera de la la clase, pero si por mtodos
de la propia clase.
public: Cdigo externo, otras clases y mtodos propios pueden accesarlos.
_published: Solo para propiedades que se quiera que aparezcan en el inspector de
objetos.
5.- Para el ejemplo de la clase que se esta manejando, se escriben o mejor dicho
declaran los mtodos en la parte publica de la clase, como en el siguiente ejemplo
//---------------------------------------------------------------#ifndef formulasH
#define formulasH
//---------------------------------------------------------------#include <vcl\SysUtils.hpp>
#include <vcl\Controls.hpp>
#include <vcl\Classes.hpp>
#include <vcl\Forms.hpp>
//---------------------------------------------------------------class frmulas : public TComponent
{
prvate:

protected:
public:
__fastcall frmulas(TComponent* Owner);
int areatriangulo( int base, int altura);
float pesosdolares (int pesos, float tipocambio);
double promedio(int calif1, int calif2);
__published:
};
//---------------------------------------------------------------#endif

6.- La parte de implementacion, se escribe al final del archivo .cpp, como se muestra en
el siguiente ejemplo.
//---------------------------------------------------------------#include <vcl\vcl.h>
#pragma hdrstop
#include "formulas.h"
//---------------------------------------------------------------static inline frmulas *ValidCtrCheck()
{
return new frmulas(NULL);
}
//---------------------------------------------------------------__fastcall formulas::formulas(TComponent* Owner):TComponent(Owner)
{
}
//---------------------------------------------------------------namespace Frmulas
{
void __fastcall Register()
{

TComponentClass classes[1] = {__classid(frmulas)};


RegisterComponents("Standard", classes, 0);
}
}
//---------------------------------------------------------------// implementacion de los mtodos de la clase
int formulas::areatriangulo(int base, int altura)
{ return base* altura /2 ;}
float formulas::pesosdolares(int pesos, float tipocambio)
{ return pesos/tipocambio; }
double formulas::promedio(int calif1, int calif2)
{return (calif1+calif2)/2.0 ;}

* Solo se escriben los ltimos renglones y en la posicin indicada, es decir al final del
archivo .cpp
7.- Files, Save All
8.- File, Close All
9.- Component, Install, Add, Browse, formulas.cpp, Open, Ok hasta
que Done=Make, entonces OK
* Observar el nuevo icono de frmulas
Ejemplo de aplicacin:
1. Pantalla de Diseo:

en la barra de componentes.

b) Cdigo
//---------------------------------------------------------------void __fastcall TForm1::Button1Click(TObject *Sender)
{
Edit3->Text=formulas1->promedio(Edit1->Text.ToInt(),
Edit2->Text.ToInt() );
}
//----------------------------------------------------------------

3. Pantalla de corrida

TEMA 2 OBJETOS CONCURRENTES C++BUILDER

La buena noticia, C++Builder ya trae incorporado un objeto de tipo concurrente llamado


Thread object, que pertenece a la clase TThread ( ver en ayuda sus propiedades y
mtodos)
Se analiza el objeto Thread en su perspectiva mas simple y se anexan comentarios para
su comprensin:
Procedimiento:
1.- File, Close All
2.- File, New, Thread Object class name = proceso1
3.- File, Save As
- abrir folder tarea1
- proceso1
4.- Click derecho en donde dice #include proceso1.h y open source/header, para tener
a la vista los dos archivos normales de un componente proceso1.cpp y proceso1.h
* Observar que este objeto, crea una clase llamada proceso1 derivada de la clase
Thread.
* Esto tambin significa que en proceso1.h se almacena la declaracin o definicin de la
nueva clase proceso1 y que en el archivo proceso1.cpp se almacenara la

implementacin de los mtodos que contenga la clase proceso1, tal como se analizo en
la
UNIDAD de componentes.
5.- El Cdigo de proceso1.h es;
//---------------------------------------------------------#ifndef proceso1H
#define proceso1H
//---------------------------------------------------------#include <vcl\Classes.hpp>
//---------------------------------------------------------class proceso1 : public TThread
{
prvate:
protected:
void __fastcall Execute();
public:
__fastcall proceso1(bool CreateSuspended);
};
//---------------------------------------------------------#endif

* Una clase proceso1 descendiente de la clase TThread, no hay sorpresas aqu.


* Un mtodo protegido llamado Execute(), este mtodo es muy importante porque
cuando se crea una instancia de la clase proceso1, todo el cdigo que contiene es
ejecutado automticamente, en otras palabras, es dentro de este mtodo donde se coloca
el cdigo del proceso ( en el archivo de implementacin).
* El constructor proceso1, lleva como parmetro una variable booleana es decir con
valor true o valor false.
* Adems el propio constructor como se observa en el cdigo crea el proceso, pero el
hilo lo tiene suspendido, en cuanto se active o contine el proceso, este constructor
llama o activa el mtodo Execute().
6.- El cdigo de proceso1.cpp es:

//---------------------------------------------------------#include <vcl\vcl.h>
#pragma hdrstop
#include "proceso1.h"
//---------------------------------------------------------// Important: Methods and properties of objects in VCL can
// only be used in a method called using Synchronize, for // //
example:
//
// Synchronize(UpdateCaption);
//
// where UpdateCaption could look like:
//
// void __fastcall proceso1::UpdateCaption()
// {
// Form1->Caption = "Updated in a thread";
// }
//---------------------------------------------------------__fastcall proceso1::proceso1(bool CreateSuspended)
: TThread(CreateSuspended)
{
}
//---------------------------------------------------------void __fastcall proceso1::Execute()
{
//---- Place thread code here ---}
//---------------------------------------------------------

* No hay muchas sorpresas, solo la implementacin de los dos mtodos que contiene la
clase:

1.- El constructor proceso1, con su parmetro


2.- El mtodo Execute() que deber contener el cdigo del proceso y que se activara
cuando se resuma o se pida que se contine el proceso.
* Pero si existen unos comentarios o recomendaciones muy importantes que siempre
debern tenerse en cuenta.
El resumen de la recomendacin es que nunca se deber poner dentro del cdigo del
mtodo Execute(), ninguna instruccin que referencie directamente un componente de
VCL, incluyendo Form1 o cualquier componente visual.
* Si el Mtodo Execute(), necesita procesar cualquier elemento o componente visual,
deber hacer una llamada a un segundo mtodo que si podr manipular directamente la
forma o el componente necesitado, y adems la llamada de Execute() al segundo
mtodo, deber ser dentro de un mtodo especial de Execute(), llamado
Synchronize(segundo mtodo).
* 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
actualizacin no puede hacerse directamente dentro del mtodo Execute(), en su lugar
Execute(), hace un llamado a otro mtodo(UpdateCaption) de la clase, para que este
ultimo mtodo lo actualice.
Se construye el primer programa concurrente, usando el ejemplo que esta en el
comentario.
Procedimiento:
1.- Crear el Thread Object, grabarlo como se indico, y cargar a la vista los dos archivos,
proceso1.h y proceso1.cpp
2.- Modificar los cdigos con las siguientes instrucciones:
2.1.- proceso1.h
//---------------------------------------------------------#ifndef proceso1H
#define proceso1H
//---------------------------------------------------------#include <vcl\Classes.hpp>
//---------------------------------------------------------class proceso1 : public TThread
{

prvate:
protected:
void __fastcall UpdateCaption();
void __fastcall Execute();
public:
__fastcall proceso1(bool CreateSuspended);
};
//---------------------------------------------------------#endif

* Observar que como se ocupa un segundo mtodo especializado, en accesar


componentes visuales, se tiene que declarar dentro de la clase, ya sea en su parte
protegida o en su parte publica.
2.2.- proceso1.cpp
//---------------------------------------------------------#include <vcl\vcl.h>
#pragma hdrstop
#include "proceso1.h"
//---------------------------------------------------------// Important: Methods and properties of objects in VCL can // only be
used in a method called using Synchronize, for // example:
//
// Synchronize(UpdateCaption);
//
// where UpdateCaption could look like:
//
// void __fastcall proceso1::UpdateCaption()
// {
// Form1->Caption = "Updated in a thread";
// }
//---------------------------------------------------------__fastcall proceso1::proceso1(bool CreateSuspended)

: TThread(CreateSuspended)
{ }
//---------------------------------------------------------void __fastcall proceso1::Execute()
{
//---- Place thread code here ---Synchronize(UpdateCaption);
}
//---------------------------------------------------------void __fastcall proceso1::UpdateCaption()
{
Form1->Caption = "Updated in a thread";
}

* Observar que Execute(), en este caso solo llama a un segundo mtodo(), usando su
mtodo especial.
* El segundo mtodo, es un caso normal, se declaro en el archivo proceso1.h y se
construyo o implemento al final del archivo proceso1.cpp
* Grabar los dos archivos con File, Save All o CTRL S con cada uno, ya grabados en
folder tarea1, usar File, Close All
La preguntas son:
1.- Como se incorpora este objeto concurrente a una aplicacin
2.- Como se activa o se continua la ejecucin del proceso concurrente.
R.- esperar a la tercera edicin del libro :>)
Procedimiento:
1.- Crear y almacenar el objeto thread, llamado proceso1 con el procedimiento anterior,
asegurarse de que ya todo este CLOSE All y los archivos en folder tarea1.
2.- File, New Aplication
3.- File, Save Project as, y asegurarse que se grabe dentro del folder tarea1
4.- Poner un BUTTON OK y solo se escriben los siguientes tres renglones de cdigo:

#include "proceso1.cpp"
proceso1 *pro1;
pro1 = new proceso1(false);

* observar dentro de Unit1, donde va cada uno de ellos;


4.1.- Unit1.cpp
//---------------------------------------------------------#include <vcl\vcl.h>
#pragma hdrstop
#include "Unit1.h"
//---------------------------------------------------------#pragma resource "*.dfm"
TForm1 *Form1;
#include "proceso1.cpp"
//---------------------------------------------------------__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------void __fastcall TForm1::Button1Click(TObject *Sender)
{
proceso1 *pro1;
pro1 = new proceso1(false);
}
//----------------------------------------------------------

* #include proceso1.cpp, es para que Form1 o sus componentes, puedan accesar


proceso1.
* proceso1 *pro1; crea un variable de tipo proceso1 llamada pro1 derivada o instancia
de la clase proceso1

* pro1 = New proceso1(false); crea fsicamente o en memoria el objeto, llamando a su


constructor.
* false.- Recordar que el constructor crea el objeto concurrente pero suspendido, es
decir en proceso1, CreateSuspend = true(default), por esa razn en la llamada al
constructor se le informa que CreateSuspend = false, por tanto el proceso se reactiva y
hace la llamada al mtodo Execute().
* Como se observa, no es necesario ni tampoco se puede llamar directamente al mtodo
Execute(), es decir no es valido pro1Execute(); pero si es valido
pro1Resume(), pro1Suspend(), pro1Terminate(), etc., ver la ayuda de la clase
TThread.
La pantalla de salida es:

Tema 3 Aplicaciones Concurrentes c++builder

Se construye ahora, una aplicacin con dos objetos concurrentes, el primero despliega
los nmeros del uno al mil, y el segundo lo mismo pero de dos en dos.
Procedimiento:
1.- File, Close All
2.- Crear el Thread Object, llamarlo y grabarlo como proceso1 con el procedimiento
anteriormente descrito, no olvidar al final File, Close All
2.1.-Codigo de proceso1.h
//---------------------------------------------------------

#ifndef proceso1H
#define proceso1H
//---------------------------------------------------------#include <vcl\Classes.hpp>
//---------------------------------------------------------class proceso1 : public TThread
{
prvate:
protected:
int alfa;
void __fastcall Editar();
void __fastcall Execute();
public:
__fastcall proceso1(bool CreateSuspended);
};
//---------------------------------------------------------#endif

2.2.-Codigo de proceso1.cpp
//---------------------------------------------------------#include <vcl\vcl.h>
#pragma hdrstop
#include "proceso1.h"
//---------------------------------------------------------__fastcall proceso1::proceso1(bool CreateSuspended)
: TThread(CreateSuspended)
{
}
//---------------------------------------------------------void __fastcall proceso1::Execute()
{ //---- Place thread code here ----

for(alfa=1;alfa<=1000;alfa++)
{ Synchronize(Editar); };
}
//--------------------------------------------------------void __fastcall proceso1::Editar()
{ Form1->Edit1->Text=alfa;
}

3.- Crear otro Thread Object, llamarlo y grabarlo como proceso2 con el procedimiento
ya descrito, no olvidar al final File, Close All
3.1- Cdigo de proceso2.h
//---------------------------------------------------------#ifndef proceso2H
#define proceso2H
//--------------------------------------------------------#include <vcl\Classes.hpp>
//---------------------------------------------------------class proceso2 : public TThread
{
prvate:
protected:
int beta;
void __fastcall Editar();
void __fastcall Execute();
public:
__fastcall proceso2(bool CreateSuspended);
};
//---------------------------------------------------------#endif

3.2- Cdigo de proceso2.cpp


//---------------------------------------------------------#include <vcl\vcl.h>
#pragma hdrstop
#include "proceso2.h"
//--------------------------------------------------------__fastcall proceso2::proceso2(bool CreateSuspended)
: TThread(CreateSuspended)
{
}
//---------------------------------------------------------void __fastcall proceso2::Execute()
{ //---- Place thread code here ---for(beta=1;beta<=2000;beta=beta+2)
{ Synchronize(Editar); }
}
//---------------------------------------------------------void __fastcall proceso2::Editar()
{ Form1->Edit2->Text = beta;
}

4.- File, New Aplication y no olvidar File, Save Project As dentro del folder tarea1.
5.- Colocar dos edits y dos buttons, en la aplicacin, el
cdigo de Unit1.cpp, es;
//---------------------------------------------------------#include <vcl\vcl.h>
#pragma hdrstop
#include "Unit1.h"
//----------------------------------------------------------

#pragma resource "*.dfm"


TForm1 *Form1;
#include "proceso1.cpp"
#include "proceso2.cpp"
//---------------------------------------------------------__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------void __fastcall TForm1::Button1Click(TObject *Sender)
{ proceso1 *pro1;
pro1 = new proceso1(false);
pro1->Terminate();
}
//---------------------------------------------------------void __fastcall TForm1::Button2Click(TObject *Sender)
{ proceso2 *pro2;
pro2 = new proceso2(false);
pro2->Terminate();
}
//---------------------------------------------------------

* Observar que ahora hay dos include arriba


* cada botn activa su propio proceso
* Se usa el mtodo Termnate(), para asegurarse que termine el proceso, pero es
redundante porque el destructor se activa la terminar el mbito del buttonclick();
1. La pantalla de salida es:

No parece impresionante, pero las dos cajas Edits, se estn cargando al mismo tiempo,
es decir concurrentemente.

You might also like