visual_c++
TRANSCRIPT
UNIDAD I C++BUILDER PROGRAMACION VISUAL ELEMENTOS BASICOS
1.- INTRODUCCION
2.- MODELO DE SOLUCION
3.- VARIABLES
4.- TIPOS DE DATOS
5.- OPERADORES ARITMETICOS
6.- OPERADOR CAST
7.- JERARQUIA DE OPERACIONES
8.- ENTRADAS/SALIDAS EN PROGRAMACION VISUAL
9.- FORM1, ACTIVA O PRINCIPAL
10.- PROGRAMAS, FORMAS Y COMPONENTES
11.- COMPONENTE LABEL Standard
12.- COMPONENTE BUTTON Standard
13.- COMPONENTE EDIT Standard
14.- COMPONENTE MaskEdit Adicional
15.- COMPONENTE ComboBox Standard
16.- COMPONENTES DE AGRUPAMIENTO
17.- COMPONENTE PANEL Standard y atrás flecha negra
18.- COMPONENTE GroupBox Standard
19.- VENTANAS EN C++Builder
UNIDAD II C++BUILDER INSTRUCCIONES DE CONTROL DE PROGRAMA
1.- INTRODUCCION
2.- INSTRUCCIONES CONDICIONALES
3.- CONDICIONES SIMPLES
4.- INSTRUCCION IF
5.- CONDICIONES COMPUESTAS
6.- INSTRUCCION SWITCH
7.- COMPONENTES VISUALES DE SELECCION Y DECISIÓN
8.- COMPONENTE CheckBox Standard
9.- COMPONENTE RadioButton Standard
10.- COMPONENTE RadioGroup Standard
11.- COMPONENTE MainMenu Standard
12.- COMPONENTE PopupMenu Standard
13.- CICLO FOR
14.- CICLO WHILE
15.- CICLO DO-WHILE
16.- CONCLUSIONES ACERCA DE CICLOS
17.- INSTRUCCION DE SALTO INCONDICIONAL
III UNIDAD C++ BUILDER ARREGLOS
1.- INTRODUCCION
2.- ARREGLOS TRADICIONALES EN C++BUILDER
3.- ARREGLOS TIPO LISTAS
4.- ARREGLOS TIPO TABLA
5.- TIPOS DE ARREGLOS EN C++BUILDER CLASES E INTERNOS
6.- TStringList
7.- COMPONENTE ListBox Standard
8.- COMPONENTE StringGrid adicional
IV 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
1.- INTRODUCCION PROGRAMACION C++BUILDER
Los nuevos sistemas de información son costosos en tiempos y recursos, la solución
moderna de sistemas de información exigen nuevas herramientas y metodologías para
resolver rápida, económica y eficiente los problemas de información planteados por las
organizaciones.
Aun mas el pleno potencial del hardware no es aprovechado plenamente y existe un
considerable retraso con el software y sus aplicaciones, generando lo que se conoce como
―crisis del software‖.
En programación tradicional, modular o estructurada un programa describe una serie de
pasos a ser realizados para la solución de un problema, es decir es un algoritmo.
En programación orientada a objetos ( OOP ) un programa es considerado como un sistema
de objetos interactuando entre sí, ambientes de desarrollo visuales facilitan aun más la
construcción de programas y solución de problemas, porque permiten abstraer al ingeniero
de software de todo el GUI (interfase gráfica) del problema, que constituye más del 60%
del código normal de un programa.
Es decir, en programación modular o estructurada un problema sencillo de información es
descompuesto en una serie de módulos(llamados procedimientos o funciones) donde cada
uno de ellos realiza una tarea específica, por ejemplo uno de ellos captura los datos, otro
resuelve operaciones, etc.
En OOP todo problema aun aquellos sencillos de información, se consideran y resuelven
como módulos de código gigante (clase) que contiene todo el código necesario(variables,
procedimientos, funciones, interfaces, etc.) para solucionar el problema.
En programación visual( que también es heredera de OOP ),la interfase con el usuario(
pantallas) son generadas por el propio compilador y el ingeniero de software solo se
concentra en resolver el problema planteado.
C++Builder, es un compilador que permite usar cualquiera de los tres enfoques en la
solución de problemas de información que puedan y deban ser resueltos empleando el
computador y el lenguaje.
Para propósitos de aprendizaje usaremos el tercer enfoque, es decir programación en
ambientes visuales y usando el lenguaje de programación C++Builder.
2.- MODELO DE SOLUCION C++BUILDER
En general un problema de información es posible entenderlo, analizarlo y descomponerlo
en todos sus componentes o partes que de una u otra manera intervienen tanto en su
planteamiento como en su solución.
Una herramienta rápida que nos permite descomponer en partes un problema para su
solución, es el llamado modelo de solución, este consiste de una pequeña caja que contiene
los tres elementos más básicos en que se puede descomponer cualquier problema sencillo
de información, estas tres partes son:
1. LA PRIMERA PARTE son todos los datos que el computador ocupa para resolver el
problema, estos datos son almacenados internamente en la memoria del computador en las
llamadas variables de entrada.
2. LA SEGUNDA PARTE son todas las operaciones generalmente algebraicas necesarias
para solucionar el problema, generalmente esta parte del modelo es una formula (o igualdad
matemática, ej. X= y + 5).
3. LA TERCERA PARTE es el resultado o solución del problema que generalmente se
obtiene de la parte de operaciones del modelo y dichos datos están almacenados en las
llamadas variables de salida.
En resumen para todo problema sencillo de información es necesario plantearse las
siguientes preguntas:
Que información o variables de salida se van a desplegar en pantalla para responder al
problema planteado originalmente?
Variables es el nombre de una localidad o dirección interna en la memoria del computador
donde se almacenan los datos, ejemplo de variables para los casos del inciso anterior,
CIUDAD, DIRECCION, EDAD, SUELDO, ETC.
Información son datos ya procesados que resuelven un problema planteado.
EJEMPLO DE MODELO DE SOLUCION
Construir un modelo de solución que resuelva el problema de calcular el área de un
triángulo con la formula área igual a base por altura sobre dos.
UNIDAD 5.- C++BUILDER COMPONENTES
Variable(s) Entrada Proceso u operación Variable(s) salida
BASE ALTURA AREA = BASE * ALTURA / 2 AREA
TAREAS PROGRAMACION C++BUILDER
PROBLEMA 2.- CONVERTIR LA EDAD EN AÑOS DE UNA PERSONA A MESES.
PROBLEMA 3.- CONVERTIR PESOS A DOLARES.
PROBLEMA 4.- CALCULAR EL AREA DE UN CIRCULO CON LA FORMULA
PROBLEMA 5.- EVALUAR LA FUNCION PARA CUALQUIER
VALOR DE X.
Pero recordar también que existirán problemas sencillos donde:
*No se ocupan entradas o no se ocupan operaciones, pero todos ocupan salida.
* Una formula grande o muy compleja puede ser más segura y fácil de resolver, si es
descompuesta y resuelta en partes, juntando al final los parciales para obtener el resultado
final.
* Un problema puede tener más de una solución correcta.
* El problema no esta suficientemente explicado o enunciado, entonces, estudiarlo,
analizarlo y construirlo de manera genérica.
PROBLEMAS SUGERIDOS:
Construir los modelos de solución de los siguientes problemas:
PROBLEMA 6.- Convertir millas a kilómetros(caso normal)
PROBLEMA 7.- Convertir 125 metros a centímetros(no ocupa entradas)
PROBLEMA 8.- Se calcula que en promedio hay 4.7 nidos en cada árbol en la UABC,
también se calcula que en cada nido existen un promedio de 5.8 pájaros, se pide calcular la
cantidad total de nidos y de pájaros en los 227 arboles que existen en la UABC. (no ocupa
entradas)
PROBLEMA 9.- La gorda Sra. López y sus 8 hijos solo compran una vez al mes su
mandado en conocido supermercado, en dicha tienda el kilogramo de frijol cuesta $8.75, el
paquete de tortillas cuesta $3.55 y el frasco de café vale $14.25, si solo compran de estos
tres productos para su mandado, calcular su gasto total. ( problema no claro)
PROBLEMA 10.- Capturar y desplegar los cinco datos mas importantes de un
automóvil(no ocupa operaciones)
PROBLEMA 11.- La distancia Tijuana - Ensenada es de 110 kilómetros. Si un automóvil la
recorre a una velocidad constante de 30 millas por hora, cuanto tiempo tarda en llegar. ( 1
milla = 1.609 Km.) (dos maneras correctas de
resolverlo).
PROBLEMA 12.-Evaluar la función para cualquier valor de x.(caso
normal).
PROBLEMA 13.-Evaluar la función para cuando x vale 4 . (no ocupa
entradas).
3.- C++BUILDER VARIABLES
Identificadores son conjuntos de letras y/o números que se utilizan para simbolizar todos
los elementos que en un programa, son definibles por el usuario (programador o ingeniero
de software) del mismo, como son las variables donde se almacenan datos, funciones(
pequeños módulos con código), etiquetas, clases, objetos, etc.
En C++Builder un identificador es una palabra compuesta de letras y/o números de hasta
32 caracteres significativos, empezando siempre con una letra.
Una variable se define como un identificador que se utiliza para almacenar todos los datos
generados durante la ejecución de un programa.
Existen ciertas reglas en cuanto a variables:
*
* Claras y con referencia directa al problema. *
* No espacios en blanco, ni símbolos extraños en ellas. *
* Se pueden usar abreviaturas, pero solo de carácter general.
No deben ser palabras reservadas del lenguaje.
Ejemplos de buenas variables:
Nombre, Edad, SdoDiario, IngMensual, Perímetro, Calif1, etc.
4.- TIPOS DE DATOS C++BUILDER
A toda variable que se use en un programa, se le debe asociar (generalmente al principio
del programa) un tipo de dato específico.
Un tipo de dato define todo el posible rango de valores que una variable puede tomar al
momento de ejecución del programa y a lo largo de toda la vida útil del propio programa.
Los tipos de datos más comunes en C++Builder son:
Tipo Tamaño Rango
unsigned char 8 bits 0 a 255
char 8 bits -128 a 127
short int 16 bits -32,768 a 32,767
unsigned int 32 bits 0 a 4,294,967,295
int 32 bits -2,147,483,648 a 2,147,483,647
unsigned long 32 bits 0 a 4,294,967,295
enum 16 bits -2,147,483,648 a 2,147,483,647
long 32 bits -2,147,483,648 a 2,147,483,647
float 32 bits 3.4 x 10-38 a 3.4 x 10+38(6 dec)
double 64 bits 1.7 x 10-308 a 1.7*10+308(15 dec)
long double 80 bits 3.4 x 10-4932 a 1.1 x 10+4932
AnsiString cadena de caracteres
AnsiString no es propiamente un tipo de dato, sino una clase que se especializa en al
almacenamiento y manipulación de datos de tipo string, es decir, como clase ya contiene
toda una serie de métodos (procedimientos y funciones) que pueden usar directamente las
variables(objetos) que se declaren de tipo AnsiString, como en el siguiente ejemplo;
área de declaración carga normal de variables strings (que antes no se podía hacer
directamente en C o C++)
procesos con las variables ya considerándolas como objetos de la clase AnsiString estos
procesos antes ocupaban una librería especial llamada < string.h > * Interesante este
nuevo tipo (Clase) AnsiString y también interesante estos dos métodos ( LowerCase() y
ToInt() ), el resto de métodos, se deben buscar en la ayuda del C++Builder (solo abrir
folder o libro llamado ―referencia del programador‖, pedir índex y luego escribir
AnsiString ).
5.- C++ BUILDER OPERADORES ARITMETICOS
Un operador es un símbolo especial que indica al compilador que debe efectuar una
operación matemática o lógica.
C++Builder reconoce los siguientes operadores aritméticos:
Operador Operación
+ Suma
- Resta
* Multiplicación
/ División
% Residuo o Módulo
Como notas importantes a recordar siempre;
* En problemas de división entre enteros, C++ trunca la parte residual, es decir:
// área de declaración de variables
float a;
// área de operaciones
a = 10 / 4;
// área de despliegue de resultados
desplegar a; --> En pantalla sale ( 2.000000 )
El problema no es el tipo float, sino que por definición de la división entre enteros C++
siempre trunca la parte residual, mas adelante se indica como se resolverá este problema.
El operador (%) devuelve el residuo entero de una división entre enteros, ejemplo:
área de despliegue Otro ejemplo; Para resolver los problemas de potencias y raíces, se
usan ciertas instrucciones especiales que proporciona el lenguaje, llamadas funciones
matemáticas, en C++ existe toda una librería de instrucciones o funciones matemáticas.
Recordar que todas las funciones reciben uno o más datos o valores y regresan siempre un
resultado, una de estas funciones matemáticas es: Esta función ocupa dos valores o datos(
base y exp) ambos de tipo double, y regresa un resultado también de tipo double, ejemplo;
- resolver el problema de calcular Para resolver el problema de raíces, se aprovecha
una de las mas elementales y conocida de las leyes de exponentes que dice: Es
decir una raíz cualquiera se puede transformar a una potencia con un exponente
fraccionario. Ejemplo: problema y = 3 √x esto es equivalente a entonces: y=3 *
pow(double(x),double(1/2.0) ); * En este ejemplo se esta dando por supuesto que no
interesa el tipo de dato que requiere la función pow() para trabajar correctamente 6.-
C++BUILDER OPERADOR CAST
Se puede forzar un dato, variable o una expresión a convertirse o cambiarse a un nuevo tipo
de dato.
El operador cast realiza este proceso, es decir convierte datos, variables o expresiones a un
nuevo tipo de dato, su formato es:
Ejemplo:
int (3.1416);
* en este ejemplo se está convirtiendo un float a int, recordar que en este caso ya no se
tendrán los decimales.
Como nota importante este operador resuelve los dos problemas pendientes:
1. El de la división entre enteros.
2. El tipo de dato especifico que requieren las funciones.
En toda división recordar agregar a uno de los dos valores el (.0), solo que los dos
elementos sean variables entonces usar el operador cast con una de ellas.
Se puede usar pow(), directamente con los datos, argumentos o parámetros requeridos , si
estos son numéricos, pero transformándolos con el operador cast.
Esto también va a permitir evaluar expresiones matemáticas de manera mas directa y
sencilla, solo recordando usar un pow() por cada potencia y cada raíz de la ecuación,
ejemplo:
TAREAS PROGRAMACION C++BUILDER :
1.
2.
3.
6.- C++BUILDER OPERADOR CAST
Se puede forzar un dato, variable o una expresión a convertirse o cambiarse a un nuevo tipo
de dato.
El operador cast realiza este proceso, es decir convierte datos, variables o expresiones a un
nuevo tipo de dato, su formato es:
Ejemplo:
int (3.1416);
* en este ejemplo se está convirtiendo un float a int, recordar que en este caso ya no se
tendrán los decimales.
Como nota importante este operador resuelve los dos problemas pendientes:
1. El de la división entre enteros.
2. El tipo de dato especifico que requieren las funciones.
En toda división recordar agregar a uno de los dos valores el (.0), solo que los dos
elementos sean variables entonces usar el operador cast con una de ellas.
Se puede usar pow(), directamente con los datos, argumentos o parámetros requeridos , si
estos son numéricos, pero transformándolos con el operador cast.
Esto también va a permitir evaluar expresiones matemáticas de manera mas directa y
sencilla, solo recordando usar un pow() por cada potencia y cada raíz de la ecuación,
ejemplo:
TAREAS PROGRAMACION C++BUILDER :
1.
2.
3.
7.- C++BUILDER JERARQUIA DE OPERACIONES
El problema de no tomar en cuenta la jerarquía de los operadores al plantear y resolver
una operación casi siempre conduce a resultados muchas veces equivocados como estos:
Ejemplos:
1.
2. 2+ 3* 4 = 20(incorrecto) = 14 (correcto)
b) si calif1=60 y calif2=80
Recordar siempre, que antes de plantear una formula en un programa se deberá evaluar
contra el siguiente:
Nota: Si se quiere alterar el orden normal de operaciones, entonces usar paréntesis.
Nota: Tampoco es bueno usar paréntesis de mas en una operación, esto solo indica que no
se evalúo bien la formula, como en el siguiente ejemplo;
aquí los paréntesis están de mas, porque por orden de operaciones, multiplicación y
división tienen la misma jerarquía y entonces se resuelven de izquierda a derecha, en otras
palabras ni que falten paréntesis ni que sobren paréntesis.
8.- C++BUILDER ENTRADAS/SALIDAS EN PROGRAMACION VISUAL
Entradas o capturas de datos y salidas o despliegues de información o resultados son de los
procesos más comunes en cualquier tipo de problema de información, estos procesos o
instrucciones varían de acuerdo a los lenguajes y ambientes de programación a usar.
El lenguaje y ambiente de programación a utilizar, es de tipo visual, y muchos de los
problemas asociados a entradas y salidas se encuentran ya resueltos por el propio
compilador.
El ambiente de construcción de programas a usar, es el siguiente:
* SOLO CARGARLO EN PANTALLA EJECUTANDO EL C++Builder, QUE SE
ENCUENTRA
EN LA BARRA DE START DE WINDOWS.
Sus elementos básicos son:
1.- La barra de menús (file, edit , etc.);
2.- La barra de herramientas(icono de grabar, run, forma, etc.)
3.- La barra de componentes
4.- El Inspector de Objetos
5.- La forma activa o principal
9.- C++BUILDER FORM1 ACTIVA O PRINCIPAL
Es sobre esta forma donde se construye el programa y esta forma se convierte en ventana al
momento de ejecutarse el programa.
Es decir será la primera ventana que el usuario ve al momento de ejecutarse el programa, su
nombre es Form1.
Esta forma o ventana es un objeto de C++, y como todos los objetos de C++ y del universo,
la forma o ventana tiene asociados propiedades y eventos.
Propiedades son todas las características particulares que diferencian un objeto de otro
objeto, las propiedades o características mas comunes son forma, tamaño, color, etc., para
objetos en C++, estas propiedades se modifican o individualizan usando el Inspector de
Objetos, que es la parte del programa que las contiene.
También se pueden modificar las propiedades dentro de un programa, usando instrucciones
apropiadas, mismas que llevan el siguiente formato:
nomobjeto→propiedad = nvovalor;
ej.; Form2→Color=clRed;
Eventos, son todos aquellos sucesos de carácter externo que afectan o llaman la atención
del objeto, para estos caso la forma o ventana:
1. Debe tener capacidad de detectar el evento
2. Aun mas importante debe tener capacidad de reaccionar y emitir una respuesta, mensaje
o conducta apropiada a el evento detectado.
Evento es por ejemplo que otro objeto llamado humano, pulse el objeto tecla ESC, o haga
click derecho con el objeto ratón en alguna parte de la ventana , etc. , es en estos casos,
cuando la ventana detecta un evento de estos, la propia forma deberá responder de manera
apropiada.
Esta respuesta no es automática, sino son la serie de instrucciones del lenguaje (o
programa) que los ingenieros de software diseñan(o programan), en otras palabras son los
eventos quienes contendrán los programas.
Es tambien el Inspector de Objetos, quien contiene todos los posibles eventos asociados a la
forma.
Para los primeros programas en C++Builder , solo se usaran propiedades sencillas como
color, font, etc. de Form1, y no se usan, de momento los eventos que puede detectar Form1.
10.- C++BUILDER PROGRAMAS FORMAS Y COMPONENTES
Un programa o problema de información en C++Builder , no es mas que una o mas formas
o ventanas, donde cada una de ellas contiene elementos u objetos especiales llamados
componentes, dichos componentes C++Builder los proporciona a través de la barra de
componentes.
Es decir toda la interfase que se quiera manejar con el usuario del programa, no consiste
mas que de una colección de componentes agrupados en una forma o ventana.
La colección de componentes que pone a nuestra disposición C++Builder están agrupados
en diversos folder o pestañas o paginas en la barra de componentes, estas categorías
contienen los siguientes componentes:
Standard.- MainMenu, PopupMenu, Label, Edit, Memo, Button, CheckBox, RadioButton,
ListBox, ComboBox, ScrollBar, GroupBox, RadioGroup, Panel.
Win95.- TabControl, PageControl, TreeView, ListView, ImageList, HeaderControl,
RichEdit, StatusBar,TrackBar,ProgressBar,UpDown,HotKey.
Additional.- BitBtn, SpeedButton, MaskEdit, StringGrid, DrawGrid, Image, Shape, Bevel,
ScrollBox.
Data Access.- DataSource, Table, Query, StoredProc, DataBase, Session, BatchMove,
UpdateSQL.
Data Controls.- DBGrid, DBNavigator, DBText, DBEdit, DBMemo, DBImage,
DBListBox, DBComboBox, DBCheckBox,DBRadioGroup, DBLookupListBox,
DBLookupComboBox.
Win31.- DBLookupList, DBLookupCombo, TabSet, Outline, Header, TabbedNotebook,
NoteBook.
Dialogs.- OpenDialog, SaveDialog, FontDialog, ColorDialog, PrintDialog,
PrinterSetupDialog, FindDialog, ReplaceDialog.
System.- Timer, PaintBox, FileListBox, DirectoryListBox, DriveComboBox,
FilterComboBox, MediaPlayer, OleContainer, Ddeclientconv, DdclientItem,
Ddeserverconv, DdeserverItem.
QReport.- QuickReport, QRBand, QRGroup, QRDetailLink, QRLabel, QRMemo,
QRDBText, QRDBCalc, QRSysData, QRShape, QRPreview.
ActiveX.- ChartFX.
Para incorporar un componente a una forma solo basta seleccionarlo con un click derecho
en su icono y luego colocar el cursor dentro de la forma en el lugar donde se quiere que
aparezca y volver a hacer un click derecho.
También los componentes son objetos de C++Builder y como tales también tienen
asociados propiedades y eventos, tales como los tiene la forma principal, solo que existen
pequeñas variaciones en cuanto a sus propiedades y eventos propios con respecto a Form1.
Recordar además, que es el Inspector de Objetos en primera instancia quien permite asociar
o modificar propiedades especificas tanto a una forma como a un componente.
Ya en segunda instancia las propiedades de formas y componentes se pueden modificar
también directamente dentro de un programa, usando instrucciones como las ya descritas en
párrafos muy anteriores.
Analizaremos ahora los dos primeros componentes, que también se usaran para construir o
diseñar nuestro primer programa en C++Builder y Visual.
11.- COMPONENTE LABEL C++BUILDER (Standard)
Este componente se utiliza para desplegar textos o mensajes estáticos dentro de las formas,
textos tales como encabezados, solicitud al usuario del programa para que proporcione
algún dato o información(edad, dame sueldo, etc.), en cierta forma hace las funciones de
printf, cout, writeln, print, display, etc., pero solo cuando se consideran en su parte de
mensajes.
También es un objeto en C++Builder y por tanto tiene asociados sus propias propiedades y
eventos, al mismo tiempo como se está usando dentro del objeto form1, muchas
propiedades que se definan para el objeto Form1, el objeto Label1 las va a heredar.
Si bien es cierto que el objeto se llama Label, pero cuando se ponen dentro de una forma
C++Builder los va numerando automáticamente, si se ponen tres Labels en Form1, ellos se
llaman o simbolizan o se procesan o programan con Label1, Label2, Label3.
Es la propiedad Caption, la que lleva el contenido del mensaje que se quiere desplegar en la
pantalla, solo click derecho a un lado de la propiedad Caption en el Inspector de Objetos,
teniendo seleccionada la caja Label1 en la forma y escribir el texto indicado.
12.- COMPONENTE BUTTON C++BUILDER (Standard)
Es el componente principal de la forma, contiene el código principal del programa y su
activación por el usuario provoca que se realicen los principales procesos del problema
planteado (aquí es donde se capturan datos, se realizan operaciones, etc.).
De este componente se maneja su propiedad Caption para etiquetarlo con la palabra ―OK‖ o
―ACEPTAR‖ o ―EXE‖ , y su evento OnClick para activarlo, es en dicho evento donde se
construye el código del programa.
Recordar que aunque no es un componente necesario en los programas, ya que el código se
puede asociar o pegar a cualquier evento de cualquier forma, o componente del programa,
Microsoft ya acostumbro a todos los usuarios al botón OK, de acuerdo, OK.
Este botón también puede activar su evento OnClick, cuando el usuario presione la tecla
<ENTER>, solo poner la propiedad Default en true, en este caso el botón de ordenes, se le
conoce como botón de default.
Igualmente puede activar su evento OnClick cuando el usuario, presione la tecla <ESC>,
solo poner la propiedad Cancel en true, a este caso se le conoce como ―CANCEL
BUTTON‖.
PRACTICA
Construir un primer programa que consiste en un forma que contenga los cinco datos mas
importantes de un automóvil, y uno de esos datos solo deberá aparecer cuando el usuario
haga click en el botón de ejecución o de orden o de OK.
Para este programa se ocupa, una forma, dos componentes labels para encabezados
apropiados al problema, 10 componentes labels para textos y datos, un componente Button.
Para el ultimo componente Label su propiedad Caption se dejara en blanco o vacía para que
sea el usuario del programa quien lo cargue al apretar el botón de ordenes o botón de OK.
Recordar que C++Builder va numerando automáticamente todos los componentes en el
programa en forma consecutiva, es decir al finalizar el diseño del programa se tendrán, los
componentes form1, label1,label2,label3,..button1.
El procedimiento completo para crear y ejecutar el programa es:
3.- Antes de poner el primer componente usar la opción, File Save Project As, aparece la
siguiente ventana:
Donde se deberá seleccionar primero, el icono de nuevo folder( arriba a la derecha y tiene
un folder con rayitos), esto es, para crear un nuevo folder o directorio donde quedara
guardado o almacenado el programa, en cuanto se crea el nuevo folder, sobrescribir la
palabra ―new folder‖ que aparece, con el nombre que tendrá el directorio donde quedara
almacenado el programa, escribir por ejemplo ―programa uno‖ ( Windows95 ya permite
que los nombres de directorios y sus archivos ya sean mas largos y no necesariamente del
tipo antiguo de 8.3), al terminar de sobrescribir, la palabra ―programa uno‖ apretar tecla
<ENTER> y esperar un momento a que se cree el directorio.
Ya creado y renombrado el directorio, observar que en la parte inferior de la ventana el
programa ya tiene el nombre de ―Unit1.cpp‖, a un lado esta una caja o botón de ―OPEN‖,
mismo que se deberá apretar y después usar en la misma parte un botón llamado ―SAVE‖
para almacenar ―Unit1.cpp‖ y otra vez usar otro botón ―SAVE‖ para almacenar
―Project1.mak‖.
4.- Ahora ya que se tiene Form1 en pantalla, recordar que se pueden modificar sus
propiedades como color, font, etc. usando el Inspector de Objetos que esta a un lado de la
forma ( se sugiere practicar un poco esto), los cambios que se hacen en el Inspector de
Objetos se van reflejando automáticamente en la forma en pantalla y también en la ventana
que el usuario vera al ejecutarse el programa.
5.- Ahora se selecciona con un click el componente llamado Label en la barra de
componentes y luego poner el cursor dentro de la forma en el lugar donde se quiera que
aparezca el componente, y volver a hacer click con el ratón para que ya aparezca dicho
componente en la forma.
Observar que el componente en la forma, que esté seleccionado ( esto se puede hacer,
usando un click dentro de el componente) se puede arrastrar para cambiarlo de lugar o
posición o hacerlo mas pequeño o mas grande.
Como nota también a recordar siempre, un componente o la propia forma, está
seleccionado, si el Inspector de Objetos lo esta referenciando, es decir es el Inspector de
Objetos quien contiene el nombre del componente en la parte de arriba del propio Inspector
de Objetos.
Para cargar o para que despliegue un texto el componente Label1, solo escribir dicho texto
en la cajita que esta a un lado de la propiedad Captión en el Inspector de Objetos, por
ejemplo para el problema, escribir la palabra ―AUTOS ECONOMICOS‖, y recordar que
también esté componente también tiene propiedad font que se puede usar para alterar el tipo
de letra que despliega el componente.
6.-Repetir el procedimiento anterior hasta tener los doce componentes Label bien
acomodados y organizados en la forma y con sus textos correspondientes, solo recordar
dejar el componente Label12 con su propiedad Caption en blanco(usando tecla backspace).
7.- Seleccionar y acomodar ahora un componente Button en la forma y colocarlo en la
esquina inferior derecha, en su propiedad Caption = escribir la palabra ―OK‖.
Recordar que este componente, es quien contiene el código del programa y mas
específicamente es su evento OnClick quien lo contiene y quien además lo activa o lo
ejecuta.
Para añadirle el código(en este ejemplo que cargue el Caption de Label12 al tiempo de
ejecución del programa y por decisión del propio usuario) existen dos maneras:
En el Inspector de Objetos, hacer click en la pestaña o folder llamado event y ahora en
lugar de propiedades el Inspector de Objetos, muestra todos los eventos que el componente
puede detectar(observar y anotarlos), ahora click en la cajita que esta a un lado del evento
llamado OnClick y con este paso aparece el siguiente minieditor de programas de
C++Builder:
Observar que ya trae listo el evento Button1Onclick(), para programarse y es dentro de sus
llaves donde se construye el programa.
Solo escribir dentro de las llaves la instrucción Label12→Caption=―$ 5,000.00‖;
8.- Ahora ya esta lista la forma o programa para ejecutarse, también existen dos maneras:
1.
2. Usar la opción Run que esta arriba en la barra de menús. 3.
4. Usar icono ―run‖ en barra de
herramientas.
Nota.- También se puede usar también la primera letra dentro del botón de comando o de
ordenes (OK), para activar las instrucciones o acciones del botón, es decir se puede usar
click en botón o solo pulsar la letra O, para que se ejecute este ultimo procedimiento , solo
poner un símbolo & en el caption del botón antes de la letra O.
El programa ya en ejecución debe ser similar(pero mejor diseñado) al siguiente ejemplo:
Ya que se practicó, la mecánica de creación de programas, resolveremos el problema de
interactividad con el usuario.
Es decir en estos casos es el usuario quien generalmente proporciona los datos para su
procesamiento en el problema, el trabajo del ingeniero de software, es procesarlos y darles
sentido, coherencia y sobre todo eficiencia.
Para esto se ocupan , componentes llamados de ―input‖, ―entrada‖ o ―captura‖, que
permitan al usuario cargar o proporcionar un dato en ellos, dichos componentes son:
13.- COMPONENTE EDIT C++BUILDER (Standard)
Este componente es el mas importante componente visual, su función principal es manejar ,
todos los procesos de entrada y salida (input/output) al programa.
En resumen de este componente, se necesita entender lo siguiente:
Este componente Edit, es el equivalente a las variables en cualquier lenguaje de
programación, mas la instrucción de captura o despliegue correspondiente, es decir;
a) En BASIC, Input Edad → Edit1
b) En PASCAL, Read(Ciudad) → Edit2
c) En C, printf(‖%d‖, sueldo) → Edit3
d) En C++, cin.get(nombre,30) → Edit4
e) En Cobol Display metros → Edit5
Ya aclarada su función, es necesario entender primero, que este componente permite
capturar datos y también como en el caso del componente Label desplegar datos, textos,
mensajes o resultados de operaciones de ser necesario, usando la propiedad Text del
componente Edit.
Esta propiedad Text, así como la propiedad Caption en Label, permiten igualarse a muchos
procesos básicos, es decir es fácil igualar Text o Caption a un dato, una variable, otro Text
u Caption, o una expresión algebraica normal, como en los siguientes ejemplos;
Edit2->Text = 5;
Label3->Caption = "PATO";
Edit4->Text = 3 * 6.2 ;
En principio su valor de default es la palabra Edit1 y es en su propiedad Text donde se
modifica, generalmente al principio de un programa se deja en blanco, y al ejecutarse el
programa, el usuario lo llena con los datos solicitados o el programa lo llena con el
resultado de las operaciones.
Cuando un usuario lo carga con un dato, recordar que el dato almacenado queda de tipo
texto, no importa lo que haya escrito el usuario.
Para resolver el problema de usar datos numéricos dentro del Text de un componente Edit,
en operaciones matemáticas, solo agregarle a la propiedad Text, las funciones .ToInt() o
.ToDouble(), como se muestra en los siguientes ejemplos.
Edit3->Text= Edit2->Text.ToInt() * 5;
Edit5->Text= 3 * pow( Edit2->Text.ToDouble(), double (4) );
este ultimo es el problema de calcular
En particular, se deberá asociar los Edit con las variables, y solo existirán en principio
cuatro tipo de edits.
Formato Edit Tipo De Dato Ejemplo
Edit→Text String Nombre, Ciudad
Edit→Text[1] Char Grupo, Sexo, Letra
Edit→Text.ToInt() Entera Edad, Año
Edit→Text.ToDouble() Doble Sueldo, Pi
Realizar operaciones algebraicas con los componentes edit.
Recordar que el usuario, usara un componente Edit para almacenar los datos de entrada del
problema, muchas veces estos datos son de tipo numérico, por ejemplo en un componente
Edit se almacena la cantidad de pesos, el precio de un articulo, la edad de una persona, etc.
Solo recordar siempre usar el componente Edit, directamente como una variable
cualquiera(con su método o función correspondiente ) y construir la operación o formula
con los propios componente o cajas edit.
Es decir, por ejemplo, si se pide resolver el problema de multiplicar dos números
cualesquiera, se ocuparan tres ` cajas Edit,(factor1, factor2, producto), es en estos casos
donde se usan tres componentes Edit como si fuesen tres variables simples directamente.
Ya en programa se ocupan 3 componentes Label para títulos (Multiplicando, Multiplicador,
Multiplicación), tres componentes Edit para los datos (dos proporcionados por el usuario y
uno calculado por el programa) y un componente Button(OK) para realizar la operación.
El problema se resuelve de la siguiente manera;
Código y Pantalla de salida es ;
void __fastcall TForm1::Button1Click(TObject *Sender)
Edit3->Text=Edit1->Text.ToInt() * Edit2->Text.ToInt();
notas:
Conversión de datos o variables numéricas a Texto de un componente Edit.
Para resolver este problema, donde se tiene una variable numérica cargada, con un
resultado o dato numérico y se pretende mandarla a un componente Edit o Label para su
despliegue, existen dos manera sencillas, estas son;
// área de declaración
int alfa;
double beta;
// área de captura
alfa = Edit1->Text.ToInt();
beta = Edit2->Text.ToDouble();
// área de operaciones
alfa = alfa+3;
beta = beta *5.1;
// área de despliegue y conversión de números a strings o Edits
Label3->Caption = AnsiString(alfa);
Edit4->Text = AnsiString(beta);
Como se observa se puede transferir variables numéricas tanto a Label
como a Edit vía la clase AnsiString.
<code>
sin embargo es mas sencillo usar el método que se usa en el programa dado
de ejemplo para la multiplicación, es decir considerar los componentes
Edit como variables normales, y usar:
<code>
Edit1->Text=Edit5->Text.ToInt(() * Edit2 etc - Edit50 etc
Recordar que es mas correcto usar propiedad Text y métodos ToInt() y ToDouble()), y
cargar directamente la caja del Edit resultado.
De nuevo, Edit→Text o Label→Caption permiten que se igualen a una variable, un dato, o
una expresión, es decir es valido;
Para el caso de resultados decimales , la salida incluye todo el conjunto de decimales
asociados a un tipo double(muchos ceros), para resolver este problema se pueden usar
directamente algunos de los métodos asociados a la clase AnsiString , por ejemplo uno de
esos métodos es;
FormatFloat(―string de formato‖, var double);
La string de formato contiene una serie de simbolos literales que se utilizan para darle el
formato de salida deseado, esto simbolos o constantes literales son;
Const. Lit. Significado
0(cero) Rellena con 0(ceros) todas las posiciones indicadas, ejemplo ―0000.00‖ para el
numeró 23.4 la string de salida seria 0023.40
# Constante muy usada para formato de valores numéricos, esta constante solo despliega el
valor numérico normal.
. Se utiliza para separar la parte entera de la parte decimal.
,(coma) Se utiliza para separar el valor numérico en
UNIDADes de millar.
E+, E-, e+, e- Se utilizan para convertir a notación científica exponencial el valor de salida.
Notas;
El valor de salida es redondeado a tantos decimales como 0s, o #s, existan en la string de
formato.
Si la string de formato no incluye un punto decimal, entonces el resultado es redondeado al
valor entero mas cercano.
ejemplo;
button1click(---){
// área de declaración
double alfa;
// captura y conversión
alfa = Edit1->Text.ToDouble();
// operaciones
alfa = alfa / 3.1416 ;
// conversión y despliegue
Edit2->Text= FormatFloat("###,###.##", alfa);
}
También es valido usar FormatFloat() con lo visto en Edit, es decir es valido y mas
correcto;
Edit5->Text= FormatFloat("###.##", Edit3->Text.ToInt() * 3.1416);
En resumen, este componente Edit, es el componente mas importante y elemental en todo
problema que involucre el procesamiento de datos en ambientes visuales, se debe
acostumbrar a considerarse como un elemento importante en cualquier problema visual, y
acostumbrarse a procesarlo como si fuese una variable normal cualesquiera.
Se construye y resuelve el segundo programa del modelo de solución del área del triángulo.
Para crear y diseñar la forma y sus componentes se ocupa, una forma, seis labels, tres edits
y un Button, quedando así;
a) Pantalla de diseño
b)Programa
El código o miniprograma ( es miniprograma porque no se tiene que programar mucho de
la pantalla), solo diseñarla, y dentro del evento OnClick del componente Button, queda así;
void __fastcall TForm1::Button1Click(TObject *Sender)
Edit3->Text=FormatFloat("###.##",Edit1->Text.ToDouble() *
Edit2->Text.ToDouble()/ 2 );
c) Pantalla de ejecución o de salida
Recordar que cuando se capturen los datos de base y altura, no dejar espacios en blanco
antes del primer numero o se darán problemas y errores de conversión a valores numéricos.
Para resolver mejor este problema de formatos mas adecuados para captura de datos, se
usaran nuevos componentes que se analizan mas adelante.
TAREAS PROGRAMACION C++BUILDER
1.- CONVERTIR A PROGRAMAS TODOS LOS PROBLEMAS VISTOS EN EL
MODELO DE SOLUCION.
14.- C++BUILDER COMPONENTE MaskEdit (Adicional)
Este componente es muy similar en su uso al componente Edit, excepto que proporciona
una mascara especializada para el formato de datos, es decir se puede usar para que el
usuario proporcione datos con formatos bien definidos, como son valores numéricos que
incluyan puntos y comas por ejemplo 3,345.87, o que incluyan símbolos como el de $, o
para el caso de fechas que lleven su propio separador como por ejemplo 02/28/97.
También se puede usar, para asegurarse que el dato proporcionado por el usuario, solo
incluya números, o solo contenga letras, etc.
Para darle formato al dato que el usuario debe proporcionar solo hacer dobleclick a un lado
de la propiedad EditMask en el Inspector de Objetos y esto nos da el siguiente minieditor
de datos:
* Observar en la ventana derecha, algunos ejemplos de ―mascaras de edición‖.
* Es en la ventanilla arriba a la izquierda donde se colocan los caracteres especiales de
edición ( en el ejemplo se están usando, $, #, puntos y comas).
* Es en la ventanilla abajo a la izquierda donde se pueden proporcionar algunos datos de
prueba, para probar el formato diseñado.
* Recordar que este formato es para capturas, no para despliegues, puesto que para este
caso (despliegue) se usa FormatFloat().
* No olvide usar el botón OK, cuando se termine de construir la mascara de edición.
* Los principales caracteres especiales de edición son:
'!' Caracteres opcionales se despliegan en blanco
'>' Caracteres que siguen deben ser mayúsculas
'<' Caracteres que siguen deben ser minúsculas
'L' Requiere una letra en esta posición
'l' Permite una letra es esta posición pero no la requiere
'A' Requiere un alfanumérico en esta posición
'a' Permite un alfanumérico pero no lo requiere
'0' Requiere un numero en esta posición
'9' Permite un numero pero no lo requiere
'#' Permite un numero y también signos mas y menos
':' Separa horas:minutos:segundos
'/' Separa meses días años
';' Se utiliza para separar los tres campos o partes de una mascara
'_' inserta espacios en blanco en el texto
Cualquier otro carácter que no aparezca en la tabla anterior, puede aparecer en una mascara,
pero solo se tomara en cuenta como una literal cualesquiera, es decir son insertados
automáticamente y el cursor los brinca.
El segundo campo o parte de una mascara es un carácter simple que indica que carácter
literal debe ser incluido como parte del texto del componente MaskEdit, por ejemplo
(000)_000-0000;0;*,
Un 0 en el segundo campo indica que solo deben capturarse los diez dígitos marcados con
O, en lugar de los 14 que tiene la mascara.
El tercer campo de la mascara, es el carácter que se quiera que aparezca en lugar de
espacios en blancos.
Nota: para procesarlo usar solo Text no Text.ToDouble()
TAREAS PROGRAMACION C++BUILDER
1.- REEDITAR Y CORREGIR TODOS LOS PROBLEMAS HECHOS Y QUE
CONTENGAN EL COMPONENTE EN CAPTURAS NUMERICAS.
15.- COMPONENTE ComboBox C++BUILDER ( Standard )
Existen muchas ocasiones en donde el usuario del programa tiene que proporcionar datos
que provienen de un conjunto finito y muy pequeño de posibles respuestas, esto significa
que cada vez que se ejecute el programa, el usuario estará proporcionando las mismas
respuestas.
Ejemplo de esta clase de datos, son por ejemplos Municipio en BC, las posibles respuestas
solo son (Tecate, Tijuana, Mexicali, Ensenada, Rosarito), otro ejemplo es Sexo (Hombre,
Mujer), etc.
Para situaciones como esta, existen componentes que permiten programar por adelantado
las posibles respuestas, y el usuario solo debe seleccionar la respuesta apropiada , en lugar
de tener que escribirla.
Este componente ComboBox nos permite definir en primera instancia un conjunto de datos
o valores respuestas asociados a una caja de edición cualesquiera, así ahora el usuario
tendrá la oport
UNIDAD de seleccionar un dato del conjunto de datos o respuestas ya predefinido.
Este componente ComboBox tiene dos partes, una parte de encabezado, para poner el
nombre del grupo de respuestas( por ejemplo municipios, sexo, etc.), que se carga usando la
propiedad Text del componente.
La segunda parte es la lista de opciones o respuestas que se debe cargar al tiempo de diseño
de la ventana, en el momento de poner el componente ComboBox1, solo hacer dobleclick a
un lado de la propiedad Items en el Inspector de objetos y sale el siguiente editor de strings:
Al momento de ejecución del programa, toda la lista de respuestas, estarán a la vista del
usuario, para que este ultimo la seleccione.
Recordar que el usuario al momento de ejecución del programa, solo vera el encabezado,
para seleccionar su respuesta deberá apretar la flechita que esta a un lado del encabezado.
Para procesar este componente:
Usar su popiedad Text de manera normal, es decir si la respuesta se ocupa en string,
Solo usar ComboBox1→Text, o si la respuesta se quiere numerica solo convertir Text a
ToInt() o ToDouble(), ej, ComboBox1→Text.ToDouble().
TAREAS PROGRAMACION C++BUILDER
1.- REEDITAR LOS PROBLEMAS YA RESUELTOS, AGREGANDO ESTE
COMPONENTE EN LOS CASOS DE CAPTURAS QUE LO PUEDEN ADMITIR (
CAPTURAS DONDE YA SE TIENEN LAS ENTRADAS SELECCIONADAS O
CONOCIDAS DE ANTEMANO).
16.- COMPONENTES DE AGRUPAMIENTO C++BUILDER
Como ya se empieza a notar en las aplicaciones construidas, la cantidad de datos e
información empiezan a amontonarse en la ventana simple que se ha venido construyendo.
Para resolver este problema, se tienen dos métodos, el primero de ellos consiste de una
serie de componentes que permiten agrupar datos o información(resultados) de una manera
mas lógica y estética.
El segundo método consiste de construir y trabajar con dos o mas ventanas a la vez.
Se empieza por el primero método , es decir componentes de agrupamiento.
17.- C++BUILDER COMPONENTE PANEL ( Standard y atrás flecha negra)
Es el componente mas sencillo y común de agrupamiento, se utiliza para poner un panel o
un cuadro o marco dentro de una ventana.
El componente Panel1 puede contener una toda una serie lógica de otros componentes.
Solo se deberá recordar colocar primero todos los paneles en la forma y encima de ellos los
componentes que contendrán.
Este componente también tiene una serie de propiedades que le dan una mejor presentación
usando las propiedades BevelInner, BevelOuter, BevelWidth, y BorderWidth.
Es decir se puede dividir una sola ventana en varias partes, por ejemplo en un panel se
ponen los componentes donde se capturan los datos de un problema junto con el botón de
OK, y en otro panel se construye la salida, por ejemplo se crea un panel para capturar los
datos de un empleado incluyendo sueldo diario y días trabajados y un segundo panel
contiene su cheque semanal de pago ( problema sugerido también ).
Para modificar programas construidos sin paneles, el procedimiento para agregarlos es:
1.- Mover todos los componentes abajo en la ventana.
2.- Colocar el panel en su posicion.
3.- Click en Componente a relocalizar.
4.- DobleClick, Copy
5.- DobleClick, Cut
6.- Click dentro del panel, donde se quiere el componente
7.- DobleClick, Paste
TAREAS PROGRAMACION C++BUILDER
1.- REEDITAR E INCLUIR ESTE COMPONENTE PANEL, EN TODOS LOS
PROGRAMAS IMPARES HECHOS.
18.- BORLAND C++BUILDER COMPONENTE GROUPBOX (Standard)
Este componente es otra forma standard de agrupamiento de componentes de programas en
Windows, se usa para agrupar componentes relacionados dentro de una forma.
También se utiliza para separar áreas lógicas dentro de una ventana de Windows.
El texto que identifica el propósito general del grupo se escribe dentro de la propiedad
Caption en el Inspector de Objetos, teniendo seleccionado este componente GroupBox.
Además de sus propiedades, métodos y eventos propios, como todos los componentes de
este tipo, tiene o hereda las propiedades, métodos y eventos de todos los controles generales
de tipo Windows.
Es muy similar al componente panel, excepto que incluye una pestaña que permite dejar
mas claro, el proposito del grupo.
TAREAS PROGRAMACION C++BUILDER
1.- REEDITAR E INCLUIR ESTE COMPONENTE GroupBox PARA TODOS LOS
PROBLEMAS PARES YA CONSTRUIDOS
19.- VENTANAS EN C++Builder
El siguiente problema común, con el manejo de programas en C++Builder, es el de poder
crear, controlar y administrar mas de dos formas o ventanas a la vez.
Lo primero que hay que entender para poder resolver este problema es que en C++Builder,
cada forma o ventana tiene asociado ciertos recursos, ademas de los componentes que
contiene, tambien una serie de recursos especiales, en general, la forma, los recursos y los
objetos hijos o componentes, se encuentran relacionados todos ellos, en un archivo
especial, llamado ―Unit1.cpp‖.
Es decir si se crea una segunda forma o ventana,, dicha form2, junto con sus recursos,
componentes, etc., se encontraría contenida en el archivo llamado ―Unit2.cpp‖ y así
sucesivamente.
Pero recordar y también tomar en cuenta, que los componentes de esta segunda forma,
también se simbolizarían y procesaran normalmente, es decir ellos también serán (Edit1,
Label5, etc.).
Para crear una segunda forma (form2), solo usar el icono de new Form que se
encuentra en la barra de herramientas, recordar además que los otros iconos de dicha barra
sirven para estarse intercambiando entre formas y Unit (código fuente).
La segunda forma se construye normalmente, pero queda el problema de donde queda el
botón de ordenes, le respuesta es, se pone en la primera forma o ventana principal del
programa.
El proceso en este botón es similar a todos los programas anteriores, es decir primero se
capturan los datos ( pantalla o ventana de captura),luego se resuelve las operaciones y luego
traspasar los datos a los componentes de la segunda forma o ventana.
Para poder realizar este procesos, solo usar ahora un nuevo formato de trabajo con todos los
componentes usados, para que ahora incluyan la forma que lo contiene, es decir se usa
ahora ;
NOMFORMA→NOMCOMPONENTE→NOMPROPIEDAD
como se observa, procesar los elementos de dos ventanas, es sencillo pero además existen
ciertas condiciones que deberán cuidarse para que estos procesos funcionen, estas
condiciones son:
Para incluir la
UNIDAD (Unit) de la otra forma o ventana, solo tener seleccionada o al frente la ventana
que llama, y usar la orden File, Include Unit, que se encuentra en arriba en la barra de
menú, junto con el Run, Compile, etc., al dar esta orden (File Include Unit) sale una lista
con todas las
UNIDADes (Unit) que ya se diseñaron, seleccionar la apropiada y ya se incluirá
automáticamente en la forma o ventana actual.
Si una ventana o forma referencia dos o mas formas diferentes, entonces usar la orden File,
Include Unit, tantas veces como sea necesario.
Este procedimiento permite construir programas con dos o mas ventanas, pero el problema
es que todas ellas estarán a la vista del usuario, para resolver este problema, el
procedimiento mas sencillo es poner en False la propiedad visible de la forma o ventana
que se quiera tener oculta y poner cualquiera de las siguientes instrucciones en el código
del programa para que aparezcan o desaparezcan a voluntad;
1. Form2->Visible = true;
2.- Form2->Show(); // similar a la anterior(pero mas corta)
3) Form2->ShowModal(); // no permite accesar la primera ventana, hasta
que se cierra(X) la segunda ventana.
Programación Avanzada permite crear y destruir ventanas y componentes al tiempo de
ejecución del programa, pero estos conocimientos, no forman parte del ámbito de este libro.
Si se tienen formas de mas, o formas que ya no se quieren usar o de plano mal construidas
se pueden remover del proyecto usando el icono (Remove File from Project) de la barra
de herramientas, y de la ventanilla que aparece seleccionar la
UNIDAD que contiene la forma que se quiere eliminar.
TAREAS PROGRAMACION C++BUILDER
1.- REEDITAR TRES CUALESQUIERA DE LOS PROBLEMA YA RESUELTOS
PARA QUE INCLUYAN CUANDO MENOS DOS VENTANAS
2.- CONSTRUIR UN PROGRAMA DONDE LA PRIMERA VENTANA CAPTURE LOS
DATOS DE UN ALUMNO INCLUYENDO LAS CALIFICACIONES DE 3 MATERIAS
DIFERENTES Y UNA SEGUNDA VENTANA DESPLIEGA UN REPORTE DE
CALIFICACIONES DEL ALUMNO INCLUYENDO PROMEDIO FINAL.
UNIDAD II C++BUILDER INSTRUCCIONES DE CONTROL DE PROGRAMA
1.- C++BUILDER INTRODUCCION
Instrucciones de control de programa permiten alterar la secuencia normal de ejecución de
un programa.
Estas instrucciones se dividen en tres grandes categorías:
Instrucciones Condicionales que en C++Builder se implementan con las instrucciones if() y
switch().
Instrucciones de ciclos con: for, while, do while.
Instrucción de salto incondicional: goto
Muchas de ellas con sus correspondientes componentes visuales.
2.- C++BUILDER INSTRUCCIONES CONDICIONALES
Una de las mas poderosas características de cualquier computador es la capacidad que tiene
de tomar decisiones.
Es decir al comparar dos alternativas diferentes el computador puede tomar una decisión,
basándose en la evaluación que hace de alguna condición.
desplegar ―rico‖
desplegar ―pobre‖
fin-si
b)
imprime mujer
imprime hombre
fin-si
De los ejemplos observar que los caminos por el computador dependerán de la evaluación
que el computador hace con y de la condición.
Todo lenguaje de programacion debe tener instrucciones que permitan formar condiciones
e instrucciones que pueden evaluar esas condiciones.
Para propósito de construcción visual de programas, este tipo de instrucciones
condicionales se usaran en forma interna es decir son parte del código del programa que se
empotra dentro de los eventos de componentes, no son formas o componentes en si.
Pero recordar que lenguajes visuales de igual forma tienen componentes que permiten del
mismo modo al usuario tomar decisiones, incluso directamente en pantalla, es decir existen
los llamados componentes de selección y decisión.
El formato general de una instrucción condicional es:
Como se observa son cuatro partes bien diferenciadas entre si;
* La propia instrucción condicional en si * La condición * El grupo cierto de instrucciones
* El grupo falso de instrucciones
Cuando el computador evalúa una condición,, el resultado de esa evaluación solo es
evaluado de dos maneras o la condición es CIERTA o la condición es FALSA.
Esto dependerá del valor que tenga asignado o que se haya capturado para la variable que
esta en la condición, por ejemplo si se capturo 6000 en sueldo en el ejemplo a), entonces el
computador indicaría que la condición es CIERTA, pero en otro caso, si a la variable
sueldo primero se le asigno un valor de 250 entonces el computador indicaría que la
condición, es FALSA.
Ya dependiendo del resultado de la evaluación, el computador ejecuta las instrucciones
contenidas en la parte CIERTA o en la parte FALSA de la condición.
Empezaremos el análisis por la CONDICION.
3.- C++BUILDER CONDICIONES SIMPLES
En general todas las condiciones simples se forman con;
variables operadores relaciónales constante o var.
sexo = m
sueldo > 300,000
Una condición simple se define como el conjunto de variables y/o constantes unidas por los
llamados operadores relaciónales.
Los operadores relaciónales que reconoce el lenguaje C++Builder son:
Operador Significado
'<' Menor que
'>=' Mayor o igual que.
'⇐' Menor o igual que.
'!=' No es igual que, o es diferente que.
Observar y tener cuidado sobre todo con el operador de igualdad ' = ', y el operador
relacional de comparación por igualdad '== ', es decir:
sueldo = 500 Se esta pidiendo cargar o asignar la variable sueldo con el valor 500
sueldo == 500 Se esta pidiendo que se compare el valor o dato que ya esta en la variable
sueldo, contra el numero 500.
Solo este ultimo formato es valido dentro de una condición, en una instrucción condicional.
4.- INSTRUCCION IF C++BUILDER
Es la instrucción condicional mas usada en los diversos lenguajes de programación, su
formato completo y de trabajo en C++Builder es :
Primus.- Observar donde van y donde no van los puntos y comas;
Secundus.- La condición van entre paréntesis ;
Tertius.- Si un if no ocupa un grupo falso de instrucciones, entonces no se pone el else, y la
llave antes del else si terminaría con punto y coma.
Ejemplos:
if (Edit1→Text>==―500‖)
else
{ Edit2→Text=―Pobre‖;};
Solo recordar que en C++Builder es mas fácil comparar datos de tipo string(Texto) que
numéricos, si se quiere hacer una comparación entre números solo comparar el Edit
correspondiente junto con su método(ToInt o ToDouble) y el dato numérico.
TAREAS PROGRAMACION C++BUILDER
1.- Capturar un numero cualesquiera e informar si es o no es mayor de 100
2.- Capturar un numero entero cualesquiera e informar si es o no es múltiplo de 4 ( recordar
el operador mod(%), analizado en el tema de operadores aritméticos).
3.- Capturar los cinco datos mas importantes de un Empleado, incluyendo el sueldo diario y
los días trabajados esto en un panel, desplegarle su cheque semanal en un segundo panel
solo si ganó mas de $500.00 en la semana, en caso contrario desplegarle un bono de
despensa semanal de $150.00 en un tercer panel.
4.- Capturar los datos mas importantes de un estudiante incluyendo tres calificaciones, todo
esto en una ventana, una segunda ventana que contiene una boleta de calificaciones es
llamada si el estudiante es de la carrera de medicina, en caso contrario una tercera ventana
despliega un oficio citando a los padres del estudiante a una platica amistosa con los
maestros dela escuela.
5.- Capturar los datos mas importantes de un producto cualesquiera, incluyendo cantidad,
precio, etc., desplegar una orden de compra, solo si el producto es de origen nacional, en
caso contrario no hacer nada.
5.- CONDICIONES COMPUESTAS C++BUILDER
En muchas ocasiones es necesario presentar mas de una condición para su evaluación al
computador.
Por ejemplo que el computador muestre la boleta de un alumno, si este estudia la carrera de
medicina y su promedio de calificaciones es mayor de 70.
Una condición compuesta se define como dos o mas condiciones simples unidas por los
llamados operadores lógicos.
Los operadores lógicos que C++Builder reconoce son;
operador significado
&& y
! NO
Para que el computador evalúe como CIERTA una condición compuesta que contiene el
operador lógico ―y‖, las dos condiciones simples deben ser ciertas.
Para que el computador evalúe como CIERTA una condición compuesta que contiene el
operador lógico ―o‖, basta con que una de las condiciones simples sea cierta.
La cantidad total de casos posibles cuando se unen dos o mas condiciones simples esta dada
por la relación donde n = cantidad de condiciones, la primera mitad de ellos ciertos y la
segunda mitad falsos.
Ejemplo, si formamos una condiciona compuesta con dos condiciones simples y el
operador lógico ―y‖, la cantidad total de casos posibles serian , y se puede construir
la siguiente tabla de verdad.
Tabla de verdad con ―y‖
1cs 2cs Eval
C C C
C F F
F C F
F F F
La evaluación final, se obtiene usando la regla anteriormente descrita para una condición
compuesta, que contiene el operador ' y '.
Esta tabla significa lo siguiente;
1.- Cualquiera que san la cantidad de datos procesados,, siempre caerá en uno de estos
cuatro posibles casos.
La tabla de verdad para una condición compuesta con ―O‖ es la sig:
1cs 2cs Eval
C C C
C F C
F C C
F F F
Como se observa, una condición compuesta con ' O ', es menos restrictiva, o el 75% de los
casos terminarían ejecutando el grupo CIERTO de instrucciones de la instrucción
condicional.
Construir una tabla de verdad para una condición compuesta de tres o mas condiciones
simples, es también tarea sencilla, solo recordar que;
1.- La cantidad posible de casos es casos posibles, la mitad empiezan con Cierto y la
otra mitad empiezan c con falso.
2.- Para evaluar esta condición triple, primero se evalúan las dos primeras incluyendo su
operador, bajo las reglas ya descritas y luego se evalúa, el resultado parcial contra la ultima
condición, y ultimo operador, para obtener la evaluación final.
Ejemplo una condición compuesta de tres condiciones simples, donde el primer operador
lógico es el ' y ' y el segundo operador lógico es el ' O ', daría la siguiente tabla de verdad.
1cs 'y' 2cs Eva Parcial 'o' 3cs Eva final
C C c C c
C C c F c
C F f C c
C F f F f
F C f C c
F C f F f
F F f C c
F F f F f
En la practica, cada condición simple debe ir encerrada en su propio paréntesis y las dos
condiciones simples también deben encerrarse entre sus propios paréntesis, como en el
siguiente ejemplo;
// se supone que edit1 es el sueldo y edit2 el departamento
// donde trabaja un empleado
if((Edit1->Text.ToDouble()> 500)%%(Edit2->Text=="VENTAS") )
{ // aquí se construye una panel o ventana
// por ejemplo que despliegue su cheque semanal }
{ // aquí se construye o despliega un panel o ventana // que despliegue
por ejemplo un bono de despensa
// o un oficio de motivación } ;
* Recordar, cada condición simple debe estar entre paréntesis y las dos condiciones simples
también deben estar entre paréntesis.
* Observar donde se deben incluir los puntos y comas y donde no se deben incluir los
puntos y comas.
TAREAS PROGRAMACION C++BUILDER
1.- Construir un programa que capture un numero cualesquiera e informe si es o no es
mayor de 50 y múltiplo de tres. ( solo escribir el mensaje de respuesta de manera muy clara
y esto resuelve el problema )
2.- Construir un programa que indique si un numero es un par positivo.
3.- Capturar los datos de un producto incluyendo su cantidad en existencia, construir un
panel que despliegue una orden de compra si la cantidad en existencia del producto es
menor que el punto de reorden, o si el origen del producto es nacional.
4.- Construir el programa del ejemplo del empleado, pero construirlo con tres ventanas, la
del empleado, la del cheque y la del bono.
6.- INSTRUCCION SWITCH C++BUILDER
También existen ocasiones o programas donde se exige evaluar muchas condiciones a la
vez, en estos casos, o se usan una condición compuesta muy grande o se debe intentar
convertir el problema a uno que se pueda resolver usando la instrucción switch();
La instrucción switch() es una instrucción de decisión múltiple, donde el compilador prueba
o busca el valor contenido en una variable contra una lista de constantes ints o chars,
cuando el computador encuentra el valor de igualdad entre variable y constante, entonces
ejecuta el grupo de instrucciones asociados a dicha constante, si no encuentra el valor de
igualdad entre variable y constante, entonces ejecuta un grupo de instrucciones asociados a
un default, aunque este ultimo es opcional.
El formato de esta instrucción es el siguiente;
capturar o asignar variable de condición;
{
};
Recordar que la propiedad Text de cualquier componente, puede usar o accesar cualquier
[posición o carácter] usando los corchetes por ejemplo;
Label3→Caption = Edit4→Text[2]; pasa solo la 'u' al caption
Mejor un ejemplo practico;
void __fastcall TForm1::Button1Click(TObject *Sender)
{
modulo de switch { }; } ——————————————– Notas: 1.- Solo se puede usar
como variable de condición una variable entera o variable char. 2.- Se esta usando como
variable de condición, solo la primera letra o carácter de la caja de edición, que es
equivalente a una variable char. 3.- Observar que usando corchetes ej. [posición] en la
propiedad Text, se puede referenciar o procesar cualquier carácter dentro del Texto. 4.-
Las constantes que estamos buscando y comparando son de tipo char, por eso se deben
encerrar entre apóstrofes ( ' ). 5.- Si se quiere resolver el problema de mayúsculas o
minúsculas en el teclado, observar que se usan dos case, pero con un solo break; 6.-
Recordar que switch() solo trabaja con constantes y variables de tipo char o int, en este
ultimo caso; Usar switch(Edit1→Text.ToInt() ) Y en los case poner la constante numérica,
sin apóstrofes, es decir por ejemplo case 5: Edit3→Text=―camello‖; break; En particular,
instrucciones de tipo switch() se utilizaban para construir programas de selección de
menús, donde al usuario se le planteaban dos o tres problemas distintos y el propio usuario
seleccionaba cual de ellos quería ejecutarse. TAREAS PROGRAMACION C++BUILDER
1.- Construir una ventana que contenga el siguiente menú ———————— 1. conversión
de pesos a dólares 2. conversión de libras a kilogramos 3. conversión de kilómetros a
millas 4. fin de menú ————————— seleccionar opción [ ] ←- Este es el edit del
switch(). Para resolver este programa, primero diseñar las cuatro formas o ventanas que
se ocupan, y en la primera forma que contiene el menú para el usuario, programar el
evento onclick del Button de ordenes con la instrucción switch(), los case solo contienen
código para llamar o poner a la vista del usuario la ventana o forma respectiva. Y además
recordar poner en cada ventana de solución de un problema un botón de orden, con código
de regreso a la ventana de menú, solo escribir en el Caption de este botón la palabra
[menú] y en su evento OnClick ocultar la ventana de problema y poner visible la ventana o
forma del menú. 2.- Construir un programa que capture un deporte y despliegue dos
implementos deportivos apropiados. 3.- Evaluar cualquier función vista para cuando x
=3,-4, 5
7.- C++BUILDER COMPONENTES VISUALES DE SELECCION Y DECISIÓN
Las instrucciones if y switch(), nos permiten tomar decisiones o realizar seleccionase
dentro del código de un programa.
C++Builder proporciona una serie de componentes visuales que permiten al usuario, no al
programador, tomar decisiones en pantalla, el programador solo se encarga de implantar
código adecuado a la decisión tomada por el usuario.
8.- C++BUILDER COMPONENTE CheckBox (Standard)
El componente CheckBox, permite seleccionar una opción al usuario del programa o tomar
una decisión, directamente en pantalla.
Es la propiedad Text del componente donde se escribe sentido de la selección ej.;
En los ejemplos, los componentes checkbox, son las cajas donde el usuario toma un
decisión (ej. 3) o realiza una selección (ej. 1,2)
Existen dos maneras de programar este componente:
1. Cuando el usuario selecciona un checkbox la propiedad Checked refleja esta decisión
quedando cargada con las constantes true o false, en estos casos solo validar con un if por
cada CheckBox dentro de nuestro botón de ordenes, el estado de dicha propiedad.
ej.;
if ( CheckBox5→Checked == true){código};
if (CheckBox2→Checked = = true){código);
1. Para el ejemplo c) el botón de ordenes en la forma o ventana respectiva usando el método
anterior , contendría 3 ifs, uno para construir boleta otro para construir citatorio y otro para
construir un diploma.
2. El segundo método para programar el componente, involucra el evento OnClick de este
componente CheckBox, este evento OnClick es activado automáticamente en cuanto el
usuario realiza o marca o toma su selección, es claro que si no se programa este evento el
usuario no observara ningún proceso, sino que tendrá que indicar que ya hizo su decisión,
apretando el botón de OK.
Pero si se programa el evento OnClick de este componente con el código adecuado, ni se
tendrá que agregar un botón OK, ni se ocupara usar un if(Checked), porque el usuario ya
indico cual es su decisión o selección.
Recordar que para programar este evento OnClick, solo hacer un dobleclick, dentro del
componente.
Este método es el mejor porque evita código de mas y cada componente solo tiene asociado
el código que ocupa.
TAREAS PROGRAMACION C++BUILDER
1.- Evaluar la función para xà 2,-5, 8 (usar un CheckBox por cada valor de
x, y programar cada evento OnClick de cada CheckBox con la operación correspondiente y
el despliegue del resultado).
2.- Construir un panel con los datos de un automóvil, un segundo panel muestra un plan de
financiamiento a dos años y un tercer panel muestra un plan de financiamiento a tres años. (
son dos checkbox en el primer panel y no hay botón de ok).
3.- Construir el programa de menú, que se dejo en el tema de instrucción switch(). ( aquí no
se ocupa switch() ni pedir la opción, ni botón de ok, solo un CheckBox programado a un
lado de cada opción del menú).
9.- C++BUILDER COMPONENTE RadioButton ( Standard )
Se utilizan para presentar al usuario un conjunto de opciones mutuamente excluyentes entre
si, es decir si el usuario selecciona un componente RadioButton todos los demás
componentes RadioButton en la forma, se desmarcan solos, o se deseleccionan solos, como
mejor se entienda.
Es su propiedad Caption donde se pone el texto que identifica el propósito del botón, es su
propiedad Checked quien refleja el cambio( True , False ),también su evento onclick es
activado automáticamente cada vez que es seleccionado el RadioButton por el usuario.
Recordar también que cuando el usuario selecciona un RadioButton, todos los demás
RadioButton en el objeto(forma o ventana) son deseleccionados automáticamente, esto es
por que dos RadioButton son mutuamente excluyentes entre si.
Esta ultima situación deberá resolverse por parte del programador, es decir se supone un
programa donde el usuario debe seleccionar uno de entre dos sexos y uno de entre cinco
municipios, en este caso se ocupan ocho RadioButton, pero como todos son mutuamente
excluyentes entre si, cuando el usuario seleccione uno de ellos, todos los demás se
desmarcaran automáticamente.
Para resolver este problema se deberá usar los ya ampliamente conocidos y practicados
componentes de agrupamiento, como son el componente Panel y el componente GroupBox.
Es decir se deberá encerrar en su propio panel o GroupBox todos los RadioButton lógicos,
es decir en un Panel los de sexo, en otro Panel los de municipios, etc.
De esta manera C++Builder los evalúa por separado y se puede tener seleccionado un
RadioButton en cada Panel.
TAREAS PROGRAMACION C++BUILDER
1.- Diseñar y construir tres problemas similares a los resueltos con el componente
CheckBox.
13.- C++BUILDER Ciclo FOR
Instrucciones para ciclos, resuelven el problema de repetir todo el programa, o cierta parte
del programa mas de una vez.
Este ciclo es uno de los mas usados para repetir una secuencia de instrucciones, sobre todo
cuando se conoce la cantidad exacta de veces que se quiere que se ejecute una instrucción
simple o compuesta.
En su forma simple la inicialización es una instrucción de asignación que carga la variable
de control de ciclo con un valor inicial.
La condición es una expresión relacional que evalúa la variable de control de ciclo contra
un valor final o de parada que determina cuando debe acabar el ciclo.
El incremento define la manera en que la variable de control de ciclo debe cambiar cada
vez que el computador repite un ciclo.
Se deben separar esos 3 argumentos con punto y coma ;
Casos Particulares;
1.- El ciclo comienza en uno y se incrementa de uno en uno, este es el caso mas general.
2.- Pero el valor inicial puede se diferente de uno, ejemplo;
for(x=5;x⇐15;x=x+1){ etc.};
3.- Incluso el valor inicial puede ser negativo, ejemplo;
4.- Los incrementos también pueden ser diferentes al de uno en uno, ej.;
for (x=1; x⇐ 20; x=x+3){ etc. };
5.- Incluso pueden ser decrementos, solo que en este caso, recordar;
El valor inicial de la variable debe ser mayor que el valor final.
Cambiar el sentido de la condición.
ejemplo: for (x= 50 ; x >= 10; x= x-4 ) { etcétera };
6.- Solo para los casos de incrementos y decrementos de una en una
UNIDAD, substituir en el for;
el x = x + 1 por x++
el x = x - 1 por x–
7.- Un ejemplo para usarlo en los problemas sugeridos mas adelante;
ejemplo;
desplegar los números enteros, comprendidos entre el 10 y el 20.
Ocupamos ahora un componente que pueda almacenar y desplegar un conjunto de los 10
resultados, el único componente visto hasta ahora con esta capacidad es el componente
ComboBox, sin embargo existe otro componente llamado ListBox(Standard), muy similar a
ComboBox, excepto que no tiene encabezado y todos sus elementos los mantiene a la vista
del usuario, no ocultos como el ComboBox, dicho componente ListBox se analiza a fondo
en la siguiente
UNIDAD, pero es el que de momento permite resolver el problema del for (desplegar un
conjunto de resultados a la vez).
Tanto ComboBox como ListBox permiten cargar todos sus elementos o valores, dentro de
un programa, usando un método llamado Add(valor) en su propiedad Items, como se ve en
el siguiente programa ejemplo;
Para este problema se ocupa poner en Form1, un componente Button OK que en su evento
OnClick contiene el for y la carga del componente ListBox, con el siguiente;
1. Pantalla de diseño
Programa
void __fastcall TForm1::Button1Click(TObject *Sender)
{
//declaración
int x;
// ciclo for
for (x=10; x<= 20 ; x++)
{ ListBox1->Items->Add(x); };
}
1. La pantalla de salida debe ser igual o parecida a la siguiente;
Este procedimiento y método igualmente trabaja con un componente ComboBox.
Practicar hasta conseguir tener esta pantalla de salida o de ejecución, cuando se consiga
entonces ya se esta listo para lo siguiente;
TAREAS PROGRAMACION C++BUILDER
1.- CONSTRUIR UN PROGRAMA QUE DESPLIEGUE LOS NUMEROS DEL 20 AL
30.
2.- DESPLEGAR LOS ENTEROS ENTRE 50 Y 30 ACOMPAÑADOS DE SU
POTENCIA CUADRADA Y RAIZ CUBICA RESPECTIVA ( OCUPA TRES ListBox).
3.- DESPLEGAR UNA TABLA DE MULTIPLICAR QUE EL USUARIO INDIQUE .
14.- C++ BUILDER CICLO WHILE
En este ciclo el cuerpo de instrucciones se ejecuta mientras una condición permanezca
como verdadera, en el momento en que la condición se convierte en falsa el ciclo termina.
Su formato general es :
cargar o inicializar variable de condición;
while (condición)
{
grupo cierto de instrucciones;
instrucción(es) para salir del ciclo;
};
Ejemplo #1 :
x=1;
while(x⇐10)
{ListBox1→Items→Add(―pato‖);
x++; };
While puede llevar dos condiciones, en este caso inicializar 2 variables de condición y
cuidar que existan 2 de rompimiento de ciclo.
El grupo cierto de instrucciones puede ser una sola instrucción o todo un grupo de
instrucciones.
La condición puede ser simple o compuesta.
A este ciclo también se le conoce también como ciclo de condición de entrada prueba por
arriba, porque este ciclo evalúa primero la condición y posteriormente ejecuta las
instrucciones.
TAREAS PROGRAMACION C++BUILDER
1.- DESPLEGAR ENTEROS ENTRE 50 Y 80
2.- DESPLEGAR MULTIPLOS DE 4 ENTRE 60 Y 20 ACOMPAÑADOS DE SU
LOGARITMOS DE BASE 10 Y BASE e RESPECTIVOS ( A REVISAR LA AYUDA Y
BUSCAR LAS FUNCIONES MATEMATICAS QUE ESTAN LA LIBRERIA
<MATH.H>
3.- CONSTRUIR LA TABLA DE DIVIDIR QUE EL USUARIO INDIQUE.
15.- C++BUILDER CICLO DO WHILE
Su diferencia básica con el ciclo while es que la prueba de condición es hecha al finalizar el
ciclo, es decir las instrucciones se ejecutan cuando menos una vez, porque primero ejecuta
las instrucciones y al final evalúa la condición;
También se le conoce por esta razón como ciclo de condición de salida.
Su formato general es :
ejemplo:
x=1;
{ ListBox1→Items-Add(―pato‖);
x++; }while(x⇐10);
Otra diferencia básica con el ciclo while es que, aunque la condición sea falsa desde un
principio, el cuerpo de instrucciones se ejecutara por lo menos una vez.
TAREAS PROGRAMACION C++BUILDER
16.- C++BUILDER CONCLUSIONES ACERCA DE CICLOS
El problema de dado un problema cualesquiera, cual ciclo se debe usar se resuelve con:
Si se conoce la cantidad exacta de veces que se quiere que se ejecute el ciclo o si el
programa de alguna manera puede calcularla usar for. Si se desconoce la cantidad de veces
a repetir el ciclo o se quiere mayor control sobre la salida o terminación del mismo
entonces usar while. Si se quiere que al menos una vez se ejecute el ciclo entonces usar do
while.
17.- INSTRUCCION DE SALTO INCONDICIONAL, ETIQUETAS O GOTO
Esta instrucción fue una de las favoritas de la com
UNIDAD de programadores hace 20 años, en la actualidad la aparición de nuevas
estructuras o instrucciones de programación hacen innecesario su uso.
El uso principal que se le dio, acompañada de una instrucción if fue la de simular ciclos
condicionales.
Esta instrucción requiere una llamada etiqueta que es un identificador valido de lenguaje
C++ seguida de dos puntos.
ejemplo:
button1_onclick{
x++;
if(x⇐10) goto alfa;
}
TAREAS PROGRAMACION C++BUILDER
1.- LAS TABLAS DE SUMAR, Y MULTIPLICAR CON IF-GOTO
10.- COMPONENTE RadioGroup ( Standard ) C++BUILDER
Aunque es común agrupar un conjunto de RadioButton dentro de componentes Panel Y
RadioGroup, C++Builder proporciona este componente RadioGroup que esta especializado
en la agrupación de RadioButton.
Un componente u objeto RadioGroup es una caja especial que solo contiene componentes
RadioButton, también cuando el usuario marca o selecciona uno de ellos, todos los demás
se desmarcan o deseleccionan .
Para añadir los RadioButton a el componente RadioGroup, solo editar la propiedad Items
en el Inspector de Objetos, que entonces nos muestra el minieditor de strings ya visto y
practicado en el tema de ListBox, solo recordar que cada renglón en el editor corresponderá
a un RadioButton dentro del RadioGroup.
Para procesar o programar el RadioButton seleccionado por el usuario, solo usar la
propiedad ItemIndex que queda cargada con el numero de RadioButton seleccionado por el
usuario.
Este código deberá usarse dentro del evento OnClick de un componente Button(OK).
ejemplo ————————————————————-
if(Form5→RadioGroup3→ItemIndex==4){ código a ejecutar si el usuario selecciono el
RadioButton 4 del RadioGroup 3 etc. }; ——————————————————– También
se pueden desplegar los botones en una o mas columnas, usando la propiedad Columns en
el Inspector de Objetos, para indicarle cuantas columnas de RadioButton se quieren
manejar. TAREAS PROGRAMACION C++BUILDER 1.- CAPTURAR LOS CINCO
DATOS MAS IMPORTANTES DE UN CLIENTE, USANDO RadioButton PARA LAS
RESPUESTAS, UN SEGUNDO PANEL ABAJO EN LA FORMA DESPLIEGA EN
COMPONENTES NORMALES EDIT O LABEL LAS SELECCIONES DEL USUARIO 2.-
CONSTRUIR UN CUESTIONARIO DE 6 PREGUNTAS SOBRE LOS HABITOS DE
ESTUDIO DE UN ESTUDIANTE. 3.- CONSTRUIR UN CUESTIONARIO DE 5
PREGUNTAS CON LAS PREFERENCIAS POLITICAS DE UNA PERSONA, UN PANEL
ABAJO DESPLIEGA UN CONCENTRADO CON TOTALES Y PORCENTAJES
ACUMULADOS POR CADA PREGUNTA. ES DECIR UN USUARIO RESPONDE EL
CUESTIONARIO APRIETA EL BOTON DE OK, EL PANEL DE ABAJO SE ACTUALIZA
PARA MOSTRAR TOTALES Y PORCIENTOS DE CADA PREGUNTA, Y SE LIMPIAN
LAS RESPUESTAS, UN SEGUNDO USUARIO RESPONDE EL CUESTIONARIO…. Y ASI
SUCESIVAMENTE. * PARA TOTALES Y PORCENTAJES, SOLO RECORDAR DOS DE
LOS CONCEPTOS MAS ELEMENTALES DE PROGRAMACION BASICA.
CONTADORES: CONT=CONT+1 RESULTADO 1, 2, 3,4,5, ……. ACUMULADORES:
ACUM = ACUM + CONT RESULTADO CON EL EJEMPLO DE ARRIBA 1,3,4,10,15
RECORDAR LAS CAJAS EDIT→TEXT.TOINT() TAMBIEN PUEDEN FUNCIONAR
COMO CONTADORES O ACUMULADORES. NO SE OCUPA CONVERTIRLAS A
VARIABLES, TRABAJARLAS DIRECTAMENTE
11.- COMPONENTE MainMenu C++BUILDER ( Standard )
Con este componente MainMenu se forman las barras de menú normales en cualquier
programa de Windows (la barra que contiene File, Edit, etc.) junto con sus opciones
correspondientes.
Cuando se pone este componente en una forma, se deberá entender que form1 ahora
mostrara o desplegara una barra de menú, tal como si fuese una ventana normal de
Windows.
Para construir un programa de selección de menú;
1.- Poner un componente MainMenu en una parte de la forma donde no estorbe (esto es
porque este componente queda flotando dentro de Form1 y solo activa o se convierte en
barra de menú al momento de ejecución del programa).
2.- Para cargarle las opciones, no del código que ejecutara cada opción, solo dobleclick
dentro de este componente para que aparezca el siguiente diseñador de menús.
1.- No es Form1, es una forma especial que se parece mucho, pero solo se activa cuando se
hace un dobleclick en un componente MainMenu.
2.- La barra superior es el menú, cada opción del menú ( Moneda, Temperatura, Distancias,
etc.) tienen sus propias subopciones o submenus.
3.- Para escribir las opciones( Moneda, Temperatura, etc.) primero hacer un click en la
parte correspondiente (en el lugar que ocupan o donde se desplegaran) y escribir en la
propiedad Caption del Inspector de Objetos la palabra correspondiente.
4.- Para escribir las subopciones, primero hacer click en la opción correspondiente ( por
ejemplo en la parte donde esta la palabra Distancias) y ya aparece abajo de ella la primera
subopcion marcada y seleccionada (es un cuadrito que se pone abajo de Distancias) y
escribir en el Caption Del Inspector de Objetos la palabra adecuada a la subopcion
correspondiente (ejemplo Millas-Kms), al escribir y usar tecla <ENTER> en el caption ya
aparece el cuadrito de la segunda subopcion.
5.- Para marcar una letra de una opción o subopcion como HotKey ( lo siento no se pudo
traducir), solo poner el signo & antes de la letra correspondiente.
6.- Con los pasos 3,4,5 ya queda construido el menú, pero ahora falta cargarles el código o
programa a ejecutar por y a cada opción o subopcion del menú, recordar que estos eventos
también se activan al hacer un click el usuario en cada opción o a seleccionar la primera
letra(si se uso el &), para cargar código entonces.
7.- Solo dobleclick en la opción o subopcion correspondiente y ya aparece el minieditor de
programas, listo con el evento OnClick de la opción o subopcion correspondiente.
8.- El código a escribir en la mayor parte de los casos, solo consiste en ocultar la ventana
principal y llamar la ventana que contendrá el programa correspondiente a la opción
deseada.
9.- Para terminar y regresar a la forma principal solo click en la X del diseñador de menús.
TAREAS PROGRAMACION C++BUILDER
1.- EL DE LA MUESTRA CON DOS CONVERSIONES MONETARIAS, DOS
OPCIONES DE TEMPERATURAS Y DOS DE DISTANCIAS.
* PRIMERO DISEÑAR Y CONSTRUIR TODAS LAS FORMAS QUE VA A OCUPAR *
NO OLVIDE PONER ALGUNAS LABELS DE ENCABEZADO EN LA VENTANA
PRINCIPAL
EN EL BOTON OK O EN OTRO BOTON SIMILAR DE CADA VENTANA DE
TRABAJO NO OLVIDAR AGREGAR CODIGO PARA OCULTAR DICHA VENTANA
Y REGRESAR A LA VENTANA CON EL MENU PRINCIPAL.
12.- COMPONENTE PopupMenu C++BUILDER (Standard)
Este componente encapsula propiedades, métodos y eventos de un menú popup, este
minimenu se activa cuando el usuario hace un click derecho en muchos componentes que lo
pueden contener.
Un ejemplo;
Recordar que este componente PopupMenu se tiene que pegar a otro componente, por
ejemplo un Label o un Edit, etc.
Para crear un PopupMenu, solo seleccionar el componente PopupMenu en la barra de
componentes y ponerlo en una parte de la forma donde no estorbe (también queda
flotando).
Para cargarlo de opciones solo dobleclick en dicho componente e igual que en componente
MainMenu, sale el minieditor, click en la parte donde va la opción escrita y escribir la
palabra en la propiedad Caption del Inspector de Objetos.
Para cargarle el código a cada opción , solo dobleclick en la opción correspondiente.
Para salirse del minieditor, solo click en la [X] de arriba.
Por ultimo y muy importante, recuerde que se tiene que pegar a un componente
cualesquiera, para esto solo seleccionar el componente y click en la propiedad popup del
componente, sale la lista con todos los componentes PopupMenu que ya se hayan
construidos.
TAREAS PROGRAMACION C++BUILDER
1.- CONSTRUIR UN MENU CON LAS SIGUIENTES OPCIONES:
[AUTOS] ß FINANCIAMIENTO A 2,3,4 años
[LAVADORAS] ß FINANCIAMIENTO A 2,3 años
13.- C++BUILDER Ciclo FOR
Instrucciones para ciclos, resuelven el problema de repetir todo el programa, o cierta parte
del programa mas de una vez.
Este ciclo es uno de los mas usados para repetir una secuencia de instrucciones, sobre todo
cuando se conoce la cantidad exacta de veces que se quiere que se ejecute una instrucción
simple o compuesta.
En su forma simple la inicialización es una instrucción de asignación que carga la variable
de control de ciclo con un valor inicial.
La condición es una expresión relacional que evalúa la variable de control de ciclo contra
un valor final o de parada que determina cuando debe acabar el ciclo.
El incremento define la manera en que la variable de control de ciclo debe cambiar cada
vez que el computador repite un ciclo.
Se deben separar esos 3 argumentos con punto y coma ;
Casos Particulares;
1.- El ciclo comienza en uno y se incrementa de uno en uno, este es el caso mas general.
2.- Pero el valor inicial puede se diferente de uno, ejemplo;
for(x=5;x⇐15;x=x+1){ etc.};
3.- Incluso el valor inicial puede ser negativo, ejemplo;
4.- Los incrementos también pueden ser diferentes al de uno en uno, ej.;
for (x=1; x⇐ 20; x=x+3){ etc. };
5.- Incluso pueden ser decrementos, solo que en este caso, recordar;
El valor inicial de la variable debe ser mayor que el valor final.
Cambiar el sentido de la condición.
ejemplo: for (x= 50 ; x >= 10; x= x-4 ) { etcétera };
6.- Solo para los casos de incrementos y decrementos de una en una
UNIDAD, substituir en el for;
el x = x + 1 por x++
el x = x - 1 por x–
7.- Un ejemplo para usarlo en los problemas sugeridos mas adelante;
ejemplo;
desplegar los números enteros, comprendidos entre el 10 y el 20.
Ocupamos ahora un componente que pueda almacenar y desplegar un conjunto de los 10
resultados, el único componente visto hasta ahora con esta capacidad es el componente
ComboBox, sin embargo existe otro componente llamado ListBox(Standard), muy similar a
ComboBox, excepto que no tiene encabezado y todos sus elementos los mantiene a la vista
del usuario, no ocultos como el ComboBox, dicho componente ListBox se analiza a fondo
en la siguiente
UNIDAD, pero es el que de momento permite resolver el problema del for (desplegar un
conjunto de resultados a la vez).
Tanto ComboBox como ListBox permiten cargar todos sus elementos o valores, dentro de
un programa, usando un método llamado Add(valor) en su propiedad Items, como se ve en
el siguiente programa ejemplo;
Para este problema se ocupa poner en Form1, un componente Button OK que en su evento
OnClick contiene el for y la carga del componente ListBox, con el siguiente;
1. Pantalla de diseño
Programa
void __fastcall TForm1::Button1Click(TObject *Sender)
{
//declaración
int x;
// ciclo for
for (x=10; x<= 20 ; x++)
{ ListBox1->Items->Add(x); };
}
1. La pantalla de salida debe ser igual o parecida a la siguiente;
Este procedimiento y método igualmente trabaja con un componente ComboBox.
Practicar hasta conseguir tener esta pantalla de salida o de ejecución, cuando se consiga
entonces ya se esta listo para lo siguiente;
TAREAS PROGRAMACION C++BUILDER
1.- CONSTRUIR UN PROGRAMA QUE DESPLIEGUE LOS NUMEROS DEL 20 AL
30.
2.- DESPLEGAR LOS ENTEROS ENTRE 50 Y 30 ACOMPAÑADOS DE SU
POTENCIA CUADRADA Y RAIZ CUBICA RESPECTIVA ( OCUPA TRES ListBox).
3.- DESPLEGAR UNA TABLA DE MULTIPLICAR QUE EL USUARIO INDIQUE .
14.- C++ BUILDER CICLO WHILE
En este ciclo el cuerpo de instrucciones se ejecuta mientras una condición permanezca
como verdadera, en el momento en que la condición se convierte en falsa el ciclo termina.
Su formato general es :
cargar o inicializar variable de condición;
while (condición)
{
grupo cierto de instrucciones;
instrucción(es) para salir del ciclo;
};
Ejemplo #1 :
x=1;
while(x⇐10)
{ListBox1→Items→Add(―pato‖);
x++; };
While puede llevar dos condiciones, en este caso inicializar 2 variables de condición y
cuidar que existan 2 de rompimiento de ciclo.
El grupo cierto de instrucciones puede ser una sola instrucción o todo un grupo de
instrucciones.
La condición puede ser simple o compuesta.
A este ciclo también se le conoce también como ciclo de condición de entrada prueba por
arriba, porque este ciclo evalúa primero la condición y posteriormente ejecuta las
instrucciones.
TAREAS PROGRAMACION C++BUILDER
1.- DESPLEGAR ENTEROS ENTRE 50 Y 80
2.- DESPLEGAR MULTIPLOS DE 4 ENTRE 60 Y 20 ACOMPAÑADOS DE SU
LOGARITMOS DE BASE 10 Y BASE e RESPECTIVOS ( A REVISAR LA AYUDA Y
BUSCAR LAS FUNCIONES MATEMATICAS QUE ESTAN LA LIBRERIA
<MATH.H>
3.- CONSTRUIR LA TABLA DE DIVIDIR QUE EL USUARIO INDIQUE.
15.- C++BUILDER CICLO DO WHILE
Su diferencia básica con el ciclo while es que la prueba de condición es hecha al finalizar el
ciclo, es decir las instrucciones se ejecutan cuando menos una vez, porque primero ejecuta
las instrucciones y al final evalúa la condición;
También se le conoce por esta razón como ciclo de condición de salida.
Su formato general es :
ejemplo:
x=1;
{ ListBox1→Items-Add(―pato‖);
x++; }while(x⇐10);
Otra diferencia básica con el ciclo while es que, aunque la condición sea falsa desde un
principio, el cuerpo de instrucciones se ejecutara por lo menos una vez.
TAREAS PROGRAMACION C++BUILDER
16.- C++BUILDER CONCLUSIONES ACERCA DE CICLOS
El problema de dado un problema cualesquiera, cual ciclo se debe usar se resuelve con:
Si se conoce la cantidad exacta de veces que se quiere que se ejecute el ciclo o si el
programa de alguna manera puede calcularla usar for. Si se desconoce la cantidad de veces
a repetir el ciclo o se quiere mayor control sobre la salida o terminación del mismo
entonces usar while. Si se quiere que al menos una vez se ejecute el ciclo entonces usar do
while.
17.- INSTRUCCION DE SALTO INCONDICIONAL, ETIQUETAS O GOTO
Esta instrucción fue una de las favoritas de la com
UNIDAD de programadores hace 20 años, en la actualidad la aparición de nuevas
estructuras o instrucciones de programación hacen innecesario su uso.
El uso principal que se le dio, acompañada de una instrucción if fue la de simular ciclos
condicionales.
Esta instrucción requiere una llamada etiqueta que es un identificador valido de lenguaje
C++ seguida de dos puntos.
ejemplo:
button1_onclick{
x++;
if(x⇐10) goto alfa;
}
TAREAS PROGRAMACION C++BUILDER
1.- LAS TABLAS DE SUMAR, Y MULTIPLICAR CON IF-GOTO
III UNIDAD C++ BUILDER ARREGLOS
1.- INTRODUCCION C++BUILDER
Uno de los problemas mas comunes en los diversos sistemas de información, es el
tratamiento o procesamiento de una gran volumen de datos o de información.
Variables o componentes visuales manejados hasta ahora, no pueden ayudar a resolver este
problema.
Las variables usadas hasta ahora reciben propiamente el nombre de variables escalares,
porque solo permiten almacenar o procesar un dato a la vez.
No confundir esto con el tipo de dato o rango de datos que una variable tiene la capacidad
de almacenar.
Por ejemplo si se quiere almacenar nombre y edad de 15 personas, con el método
tradicional se ocuparan 30 variables o 30 componentes visuales, y solo es nombre y edad de
15 personas, agreguen mas datos y mas personas y ya es tiempo de empezar a analizar otro
tipo de variables y de componentes.
Es decir, en problemas que exigen manejar mucha información o datos a la vez, variables
escalares o componentes visuales de manipulación de datos normales (edit, label, etc.), no
son suficientes, ya que su principal problema es que solo permiten almacenas un dato a la
vez.
Se ocupa entonces variables o sus correspondientes componentes visuales que sean capaces
de almacenar y manipular conjuntos de datos a la vez.
Variables de tipo arreglo y sus correspondientes componentes visuales, si permiten
almacenar y procesar conjuntos de datos del mismo tipo a la vez.
Cada dato dentro del arreglo, se le llama elemento del arreglo y se simboliza y
procesa(captura ,operación ,despliegue ), usando el nombre del arreglo respectivo y un
subíndice indicando la posición relativa del elemento con respecto a los demás elementos
del arreglo, solo recordar que en C++Builder la primera posición, elemento o renglón es la
0 (cero), ej.
NOMBRES
Juan
Pedro —> Nombres[1]
José
Ana —→ Nombres[3]
Carmen
EDAD
18 —> Edad[0]
20
25
30 —> Edad[3]
Sin embargo sus problemas son similares a los de variables normales, es decir hay que
declararlos, capturarlos, hacer operaciones con ellos, desplegarlos, compararlos, etc.
Para propósitos del aprendizaje se analiza o clasifican en tres grupos diferentes los arreglos
que ofrece C++Builder, ellos son;
1.- Arreglos tradicionales en C++ (internos dentro del programa)
2.- Nuevos Arreglos de C++ (Son CLASES e internos dentro del programa)
3.- Componentes Visuales de tipo Arreglo
2.- ARREGLOS TRADICIONALES EN C++BUILDER
En programación tradicional siempre se manejan dos tipos de arreglos, los arreglos tipo
listas, vectores o unidimensionales y los arreglos tipo tablas, cuadros, concentrados,
matrices o bidimensionales, en ambos casos son variables que permiten almacenar un
conjunto de datos del mismo tipo a la vez, su diferencia es en la cantidad de columnas que
cada uno de estos tipos contiene, como en los siguientes ejemplos;
1. ARREGLOS TIPO LISTA
Juan
Pedro —> Nombres[1]
José
Ana —> Nombres[3]
Carmen
18 —> Edad[0]
20
25
30 —> Edad[3]
1. ARREGLOS TIPO TABLAS
CIA ACME
ING MENS VTAS
(MILES DE $)
ENE FEB MAR ABR MAY
SUC A 10 12 15 10 9
SUC B 8 7 5 9 6
SUC C 11 18 20 14 17
INST TECN DE TIJUANA
CONCENTRADO DE CALIF
MAT FIS QUIM HIST
JUAN 5 5 5 5
JOSE 4 4 4 4
PEDRO 3 3 3 3
ANA 9 9 9 9
Como se observa, la diferencia principal entre un arreglo tipo lista, y un arreglo tipo tabla,
son las cantidades de columnas que contienen.
NOTA IMPORTANTE.- LOS CONCEPTOS MANEJADOS AQUI ESTAN
ENFOCADOS A LOS SISTEMAS DE INFORMACION CONTABLES FINANCIEROS
ADMINISTRATIVOS
EN ALGEBRA MATRICIAL, SI SON IMPORTANTES LOS CONCEPTOS DE
VECTORES Y MATRICES, PERO LAS OPERACIONES Y METODOS SON
PRECISAMENTE LOS DEL ALGEBRA MATRICIAL Y NO ES PROPOSITO O
LUGAR INDICADO PARA TRATAR PROBLEMAS Y OPERACIONES CON
MATRICES.
3.- ARREGLOS TIPO LISTA C++BUILDER
Un arreglo tipo lista se define como una variable que permite almacenar un conjunto de
datos del mismo tipo organizados en una sola columna y uno o mas renglones.
También reciben el nombre de vectores en álgebra, o arreglos unidimensionales en
programación.
Los procesos normales con una lista o con sus elementos, incluyen declarar toda la lista,
capturar sus elementos, desplegarlos, realizar operaciones con ellos, desplegarlos, etc.
Para declarar una lista se usa el siguiente formato;
tipodato nomlista[cant de elementos o renglones];
ejemplos;
int edades[12];
float sueldos[10];
AnsiString municipios[5];
notas:
Si un solo botón, en toda la ventana va a realizar, todos los procesos ( declaración, captura,
operaciones, comparaciones, despliegue), con la lista, solo hacer la declaración de la lista,
al principio del evento onclick, como lo muestra el programa ejemplo.
Recordar también que la primera posición o renglón en una lista es la posición o renglón 0
(cero).
El dato capturado, proviene de momento de un componente visual escalar y por tanto para
capturas se deben de usar tantos componentes visuales como elementos tenga la lista,
ejemplo para capturar una lista de 4 edades, el código y pantalla se da un poco mas
adelante;
1. Programa
void __fastcall TForm1::Button1Click(TObject *Sender)
{ // declaración
int edad[4];
// carga o captura del arreglo
edad[0]=Edit1->Text.ToInt();
edad[1]=Edit2->Text.ToInt();
edad[2]=Edit3->Text.ToInt();
edad[3]=Edit4->Text.ToInt();
}
2. Pantalla de corrida
Para el caso de operaciones y comparaciones con todos los elementos de la lista a la vez, se
deberá usar un ciclo for con una variable entera llamada renglón, misma que también se
usara como índice de la lista, para el problema ejemplo, suponer que se quieren convertir
todas las edades a meses, el código seria;
{ // declaración
// carga o captura del arreglo
// conversión a meses
for(renglon=0;renglon<=3;renglon++)
{ edad[renglón]=edad[renglón]*12; };
}
Recordar que todos los datos internos de la lista estarán almacenados en la memoria ram
del computador, para despliegues se usara un componente visual que permite manipular un
conjunto de datos a la vez, el ListBox, pero se tiene que usar un ciclo for() para ir
añadiendo o agregando elemento por elemento como se observa en el problema ejemplo
que se ha venido desarrollando, en este caso se quiere desplegar las cuatro edades
convertidas a meses;
código y pantalla de salida son;
void __fastcall TForm1::Button1Click(TObject *Sender) {
// declaración
int edad[4];
int renglón;
// carga o captura del arreglo
// conversión a meses
{ edad[renglón]=edad[renglón]*12; };
// CONVERSION A STRINGS Y ALMACENANDO EN ListBox
{ ListBox1->Items->Add(edad[renglón]); };
}
Solo recordar que para capturar una lista de strings, primero se deberá usar un componente
visual por cada elemento o renglón del arreglo y segundo el traspaso de dato es directo, y
para desplegarlo en un componente ListBox de igual forma es directo, como en el siguiente
ejemplo;
void __fastcall TForm1::Button1Click(TObject *Sender)
{ // declaración
AnsiString Ciudad[3];
int reng;
//Captura de elementos de la lista
Ciudad[0]=Edit1->Text;
Ciudad[1]=Edit2->Text;
Ciudad[2]=Edit3->Text;
// Pasando lista a ListBox;
{ ListBox1->Items->Add(Ciudad[reng]); };
}
TAREAS PROGRAMACION C++BUILDER
1.- Capturar y desplegar 5 precios de productos cualesquiera, usando dos panel, uno para
capturar y uno para desplegar.
2.- Capturar 4 sueldos en un panel, desplegarlos aumentados en un 25% en otro panel.
3.- Capturar los datos de 5 productos comprados en una tienda, incluyendo nombre, precio
y cantidad en sus 3 listas respectivas, después calcular una cuarta lista con el gasto total por
cada producto desplegarlo todo en un segundo panel e incluir también el gran total.
4.- Capturar en una lista solamente 6 números múltiplos de 5, se debe de estar capture y
capture números hasta que se completen los 6 múltiplos de
4.- C++BUILDER ARREGLOS TIPO TABLA
Un arreglo tipo tabla se define como un conjunto de datos del mismo tipo organizados en
dos o mas columnas y uno o mas renglones.
Para procesar ( recordar solo operaciones y comparaciones) internamente todos los
elementos de la tabla se ocupan dos ciclos for(), uno externo para controlar renglón y uno
interno para controlar columna.
Solo recordar que en capturas, se deberán usar tantos componentes Edit como celdas tenga
la tabla y en despliegue usar tantos componentes ListBox como columnas tenga la tabla,
estos métodos son provisionales mientras se analizan los componentes visuales apropiados
y respectivos.
Problema ejemplo, capturar una tabla que nos muestre el peso en lbs de los tres jugadores
claves de 4 equipos de fútbol, desplegarlos en otra tabla pero convertidos a kg. ( una libra =
.454 kg.), el programa y la pantalla de salida son;
{ // declaración
double lbrs[3][4];
int reng, col;
//conversión tabla lbrs a kgrs
for(reng=0;reng<=2;reng++)
for(col=0;col<=3;col++)
{ lbrs[reng][col]=lbrs[reng][col]*.454; };
{ ListBox1->Items->Add(FormatFloat("###.##",lbrs[reng][0]) );
ListBox2->Items->Add(FormatFloat("###.##",lbrs[reng][1]) );
ListBox3->Items->Add(FormatFloat("###.##",lbrs[reng][2]) );
ListBox4->Items->Add(FormatFloat("###.##",lbrs[reng][3]) ); };
// observar solo un for renglón, y los cuatro ListBox con // las columnas
constantes
}
Recordar que en este nivel de instrucción solo se pretende entender los conceptos asociados
a arreglos, mejores maneras de procesarlos existen, como se vera mas adelante, pero con lo
ya descrito y comprendido, ya es posible;
TAREAS PROGRAMACION C++BUILDER
1.- CONSTRUIR UN CUADRO QUE CONTENGA LOS COSTOS FIJOS DE CUATRO
PRODUCTOSCUALESQUIERA, QUE SE PRODUCEN EN TRES PLANTAS
DIFERENTES DE UNA EMPRESA MAQUILADORA.
2.- CONSTRUIR UN CUADRO QUE CONTENGA LOS INGRESOS MENSUALES
POR VENTAS DURANTE LOS TRES PRIMEROS MESES DEL AÑO DE CUATRO
SUCURSALES DE UNA CADENA DE AUTOREFACCIONES, AGREGAR AL FINAL
UNA LISTA QUE MUESTRE LOS INGRESOS MENSUALES TOTALES POR MESES
Y UNA SEGUNDA LISTA QUE MUESTRE LOS INGRESOS MENSUALES TOTALES
POR SUCURSAL.
3.-CONSTRUIR UN CUADRO QUE CONTENGA LAS COMISIONES GANADAS POR
TRES VENDEDORES DIFERENTES DE 5 TIPOS DE MUEBLES DE LINEA
BLANCA, AGREGAR ADEMAS LISTAS DE COMISIONES TOTALES POR
VENDEDORES Y POR TIPO DE MUEBLE Y LISTAS DE COMISIONES PROMEDIO
POR VENDEDORES Y POR TIPO DE MUEBLES.
SUGERENCIA: PRIMERO HACER UN BOSQUEJO EN PAPEL DE COMO
QUEDARAN LOS CUADROS Y LAS LISTAS EN PANTALLA.
5.- TLIST TIPOS DE ARREGLOS EN C++BUILDER (CLASES E INTERNOS)
C++Builder nos proporciona cuando menos dos tiposnuevos de arreglos, ellos son;
TList
Se especializa en el almacenamiento y manipulación de varios tipos de OBJETOS u
elementos, por ejemplo enteros, floats, strings, componentes ( edits, labels, forms, etc. ).
Sin embargo TList no es propiamente un tipo de dato como los float, int, double, etcétera,
sino que es una Clase en C++, y como todas las Clases en C++, TList tiene asociados una
serie de propiedades y de métodos (procedimientos y funciones) que facilitan el
procesamiento y manipulación de sus elementos.
Consultando la ayuda de C++Builder, estas propiedades y métodos son:
1.-Propiedades;
Capacity.- Es la cantidad o tamaño del arreglo de apuntadores a los objetos en la lista.
Count.- Numero de objetos contenidos actualmente en la lista Items.- Se usa para
referenciar o accesar los objetos en la lista.
Recordar que las propiedades en un programa, se manejan con el formato
nomobjeto→nompropiedad.
2.- Métodos;
Add.- Inserta un objeto nuevo al final de la lista y regresa el lugar o posición donde hizo la
inserción.
Clear.- Se usa para vaciar el arreglo, también libera la memoria ocupada por los objetos de
la lista.
Delete.- Se usa para eliminar un objeto especifico, lleva como argumento o parámetro la
posición del objeto.
Exchange.- Intercambia dos objetos de la lista.
Expand.- Se usa para agregar mas espacio para nuevos objetos en la lista.
First.- Se utiliza para regresar al primero objeto de la l lista.
IndexOf.- Regresa la posición del objeto en la lista.
Insert.- Inserta un objeto en la posición deseada.
Last.- Regresa la posición del ultimo objeto en la lista.
Move.- Mueve el objeto de una posición a otra posición.
Pack .- Compacta todos los objetos en una lista y libera la memoria ocupada por los objetos
que estaban en la parte inferior de la lista.
Remove.- Remueve o elimina un objeto especificado, el resto los recorre a la posición que
ocupaba el objeto eliminado.
Sort.- Ordena los objetos de la lista, usando QuickSort.
Como se observa TList contiene muchas propiedades y métodos que facilitan grandemente
el trabajo con los elementos de una lista.
Una de las características mas importante es que todas las listas que se derivan de TList,
son completamente dinámicas, es decir listas que se crean y se derivan de esta clase, no son
de tamaño fijo, sino que pueden ir admitiendo elementos mientras la memoria del
computador alcance, esta característica junto con las propiedades y métodos que poseen,
hacen de esta clase un objeto digno de estudiar, conocer, comprender y aplicar de forma
muy detallada.
6.- TStringList C++BUILDER
De nuevo, TList se especializa en el almacenamiento y procesamiento de toda clase de
objetos, TStringList en principio es una clase derivada de TList, esto significa que
HEREDA o que puede usar muchas de las propiedades y métodos que pertenecen a TList,
además de poder usar igualmente algunas propiedades y métodos que le son propios.
La diferencia básica, con TList, es que TStringList solo permite almacenar strings, como
este es el caso mas común en el ambiente visual que se ha venido desarrollando, así como
en los sistemas o problemas de información de naturaleza administrativa, el resto del
capitulo se dedica a estudiar, analizar y construir aplicaciones con esta clase.
Sus propiedades y métodos son;
1.- Propiedades;
Count.- Cuenta las strings en la lista
Duplicates.- Permite strings duplicadas en una lista ordenada de strings
Objects.- Asocia un objeto a una string existente (ej. un bitmap a una string).
Sorted.- Especifica que las strings en la lista deben ser ordenadas automáticamente, solo
poner esta propiedad en True.
Strings[reng].- La mas importante, se usa para accesar, y leer o modificar una posición o
elemento especifico o determinado.
2.- Métodos;
Add.- Inserta un objeto nuevo al final de la lista y regresa el lugar o posición donde se
realizo la inserción.
Clear.- Se usa para vaciar el arreglo, también libera la memoria ocupada por los objetos de
la lista.
Delete.- Se usa para eliminar un objeto especifico, lleva como argumento o parámetro la
posición del objeto.
Exchange.- Intercambia dos objetos de la lista.
Find.- Regresa la posición de una string en una lista ordenada.
IndexOf.- Regresa la posición del objeto en la lista.
Insert.- Inserta un objeto en la posición deseada.
Sort.- Ordena los objetos de la lista, usando QuickSort.
Recuerde que objetos(variables) derivadas de TStringList pueden usar también muchas de
las propiedades y métodos de TList.
Se analiza ahora el procesamiento normal de estos objetos o desde una perspectiva mas
tradicional variables arreglo de tipo lista.
Lo mas importante a recordar es combinar lo ya visto para tratamiento de variables tipo
lista normales y usar igualmente las propiedades y métodos que contiene esta clase.
Para declarar un objeto o variable derivada de esta clase, recordar que aquí son dos pasos,
primero se debe declarar el objeto o variable y segundo se debe crear una instancia real en
memoria de este objeto o variable, como se muestran en los siguientes ejemplos;
Creación y declaración de una lista de 8 ciudades
// área de declaración
TStringList *ciudades;
ciudades = new TStringList;
nota recordar que esta listas son dinámicas, y que no tiene sentido asignarle un tamaño fijo,
que también se podría hacer.
Creación y declaración de una lista de 6 edades;
// declaración y creación de las listas
TStringList *edades;
edades = new TStringList;
Recordar que son listas de strings, si ocupan operaciones con números se deberá usar
ToInt() y ToDouble().
Recordar además que estos dos renglones que se ocupan para la declaración, van a ir juntos
al principio del onclick del botón Ok, pero si la captura se realiza usando un montón o
conjunto de componentes edits y otros botones realizan otro proceso con la lista, entonces
tendrán que ir separados en su lugar respectivo ( mas delante se indica como ).
Para capturar sus elementos usando de momento el método que se analizo en listas
normales, es decir un montón de componentes Edit, como en el siguiente ejemplo;
// área de declaración y creación
TStringList *ciudades;
ciudades = new TStringList;
// captura de datos
ciudades->Strings[0]=Edit1->Text;
ciudades->Strings[1]=Edit2->Text;
párrafos arriba se encuentra la definición de la propiedad Strings[];
Recordar que son listas y por tanto la primera posición, o primer renglón es la posición
0(cero).
Para desplegar los datos recordar que se puede usar un componente ListBox o un
componente ComboBox que permiten manipular el conjunto de datos a la vez, solo usar las
propiedades Text, tanto del ListBox, así como de la variable objeto derivada de TStringList,
como en el siguiente ejemplo;
void __fastcall TForm1::Button1Click(TObject *Sender)
{ TStringList *ciudades;
ciudades = new TStringList;
// procesos con la lista
// despliegue de la lista
ListBox1->Items->Text = ciudades->Text;
}
La pantalla de salida es:
Para el caso de procesos mas comunes como operaciones, comparaciones, etcétera, solo
recordar combinar las propiedades y métodos de TStringList con los métodos vistos y
aplicados ya para componentes visuales y para los de variables de tipo arreglo ya vistas.
Esto es importante porque exige conocer y familiarizarse con esta clase mas a fondo, por
ejemplo un caso sencillo, capturar una lista de 5 edades en años, convertirlos
posteriormente a meses y al final desplegar las edades convertidas a meses.
Una de las posibles soluciones es:
Código
void __fastcall TForm1::Button1Click(TObject *Sender)
{ TStringList *edad;
edad = new TStringList;
int reng;
// captura de datos
edad->Add(Edit1->Text);
edad->Add(Edit2->Text);
edad->Add(Edit3->Text);
edad->Add(Edit4->Text);
edad->Add(Edit5->Text);
// procesos con la lista
for(reng=0;reng<edad->Count;reng++)
{ edad->Strings[reng]=FormatFloat("###.##",edad->Strings[reng].ToInt() *
12);
};
}
notas:
En el for se esta usando la propiedad Count que devuelve la cantidad de elementos que
contiene la lista, esto es con la finalidad de no tener mas que procesar los elementos
existentes.
La operación es un solo renglón en el programa.
Recordar que Propiedad Strings[] permite manipular una posición especifica dentro de una
lista, recordar igualmente que la primera posición, es la 0(cero).
Para pasar los elementos de edad a ListBox, ambos componente y variable/objeto usan
propiedad Text, porque ambos la comparten o la heredan esto es importante porque
demuestra que realmente no son cosas o elementos diferentes.
Lo mas importante, es que se debe entender, aprender y aplicar combinaciones de
propiedades, métodos y operaciones como en el ejemplo.
La pantalla de salida es;
Para poder usar un solo componente edit para capturar todos los elementos de la lista:
1. La declaración de la lista se pone en dos partes diferentes, dentro y arriba de la Unit,
como se observa en el siguiente ejemplo;
#include <vcl\vcl.h>
#pragma hdrstop
#include "Unit1.h"
//-------------------------------------------
#pragma resource "*.dfm"
TForm1 *Form1;
TStringList *edad;
//-------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner)
{
edad=new TStringList;
}
//-------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
edad->Add(Edit1->Text);
}
La captura no ocupa ciclo for, pero si ocupa su propio BUTTON OK, solo con Caption
=―insertar o agregar‖ y su código usa el método Add como en el ejemplo de arriba.
Operaciones y comparaciones son normales, es decir un for renglón hasta que sea menor
que Count, etc., en el onclick del segundo botón.
Despliegues igualmente en forma normal, es decir sin ciclo for e igualando Text en ambos,
el TStringList y el Listbox.
TAREAS PROGRAMACION C++BUILDER
1.- CAPTURAR Y DESPLEGAR 5 MUEBLES DE HOGAR
2.- CAPTURAR EN UNA LISTA 5 ESTATURAS EN CENTIMETROS,
DESPLEGARLAS CONVERTIDAS EN PULGADAS ( 1 PULGADA = 2.54 CM.)
3.- CAPTURAR EN UNA LISTA 6 PESOS EN KG., CONVERTIRLOS
POSTERIORMENTE A LIBRAS Y SOLO DESPLEGAR EN EL ListBox RESPECTIVO
PESOS MAYORES DE 120 LIBRAS.
4.- CAPTURAR EN SUS CUATRO LISTAS RESPECTIVAS, MATRICULA, NOMBRE,
CALIFICACION DE MATEMATICAS, CALIFICACION DE FISICA, DE 5 ALUMNOS,
CALCULAR POSTERIORMENTE UNA LISTA DE PROMEDIOS, Y EN LOS ListBox
DE SALIDA SOLO DESPLEGAR LOS DATOS DE ALUMNOS APROBADOS.
7.- COMPONENTE ListBox C++BUILDER ( Standard )
Este componente permite procesar visualmente un conjunto de elementos de tipo string.
Este componente hereda muchas de las propiedades y métodos de TStringList y TStrings,
mas algunas propiedades y métodos propios.
Se puede añadir, eliminar e insertar ítems en la lista usando los métodos Add, Delete, Insert
con la propiedad Items, que también es de tipo TStrings.
Si se quiere que ListBox presente varias columnas, solo cambiar el valor de la propiedad
Columns, para ordenar o clasificar los ítems, usar la propiedad Sorted.
Se puede permitir que un usuario realice una selección múltiple, poniendo la propiedad
MultiSelect en true, la propiedad ExtendedSelect determina como se realiza la selección
múltiple.
Para determinar cual ítem en particular esta seleccionado solo validar la propiedad
Selected, para conocer cuantos ítems se han seleccionado revisar los valores de la
propiedad SelCount.
Propiedades:
BorderStyle.- Despliega la lista con un marco sencillo o sin marco.
Canvas.- Se utiliza para asociar un área de dibujo o de imagen a un ítem de la lista
(consultar ayuda de esta propiedad en ListBox puesto que es interesante).
Columns.- Define una determinada cantidad de columnas para su despliegue dentro del
ListBox.
ItemIndex.- Se utiliza para seleccionar la posición o índice de un ítem o elemento en la
lista.
Items.- Es la propiedad que mas se ha venido usando, se utiliza para accesar las diversas
propiedades y métodos de las strings en la lista.
Sorted.- Se usa para ordenar alfabéticamente los elementos de la lista( ListBox1→Sorted=
true; )
Style.- Define diversos o varios estilos o formas de ListBox.
Métodos:
Clear.- Elimina todos los elementos a la vez.
En la practica para cargar o capturar sus elementos, se deberá usar el método Add, ya que
no se permite cargar directamente sus datos o elementos por el usuario del programa, solo
usar código como el siguiente;
ListBox1→Items→Add(Edit1→Text);
Recordar que se pueden usar todos los métodos, para insertar, eliminar, contar, etc.
Si los valores son de tipo ―numérico‖, se pueden efectuar procesos con ellos de dos
maneras:
Pasando los valores de ListBox a una variable numérica de tipo arreglo y procesando esta
ultima variable.
Usar instrucciones directamente de proceso con los métodos ToInt y ToDouble, como se
realizo con las variables/objetos derivadas de TStringList.
Si es necesario pasar el contenido de ListBox1 a ListBox2, solo usar la propiedad Text en
ambas, ej.; (ListBox2→Text=ListBox1→Text).
Ejemplo con ListBox, para este caso se pide capturar 5 edades en un ListBox, luego
sumarle 3 años a cada una usando el mismo ListBox, y desplegarlas en un segundo ListBox
convertidas a meses.
Pantalla de diseño:
Código:
void __fastcall TForm1::Button1Click(TObject *Sender)
{ ListBox1→Items→Add(Edit1→Text); }
——————————————————
{ListBox2→Items→Add(ListBox1→Items→Strings[reng].ToInt() * 12);}; } ——————
——————————————————— Pantalla de salida:
TAREAS
PROGRAMACION C++BUILDER 1.- CAPTURAR EN UNA LISTA LOS SUELDOS DE 6
EMPLEADOS Y DESPLEGARLOS EN UNA SEGUNDA LISTA AUMENTADOS EN UN
30% 2.- CAPTURAR EN UNA LISTA LOS PESOS EN KILOGRAMOS DE 6 PERSONAS
DESPLEGARLOS EN UNA SEGUNDA LISTA CONVERTIDOS A LIBRAS Y ADEMAS
SOLO LOS MAYORES DE 100 LIBRAS. 3.- CAPTURAR EN SUS 4 LISTAS
RESPECTIVAS MATRICULA, NOMBRE Y DOS CALIFICACIONES DE 5 ALUMNOS,
DESPUES CALCULAR UNA LISTA DE PROMEDIOS DE CALIFICACIONES. 4.-
CAPTURAR EN SUS LISTAS RESPECTIVAS NUMEMPLEADO, NOMEMPLEADO, DIAS
TRABAJADOS Y SUELDO DIARIO DE 5 EMPLEADOS, DESPLEGAR EN OTRA
PANTALLA O PANEL LA NOMINA PERO SOLO DE AQUELLOS EMPLEADOS QUE
GANAN MAS DE $300.00 A LA SEMANA.
8.- COMPONENTE StringGrid C++BUILDER ( adicional )
Este componente es de los mas importantes, para el procesamiento de muchos datos,
permite concentrar, procesar y mostrar gran cantidad de información para la vista del
usuario.
Este componente presenta, manipula y procesa conjuntos de datos de tipo strings en forma
tabular, es decir en forma de tablas, matrices, cuadros concentrados, ejemplo;
CIA ACME
INGRESOS POR VENTAS MENSUALES
MILLONES DE PESOS
ENE FEB MAR ABR
SUC A 1 2 3 4
SUC B 5 6 4 5
SUC C 6 7 8 9
Recordar que son los datos numéricos internos quienes se procesan (es decir, se capturan,
se realizan operaciones con ellos, se despliegan, etc.), es la información externa quien le da
sentido.
Algunas de sus propiedades y métodos mas interesantes son:
ColCount.- Determina la cantidad de columnas que contendrá la tabla.
Recordar que para efectos de programación, la primera de ellas es la columna 0.
RowCount.- Determina la cantidad de renglones que contendrá la tabla.
Recordar que para efectos de programación, el primero de ellos es el renglón 0.
Fixedcol , Fixedrow.- Determinan la cantidad de columnas y renglones fijos o de
encabezado, estas propiedades ponerlas en 0.
+Options, goediting = true; Para que permita editar o capturar datos al usuario.
+Options, gotab = true; Para que el usuario pueda navegar entre celdas usando la tecla del
tabulador.
Cells[columna][renglón], Es la propiedad mas importante, porque es la que permite el
acceso a cualquier celda de la tabla,
StringGrid1→Cells[1][1]=―PATO‖;
Edit1→Text=StringGrid1→Cells[0][0];
Edit2→Text=StringGrid→Cells[0][1] * 3.1416;
observar que a pesar de ser de tipo Strings, se pueden efectuar alguna operaciones
matemáticas directamente con las celdas.
Aunque es mas seguro sobre todo en el caso particular de la suma, convertirlos a
Cells[][].ToInt() o ToDouble(), ej.;
Edit2→Text=StringGrid1→Cells[1][0].ToInt()+5;
Las demás propiedades investigarlas en la ayuda del CBuilder.
Para procesar todos los elementos de la tabla, solo recordar que se deben usar dos ciclos
for, uno externo para controlar columnas, y uno interno para controlar renglón ( observar
que es lo inverso de las tablas o arreglos normales).
Ejemplo , capturar una tabla de 3 * 4 enteros, y restarles 4 después;
Pantalla de Diseño:
Programa;
void __fastcall TForm1::Button1Click(TObject *Sender)
{ int col, reng ;
for(col=0;col<=2;col++)
for(reng=0;reng<=3;reng++)
{StringGrid1->Cells[col][reng]=StringGrid1->Cells[col][reng]. ToInt()- 4
;};
}
Pantalla de Corrida:
Un proceso muy común con tablas, cuadros y concentrados es agregarles listasde totales y
promedios ya sea por columna o por renglón o ambas , por ejemplo;
CIA ACME
INGRESOS MENSUALES
ENE FEB MARZO TOTALSUC PROMSUC
SUC A 1 2 3 6 2
SUC B 4 5 6 15 5
SUC C 7 8 9 24 8
SUC D 10 11 12 33 11
TOTMES 22 26 30
PROMMES 5.5 6.5 7.8
En este ejemplo aparte de la tabla se ocupan 4 listas, dos para totales y dos para promedios.
El código es sencillo, pero recordarlo y aprenderlo para siempre:
//declaración
float tabla[4][3], totsuc[4], promsuc[4];
float totmes[3], promes[3];
//observar tamaños de listas que referencian renglón
// listas que referencian columnas, se supone que la tabla // ya esta
capturada.
//código para operaciones para totales y promedios //renglones por
sucursal:
for(reng=0;reng<=3;reng++)
for(col=0;col<=2;col++)
{ totsuc[reng]=totsuc[reng]+tabla[reng][col]; };
for(reng=0;reng<=3;reng++) promsuc[reng]=totsuc[reng] / 3.0 ;
// operaciones para totales y promedios por mes
for(reng=0;reng<=3;reng++)
for(col=0;col<=2;col++)
{totmes[col]=totmes[col]+tabla[reng][col]; };
for (col=0;col<=2;col++) prommes[col]=totmes[col]/4.0;
TAREAS PROGRAMACION C++BUILDER
1.- Construir un concentrado que despliegue los costos fijos de tres diversos productos que
se fabrican en cuatro sucursales de una empresa MAQUILADORA.
2.- Construir un concentrado que contenga los ingresos por ventas mensuales de los 4
primeros meses del año de tres sucursales de una cadena refaccionaría, agregar listas de
ingresos totales por mes e ingresos promedios por sucursal.
3.- Construir un cuadro que contenga las calificaciones de 5 materias de cuatro alumnos
cualesquiera, incluir promedios de calificaciones por materia y por alumno.
IV UNIDAD C++BUILDER INT A LAS BASES DE DATOS
1.- INTRODUCCION C++BUILDER
En este capitulo se analizan en general dos problemas:
Variables que permitan almacenar conjuntos de datos como los arreglos pero de distintos
tipos de datos, este primer problema se resolvía en la antigüedad usando las llamadas
variables registro, o tipo struct en C.
Permanencia de los datos, hasta ahora todos los datos capturados, calculados, creados, etc.
al terminar o cerrarse el programa se pierden y es necesario volver a capturarlos, etc., en la
siguiente ejecución o corrida del programa.
Tradicionalmente en programación antigua este segundo problema se resolvía usando el
concepto de archivos, que son medios permanentes de almacenamiento de datos en los
dispositivos o periféricos apropiados, generalmente disco, cinta magnética, etc.
2.- MODELOS DE ALMACENAMIENTO DE DATOS C++BUILDER
En general existen dos modelos de almacenamiento de datos en los sistemas de
información.
El modelo tradicional de archivos que se construye con los siguientes elementos:
a.1) Variables Registros, como ya se indico son variables que permiten almacenar
conjuntos de datos de diverso tipo.
También se pueden definir como representaciones simbólicas y programaticas de entidades
lógicas de información, ejemplos de variables registros son alumnos, empleados, clientes,
proveedores, productos, autos, etc.
Esta variables registros, también ocupan programas o rutinas de programas para
procesarlas, por ejemplo un procedimiento, modulo o subrutina, se encargara de capturar
los datos que contendrá la variable registro, otro procedimiento para corregir los datos que
ya contiene, otro procedimiento para desplegarlos en pantalla ya cuando ha sido capturada
y así sucesivamente.
a.2) Archivos, que en principio pueden entenderse como una especie de almacenes o
bodegas para almacenamiento de datos en forma permanente en disco, es decir un archivo
de empleados en disco contiene todos los datos de todos los empleados de una empresa.
Igualmente los archivos ocupan su propios programas o subrutinas o procedimientos
especializados por ejemplo, procedimientos para crear los archivos, para almacenar o dar de
altas los registros en el archivo, procedimientos para buscar un registro determinado,
procedimiento para dar de baja un registro, etc.
a.3) Una aplicación, que es un programa que se encarga de coordinar todos los programas
descritos y presentárselos a los usuarios de manera clara, fácil y accesible y entendible.
Salta a la vista que construir un sistema de información por ejemplo para una tienda de
vídeo o para un refaccionaría, etc. involucra un gran cantidad de trabajo de programación,
puesto que hay que programar muchas variables registros, muchos archivos en disco, y una
o varias aplicaciones.
Este modelo se usa todavía en la actualidad, pero es obvio que mejores maneras, mas
rápidas, seguras y eficientes existen en la actualidad para resolver estos problemas, y esto
nos lleva al segundo modelo de datos.
Modelo de Bases de Datos Relaciónales, este modelo intenta simplificar la construcción de
sistemas de información como los antes descritos, este modelo solo incluye en forma
simple los siguientes elementos:
Tablas, es una combinación de las variables registro y de los archivos del modelo anterior.
Es decir cuando un programador moderno define o declara una tabla en un programa,
realmente esta haciendo dos cosas por el precio de una, es decir crea una variable registro
en memoria que almacenara los datos y al mismo tiempo ya esta creando un archivo en
disco que se llamara igual que la tabla o variable registro y que automáticamente se
convertirá en un espejo de la tabla en memoria, es decir cuando se cargan los datos en la
tabla en memoria, también se estarán cargando ala vez en disco.
Otra vez cuando el programador escribe código para capturar los datos y mandarlos a la
tabla en pantalla-memoria, realmente también lo esta haciendo para darlos de alta en disco.
Aplicación, que tiene la misma función que en el modelo anterior.
No confundir este concepto de tablas en base de datos con el concepto de tablas, vistos en
el capitulo de arreglos, aunque en la practica se parecen mucho, la diferencia es que los
datos no se van a disco.
Como se observa en este modelo, es mas sencillo construir sistemas de información con el,
puesto que la parte programatica se reduce ampliamente.
3.- TABLAS C++BUILDER
Una Tabla simple, representa una
UNIDAD de información de una entidad lógica de información:
Tabla Empleado:
* Clave Empleado * Nombre Empleado * Dirección Empleado * Edad Empleado *
Teléfono Empleado * etc. Empleado
Tabla Proveedor:
* Clave Proveedor * Nombre Proveedor * Empresa Proveedor * Teléfono Proveedor * Fax
Proveedor * Celular Proveedor * etc. Proveedor
Tabla Autos:
* Numero de Serie * Modelo * Marca * Tipo * Color * Capacidad * etc.
Observar que cada tabla, empieza con una clave generalmente detipo numérica.
Todos los elementos de la tabla, solo hacen referencia hacia el mismo ente o sujeto de
información.
Cada elemento solo representa o debe contener un solo dato de información.
No se respetan o siguen al pie de la letra estos tres postulados y empiezan los problemas al
tiempo de programación.
Existe una segunda forma o manera de representar las tablas, ejemplo:
Tabla: Camisas
NumCamisa Marca Estilo Medida Color Material
1 Jeans Manga Corta Grande Azul Algodón
2 Voláis Camiseta Mediana Negra Poliester
3 Genérica Manga Larga Chica Morado Rayón
etc. etc. etc. etc. etc. etc.
Tabla: Clientes
NumCliente NomCliente DirCliente TelCliente
1 Juan Pérez Av. aba 121212
2 Luis Pérez calle zeta 898989
3 José Pérez cjon sss 000000
etc. etc. etc. etc.
Recordar siempre, una tabla almacena o representa un conjunto de datos relacionados entre
si, la tabla de alumnos es para almacenar y manipular muchos alumnos, la tabla de
productos es para almacenar y manipular muchos alumnos, en resumen si en un problema
de información solo se presenta una instancia o renglón de una entidad lógica, entonces no
es tabla, es un encabezado.
TAREAS PROGRAMACION C++BUILDER
1.- CONSTRUIR EN CUADERNO LAS SIGUIENTES TABLAS, LA MITAD DE
ELLAS CON EL PRIMER FORMATO Y LA SEGUNDA MITAD CON EL SEGUNDO
FORMATO.
4.- C++BUILDER TABLAS (CONTINUACION)
El trabajo correcto con bases de datos relaciónales, se divide en dos grandes pasos o etapas
bien diferenciadas entre si:
En la primera etapa se diseña la tabla , con sus campos, llaves y condiciones especiales,
luego se usa un paquete o programa de software especializado en la construcción,
mantenimiento y administración de la base de datos, este software se usa para convertir la
tabla o tablas ya bien diseñadas en un archivo en disco.
Estos paquetes, o software reciben el nombre de DBMS(DATA BASE MANAGEMENT
SYSTEM) o sistema administrador de bases de datos.
Este software se especializa en la creación, mantenimiento, seguridad, privacidad, etc. de
un conjunto de tablas o mejor dicho una base de datos, los DBMS mas comunes son
Oracle, SqlServer, Informix, Sysbase, etc.
Borland la compañía que fabrica C++Builder, proporciona junto con el C++Builder, un
miniDBMS llamado DataBase Desktop, mismo que se encuentra en el mismo folder o
subdirectorio que el C++Builder, y que también se usara para construir las tablas y/o
archivos físicos.
La segunda etapa consiste en construir la aplicación o aplicaciones que ya tendrán acceso o
podrán manipular los datos contenidos en la tabla, estas aplicaciones se escriben usando ya
sea lenguajes clásicos de programación como BASIC, PASCAL, COBOL, CBUILDER,
DELPHI, etc o también se pueden accesar paquetes comunes de manipulación de archivos
o bases de datos como DBASE, CLIPPER, VISUALFOX, ACCESS, etc.
DISEÑO Y CREACION DE UNA TABLA
El primer paso antes de usar el paquete correspondiente a esta tarea, es diseñar la tabla
completamente, esto exige:
1. Nombre apropiado y determinación de atributos y campos correspondientes
2. Seleccionar y determinar el atributo principal o campo clave o llave primaria que se
utiliza como el identificador único que permite diferenciar cada instancia o renglón
diferente dentro de la tabla.
3. También se puede seleccionar otros campos que puedan servir mas adelante para ordenar
de manera diferente la tabla, es decir una tabla en principio ya está ordenada por el campo
clave, por ejemplo, la matricula de un alumno, el numero de empleado, etc., pero existirán
muchas ocasiones mas adelante donde se puede pedir un orden diferente, por ejemplo, por
ciudad, por carrera, por nombre, por edad, etc., la buena ingeniería de una base de datos
exige tomar en cuenta estos y otros muchos problemas y detalles.
4. Escribir restricciones y condiciones apropiadas para ciertos atributos , por ejemplo el
número de empleado deben comenzar en 500, la edad no debe ser mayor de 150 años, etc.
Ya listo el diseño de la tabla, se pasa a el programa correspondiente para su creación y
almacenamiento, dicho programa que se encuentra dentro de el folder o subdirectorio de
CBuilder y como ya se dijo es:
5.- DATABASE DESKTOP C++BUILDER
No es un componente de la barra de herramientas, es el icono de un programa que se
encuentra en el mismo folder o directorio que el C++Builder.
El procedimiento completo para construir la tabla, es:
b) Crear una nueva con file, new, table, DD pregunta cual formato de tabla se va a usar;
c) El formato a seleccionar es Paradox 7,(Borland es la compañía propietaria de los arriba
mencionados, otras versiones de C++Builder ya traen licencias para nuevos tipos, como
Access, etc.), ya hecha la selección entramos a el siguiente editor de tablas:
Tomar nota de las dos áreas del editor, la primera de ellas es el field roster y la segunda
área es la de propiedades de la tabla.
d) Se usa ahora la primera área, para escribir los campos o atributos de la tabla, la segunda
columna es el tipo de dato del atributo, para asignar un tipo de dato a un atributo, pulsar dos
veces la barra espaciadora en el teclado para que salga la siguiente lista de tipos de datos:
Como se observa existen muchos e interesantes tipos de datos, de momento solo usar los
mas comunes, enteros, short, numéricos, y alpha para el caso de strings.
La opción size(tamaño) solo se usa cuando el campo es de tipo string ( ALPHA) y se tiene
que dar el tamaño de la string, por ejemplo en campo Dirección el size o tamaño es 30.
La opción Key, es para marcar un atributo o campo, como llave primaria, o llave principal
de las instancias o renglones u objetos diferentes de la tabla, para marcar un campo como
llave primaria, solo dobleclick en esta opción Key.
e) La segunda área de la tabla, son las propiedades de la tabla, todas las propiedades de la
tabla están dentro del siguiente combobox.
Todas y cada una de las propiedades, se definen abajo en la parte de propiedades del editor
de tablas, es decir la propiedad validity check tiene como elementos:
La propiedad siguiente tiene sus propios elementos y así sucesivamente.
De momento solamente dejar las propiedades o sus partes en blanco.
f) No olvidar usar la opción SAVE abajo para guardar la tabla, en esta parte sale la ventana
normal de Windows para grabación, esa ventana donde se puede crear un nuevo folder, etc.,
solo buscar el directorio que se creo al principio de la sesión con my computer,
abrirlo(OPEN) y escribir un nombre apropiado para la tabla.
Ya creada la tabla, es conveniente cargarle unos cuantos renglones registros o datos para
pruebas, esto se hace con:
c.1) Usar el icono de OPEN tabla y seleccionar la tabla a cargar.
c.2) Entrar al modo de edición usando el icono de Edit y ya se puede empezar a
capturar los datos en cada renglón.
c.3) Para terminar solo click en la X arriba en la tabla respectiva.
Ejemplo de una tabla;
Recordar que todos los cambios hechos a una, añadir, insertar, eliminar, modificar, etc.
quedan grabados automáticamente en disco, este hecho es la razón por lo que no existe una
opción de grabar un renglón o registro cualesquiera.
Ahora si, ya creada, declarada o definida la tabla, es tiempo ahora de construir la
aplicación, para esto se usara nuevamente el C++Builder .
6.- APLICACIONES O PROGRAMAS CON TABLAS C++BUILDER
Básicamente una aplicación consiste de un programa o forma que permite accesar,
manipular, editar, procesar, etcétera, los datos, registros, o renglones de una tabla, es decir
es la aplicación la que constituye, la vista sobre la que trabaja el usuario del programa.
Como ya se explico en el modelo tradicional de almacenamiento de datos, existían muchos
procesos, tanto para la manipulación de registros en memoria, capturas, modificaciones,
etc., como para el almacenamiento de todos ellos en archivos en disco, el famoso ABC de
un sistema de archivos (altas, bajas, consultas, modificaciones, etc.) y todos ellos había que
construirlos programarlos a mano, era terrible la situación de los programadores de antaño.
En el modelo relacional-visual de datos, mucho de este trabajo no existe, solo se construye
una forma, y se pegan unos cuantos componentes para que aparezcan las propias tablas y
componentes para que se procesen los datos que contendrán la tablas.
Recordar también que la aplicación ya no deberá preocuparse, donde se almacenan los
datos, de validar las condiciones y restricciones impuestas en ellos, etc., todo este trabajo
ahora es responsabilidad del miniDBMS que usado, el DataBase Desktop.
Existen dos maneras sencillas de construir aplicaciones, la primera de ellas es presentarle al
usuario un solo renglón de información para su proceso y manipulación y la segunda es
presentarle toda la tabla a la vez, también para su manipulación y proceso.
7.- APLICACIONES POR RENGLON C++BUILDER
Para construir una aplicación, presentándole un solo renglón al usuario para su
procesamiento en C++Builder, solo se ocupa una forma (Form1) y solocuatro componentes
diferentes de acceso y manipulación de tablas, estos cuatro componentes son:
PROCEDIMIENTO Y COMPONENTES
1.- Colocar un componente Table (Data Access ) en algún lugar de la forma donde no
estorbe( este componente quedara flotando y no aparece al momento de ejecución del
programa).
Este componente Table, sirve de enlace físico entre la tabla real que se creo con el
DataBase Desktop y el resto de los componentes que se usaran para la construcción de la
aplicación.
Sus tres propiedades mas importantes son:
* Propiedad DataBaseName = Solo escribir el directorio donde se encuentra la tabla real,
por ejemplo c:\datos
* Propiedad TableName = Solo click a un lado de esta propiedad y seleccionar la tabla a
usar, por ejemplo seleccionar la tabla de clientes.
* Propiedad Active = Ponerlo en valor True.
2.- Colocar un componente DataSource (Data Access) también en algún lugar en la
forma donde no estorbe.
Este Componente actúa como el enlace físico entre el Componente Table y el resto de
componentes que procesan los datos de la tabla, es decir el componente Table apunta a la
tabla real en disco, el componente DataSource apunta al componente Table, y el resto de
los componentes apuntan a DataSource.
Su única propiedad a modificar es:
Propiedad DataSet = Click a un lado y seleccionar el componente Table al que se quiere
enlazar, por ejemplo Table1.
3.- Componente DBEdit (Data Controls) .
Este componente permite presentar y manipular un dato de la tabla a la vez.
Es un componente muy similar al componente Edit y comparte muchas de las propiedades
y métodos de este ultimo, su diferencia principal es que Edit, carga sus datos desde el
usuario y DBEdit los carga desde la tabla almacenada en disco.
De este componente se deben colocar tantos de ellos en la forma, como columnas existan
en la tabla a procesar.
Sus dos propiedades mas importantes y en el orden abajo descrito son:
Propiedad DataSource = Click a un lado y seleccionar el DataSource al que se quiere
enlazar, por ejemplo DataSource1.
Propiedad DataField = Click a un lado y seleccionar el campo o atributo o columna que se
quiere representar o enlazar por ejemplo ClaveCliente, NomCliente, etc.
Recordar que se deben colocar tantos DBEdit en la forma, como columnas existan en la
tabla, o como columnas se quieran presentar al usuario para su manipulación.
Recordar poner unos cuantos componentes Label, arriba del componente DBEdit y
cargarlos en su propiedad caption con el nombre del campo o columna respectivo.
4.- Componente DBNavigator (Data Controls) .
Button Significado
First Regreso al primer registro o renglón de la tabla.
Prior Regreso a registro o renglón anterior.
Next Avanza al siguiente renglón.
Last Avanza a el ultimo renglón.
Insert Inserta un nuevo renglón en la tabla.
Delete Borra o elimina el renglón o registro actual.
Edit Pone el registro actual en estado de edición para su modificación
Post Graba el registro o renglón actual en la tabla en disco.
Cancel Cancela modo edición y restaura los datos anteriores que tenia el renglón.
Refresh Refresca o regraba toda la información.
Recordar poner unos cuantos componentes Label arriba de los botones del navegador para
su aclaración, uso y manejo al usuario.
Sus dos propiedades mas importantes son:
Propiedad DataSource = Click a un lado y seleccionar el DataSource al que se quiere
enlazar, por ejemplo DataSource1.
Propiedad +VisibleButtons = Click en el signo +, para activar(True) o desactivar(False) los
botones de proceso de renglones de la tabla, que se quieran mostrar u ocultar al usuario.
Con estos cuatro componentes ya se construye una aplicación, ejemplo;
Pantalla de Diseño:
Pantalla de ejecución:
TAREAS PROGRAMACION C++BUILDER
1.- Construir aplicaciones para la mitad de las tablas hechas en el DataBase Desktop.
8.- APLICACION POR TABLA C++BUILDER
En este tipo de aplicación, al usuario se le presenta toda la tabla completa a la vez para su
procesamiento y manipulación.
Para construir esta tipo de aplicación, solo se ocupan tres componentes y dos de ellos ya
son conocidos, estos componentes son:
Componente Table ( Data Access)
* propiedad DataBaseName = c:\datos
* propiedad TableName = Clientes.db
* propiedad Active = True
Componente DataSource ( Data Access)
* propiedad Dataset = Table1
Componente DBGrid ( Data Controls)
* DataSource = Click a un lado de la propiedad, para seleccionar el DataSource respectivo
a enlazar, por ejemplo DataSource1.
Una característica interesante, es que este componente DBGrid, trae asociado un editor de
columnas, solo poner el componente DBGrid en la forma, enlazarlo al DataSource y luego
doble click dentro del DBGrid y aparece el siguiente editor:
Primero usar el botón Add All Fields para cargar todos los campos columnas a la primera
ventana y de esta ventana ir seleccionando el campo o columna a procesar, observar que se
pueden agregar nuevas columnas, o eliminar columnas existentes y para cada columna que
se vaya seleccionando ya funciona la segunda parte del editor.
Componente DBNavigator( Data Access)
* propiedad DataSource = DataSource1
* propiedad +VisibleButtons = activar o desactivar los botones apropiados
Aunque este componente no se ocupa en este tipo de aplicación, puesto que el usuario
puede realizar todos los procesos básicos directamente dentro de la tabla, es conveniente
poner un navegador para darle una segunda opción o manera de realizar los procesos
básicos.
Un ejemplo de aplicación con esta estructura es:
Pantalla de Diseño
Pantalla de ejecución:
TAREAS PROGRAMACION C++BUILDER
1.- CONSTRUIR APLICACIONES CON ESTE FORMATO PARA LA SEGUNDA
MITAD DE LAS TABLAS CREADAS CON EL DATABASE DESKTOP.
9.- PROCESOS BASICOS C++BUILDER
Analizaremos ahora algunos procesos también básicos que pueden realizarse con los dos
tipos de aplicaciones y que además no están contemplados en algunos de los botones del
navegador.
OPERACIONES CON CAMPOS
Para el caso de aplicaciones construidas con componentes DBEdit, recordar que comparte
muchas propiedades y métodos con el componente edit, así que es valido por ejemplo en
una aplicación donde la tabla productos tiene el campo costounitario(DBEdit3) y el campo
o columna utilidad(DBEdit6), poner un componente edit1 para el precio de venta y realizar
la siguiente operación en el onclick de un botón apropiado.
//-----------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
Edit1->Text=DBEdit3->Text.ToDouble()+DBEdit6à Text.ToDouble();
}
Como se observa se puede accesar y manipular los componentes DBEdit usando la
propiedad Text, tanto para leerlos como para cargarlos.
Problemas sugeridos:
1.- Una tabla de productos con campos costounitario, margen de utilidad y tasa de iva,
calcular el precio de venta.
a.2) Para el caso de aplicaciones con DBGrid, se pueden accesar sus celdas para su lectura
y proceso usando código como en el siguiente ejemplo, en algún botón o evento apropiado:
Edit3→Text = DBGrid1→Fields[2]→AsInteger * 5;
Observar la propiedad Fields[col], es para indicar la columna deseada y además comienza
en la 0(cero), recordar además que este acceso será realizado solamente sobre el renglón
seleccionado en la tabla (aquel que esta seleccionado con un *).
También se esta usando el método AsInteger para leerlo como entero.
Es conveniente usar la ayuda del C++Builder para el componente DBGrid para conocer
todas sus propiedades y métodos.
Para cargar una celda con un nuevo valor, usar código como el siguiente en algún botón o
evento apropiado.
Onclickbutton5(){
DBGrid1→Edit();
DBGrid1→Fields[3]→Value = 300;
}
1.- Observar que son dos pasos, en el primero se pone todo el DBGrid en modo de edición
y en el segundo se carga ya la celda seleccionada con el nuevo valor.
2.- Recordar que el cambio es en una celda de un solo renglón, y es el renglón
seleccionado.
3.- Como primera nota interesante, esta propiedad Edit() es también la del navegador, es
decir es valido DBGrid1→First, etc.
4.- Para la modificación de la celda, se usaron otra vez la propiedad Fields[col] y método
Valúe, recordar nuevamente estudiar propiedades y métodos de DBGrid.
Problema sugerido:
TAREAS PROGRAMACION C++BUILDER
1.- La misma tarea anterior, pero ahora con tabla.
10.- BUSQUEDAS C++BUILDER
Un problema muy común en los sistemas de información basados en bases de datos es el de
búsquedas, en estos casos el usuario proporciona un dato, generalmente la clave del
registro, para que se localice toda la información pertinente.
Para resolver este problema, solo se ocupa:
1. Un botón de ordenes (OK) con el siguiente código:
Los parámetros del método Locate(), son;
Locate(―Columna de búsqueda‖ ,‖Dato a buscar‖ , opción de búsqueda);
cuando opción = 0; → ignora diferencia entre mayúsculas y minúsculas
cuando opción = 1; → resultado parcial, ejemplo si se busca ―ju‖ se posesiona en el primer
renglón donde ese campo empiece con ―ju‖, ejemplo Juan, juvenal, etc.
TAREAS PROGRAMACION C++BUILDER
1.- CONSTRUIR UNA APLICACION DE BUSQUEDAS PARA UNA TABLA DE
AUTOS, CON OPCIONES DE BUSQUEDA POR CLAVE, MODELO, COLOR,
PRECIO.
11.- FILTROS C++BUILDER
Un filtro es una condición que permite desplegar solo determinada información de una
tabla.
Es decir, en ocasiones solo se quiere desplegar información condicionada al usuario, por
ejemplo de la tabla de clientes solo desplegar aquellos que sean de la ciudad de Tijuana, de
la tabla de autos, solo desplegar aquellos de modelo 1990 en adelante.
Como se observa, filtrar una tabla, es condicionar uno o mas campos o columnas.
Formar condiciones simples o compuestas ya no debe ser problema, el real problema es que
la librería de VCL que contiene los componentes visuales, fue portada a C++Builder por
parte de la Compañía Borland usando la librería VCL de Delphi( y este Delphi es Pascal),
en otras palabras los filtros o condiciones se tendrán que programar tomando en cuenta a
como Pascal maneja las constantes strings, los operadores relaciónales y los operadores
lógicos.
Existen dos maneras de poner filtros o condiciones para una tabla, ellas son:
1.- Interna, debe haber un DBGrid en la aplicación y para el componente Table, modificar
las siguientes propiedades:
* propiedad Filter = condición, ejemplos para la tabla de clientes:
= ClaveCliente < 3
= Ciudad <> 'Tijuana'
= ClaveCliente > 2 and Ciudad = 'Tijuana'
* propiedad Filtered = true
2,- Externa, es el usuario quien construye el filtro o condición, usando un componente Edit
para el filtro y un botón de ordenes (OK) para que se ejecute y despliegue la tabla filtrada,
el código en dicho botón es;
onclickbutton1()
{
Table1→Filter = Edit1→Text;
Table1→Filtered = true;
}
TAREAS PROGRAMACION C++BUILDER
1.- UNA TABLA DE AUTOS FILTRADA INTERNAMENTE POR COLOR AZUL Y
MODELO DE 1990 EN ADELANTE.
2.- UNA TABLA DE PROVEEDORES Y QUE SEA EL USUARIO QUIEN
CONSTRUYA EL FILTRO O CONDICION.
GRAFICOS O IMAGENES C++BUILDER
Campos de gráficos o de imágenes, se han convertido en una de las grandes atracciones y
características de las bases de datos modernas.
En C++Builder, el manejo de dichos campos es muy fácil solo:
1.- Cuando se crea la tabla en el DataBase Desktop, incluir un campo de tipo de dato
Graphics, por ejemplo en la tabla de clientes, incluir el campo foto de tipo Graphics.
2.- En aplicaciones por renglones , no usar un DBEdit para este campo, sino usar un
componente DBImage (Data Controls) .
Si el renglón o registro ya esta cargado con su imagen respectiva, al hacer la navegación
entre renglones, este componente DBImage las va desplegando.
3.- En aplicaciones por tablas, usar el editor del DBGrid para ocultar el campo de tipo
Graphics y poner a un lado del DBGrid un componente DBImage, esto hace la misma
función, es decir al momento que el usuario navega entre los renglones de la tabla, este
componente va desplegando la imagen del renglón donde se encuentra el cursor.
4.- El problema, es como cargar las imágenes, la respuesta es sencilla, las imágenes solo
pueden cargarse, capturarse o provenir de solo dos fuentes o lugares distintos:
4.1) Un archivo de tipo *.BMP( u otros formatos similares)
4.2) Del Clipboard de Windows
5.- Cualquier dispositivo o periférico de este tipo (scaners, cámaras digitales, etc.) o
programas de imágenes ( paintbrush, paint, corel, etc.) tienen estas dos capacidades, es
decir pueden mandar sus imágenes ya sea al Clipboard o ya sea a un archivo en disco.
6.- Para capturar una imagen en una aplicación ya sea por renglón o por tabla, recordar no
usar un campo DBEdit para este campo, sino un campo DBImage, para usar el Clipboard
para capturar se tienen dos maneras sencillas:
6.1- Colocado el cursor dentro de este campo DBImage, pedirle al usuario, usando un Label
por ejemplo que solo teclee, CTRL V, ( observar el paste en el edit de cualquier ventana de
Windows).
6.2.- Usar además del componente DBImage un componente Button de ordenes(OK) con el
siguiente código:
{ DBImage1→PasteFromClipboard(); }
Recordar que para usar estos métodos, el Clipboard de Windows ya debe estar cargado con
la imagen, para pruebas sencillas, minimizar la aplicación, cargar el PaintBrush o Paint,
cargar un archivo .BMP, seleccionarlo luego Edit Copy, cerrar el Paint o PaintBrush y
maximizar la aplicación y aplicar cualquiera de los dos métodos.
Es evidente que también se pueden usar CTRL C, CTRL X, CTRL Del(ver edit de
cualquier ventana), CopyToClipboard() (ver ayuda de DBImage), etc., para diferentes
procesos.
Recordar además que la tabla física no actualiza el campo correspondiente con su imagen,
si no se avanza de renglón, o se usan los botones Next, Refresh, Update del navegador.
7.- Para cargar o capturar una imagen directamente desde un archivo en disco de extensión
.BMP (u otros similares) solo usar un componente DBImage ya sea en aplicaciones por
renglón o por tabla, un componente Button de ordenes y el siguiente código;
OnClickButton1()
{ DBImage→Picture→LoadFromFile(―C:\datos\mifoto.bmp‖); }
Ya debe estar en el directorio o folder datos dicho archivo .BMP y además otra vez
recordar, que aunque la imagen ya esta en la pantalla, todavía no se manda a la tabla a disco
si no se ejecuta un avance de renglón o un Next, etc.
8.- La propiedad Stretch en DBImage, la amplia, otro método es ponerlas en Clipboard o
archivo ya con el tamaño apropiado.
TAREAS PROGRAMACION C++BUILDER
1.- UNA TABLA DE MAMIFEROS COMPLETA INCLUYENDO IMAGENES
2.- UNA TABLA DE PRODUCTOS O MERCANCIAS INCLUYENDO SU FOTO
13.- IMPRESION O REPORTES QREPORT C++BUILDER
Imprimir tablas o construir reportes sobre las mismas, es también una tarea común en los
sistemas de información basados en bases de datos.
Lo bueno es que se tiene un folder o pestaña llamada QReport cargada de componentes
visuales especializados en la impresión de reportes, esta librería de componentes, no es
hecha por Borland, es hecha por una compañía llamada QSOFT™
QReport
Practica para construir un reporte que contiene la cédula de un y solamente un cliente de la
tabla de clientes.
Los componentes y propiedades a usar son:
1.- Table1
* DataBaseName = c:\datos * TableName = Clientes.db * Active = true * Filter =
ClaveCliente = 2 (observar que aquí es donde se determina
cual cliente se imprime)
* Filtered = true
2.- QuickRep1, se encuentra en pestaña QReport.
Es el componente principal para impresión.
Toma la forma y tamaño de una hoja de impresora dentro de Form1.
Sus propiedades a usar son:
* Dataset = Table1 * Zoom = 50
3.- QRShape1
Se usara para crear un rectángulo para encabezados de la cédula de un cliente.
Son varios tipos o formas las que existen de QRShape, rectángulos, líneas, círculos, etc.,
rectángulo es default, y la propiedad para cambiar de forma es Shape.
Acomodarlo y expanderlo en la parte superior de la hoja de impresión (QickRep1).
Sus propiedades a usar son:
- +Pen = Click en signo + y poner:
Color = clgreen
Width = 5
4.- QRLabel1
Similar a label, contienen textos o mensajes estáticos.
Colocarlo dentro del rectángulo o sección de encabezado.
Propiedades:
+Font = dar color y tamaño de font
5.- QRSysData1
Componente especiales que contienen datos fijos de impresión, tales como numero de
pagina, fecha, hora, etc.
Colocarlo también dentro de la sección o banda de encabezado.
propiedades:
6.- QRSysData2
Otro del anterior, colocarlo dentro de la banda de encabezado, propiedad
7.- QRShape2
Con este se forma ahora un sección, rectángulo o banda principal.
Cuando un reporte, imprime mas de un renglón, por ejemplo todos los clientes, esta parte
de la hoja recibe el nombre de banda de detalle.
Propiedades:
- +Pen = darle color y tamaño(Width) apropiados.
8.- QRLabel###
Colocar varios dentro de la banda de detalle, con caption apropiado, ejemplo, clave,
nombre, foto, etc.
9.- QRDBText1
Componente para desplegar cada dato de una celda o campo o columna de una tabla, es
similar a DBEdit pero es estático, es decir solo despliega.
Se deberán poner tantos componentes QRDBText en esta banda o sección de detalle, como
columnas de datos existan o se quieran desplegar de la tabla.
Propiedades:
* Dataset = Table1 * DataField = seleccionar columna apropiada * Font = color, tamaño,
etc. que se quieran
10 .-QRDBImage
Componente para desplegar e imprimir campos de tipo Graphics ( BMP, ICO, WFW).
Propiedades:
* Dataset = Table1 * DataField = Seleccionar una columna de tipo Graphics * Stretch =
true
Notas:
1.- El componente QuickRep, tiene la propiedad +Frame, para que también pueda desplegar
e imprimir un marco apropiado.
2.- Para ir desplegando un Preview de impresión al tiempo del diseño del reporte, solo
dobleclick dentro de la hoja de impresión (QuickRep) para que aparezca una ventana de
Preview de impresión.
3.- La CIA Qsoft, ya tiene a la venta QReport V3.0 que ya trae incorporado WYSWYNG.
4.- Para Preview o impresión en tiempo de ejecución, solo añadir un botón de ordenes OK,
y usar solo una de las siguientes instrucciones:
OnClickButton1() {
QuickRep1→Preview();
o QuickRep1→Print();
solo una de las dos } ejemplo: a)Pantalla de diseño
b)Programa: ———
—————————————–
void __fastcall TForm1::Button1Click(TObject *Sender)
{
QuickRep1→Preview();
}
————————————————— c)Pantalla de corrida:
Como ya se indico la
versión 3 de QReport ya trae incorporado WYSYNG. d)Pantalla de Preview durante
ejecución:
TAREAS PROGRAMACION C++BUILDER 1.- REPORTE CON UN AUTO DE LA TABLA
DE AUTOS 2.- REPORTE DE UN PROVEEDOR, DE LA TABLA DE PROVEEDORES,
PERO EL USUARIO SELECCIONA EL FILTRO O LA CLAVE DEL PROVEEDOR (
CONSTRUIR DOS PANTALLAS, UNA CON EL FILTRO Y BOTON DE IMPRESION O
PREVIEW Y LA SEGUNDA CON EL REPORTE).
14.- IMPRESION DE TODA LA TABLA C++BUILDER
Imprimir toda la tabla significa muchas hojas de impresora.
Primero se deberá quitar el filtro en la tabla y segundo entender lo que tienen en común
todas las hojas de impresora que se ocupan para imprimir la tabla.
Primero todas las hojas ocupan un mismo encabezado o un mismo pie de pagina, donde
puede ir por ejemplo la fecha o el numero de pagina.
La primera hoja de todo el reporte, cuando menos debe llevar una banda de titulo, con el
nombre de la compañía, el titulo y propósito de la tabla, la fecha, etc.
Todo los renglones de la tabla, ocuparan muchas hojas de impresora para desplegarse,
incluyendo un encabezado para todas las columnas que están en la hoja, repito necesitamos
un encabezado para columnas y que aparezca en todas las paginas.
Probablemente, en la hoja final, seria conveniente añadir algunos contadores y
acumuladores, por ejemplo la cantidad de renglones, algún acumulado de alguna columna
numérica en especial, etc.
QReport, usa este modelo de bandas para la construcción de reportes, es decir, en la
practica anterior se uso un componente QRShape, para dividir el reporte en dos partes,
secciones o bandas, pero QReport trae incorporado un componente llamado QRBand que
permite dividir en partes, secciones o bandas todo el reporte.
Este componente QRBand, en su propiedad BandType, permite construir los siguientes seis
tipos importantes de banda.
BANDA NOTAS
PAGE HEADER Banda de encabezados de paginas.
Aparece en todas las hojas impresas.
Poner dentro componentes para numero de pagina, etc.
TITLE Banda de Titulo o encabezados del Reporte.
Solo aparece en la primera hoja impresa.
Poner componentes qrlabel con el nombre de la compañía, el propósito de la tabla, fecha,
etc.
COLUMM HEADER Banda de o para encabezados de columnas.
Aparece en todas las hojas impresas.
Poner dentro componentes qrlabel con el encabezado que lleva cada columna de la tabla.
DETAIL Banda de detalle.
Es la mas importante, porque es la que contiene los datos de los renglones de la tabla.
Es la que constituye el grueso de las hojas impresas.
Solo colocar dentro de esta banda los componentes de datos impresos, QRDBText y
QRDBImage
SUMMARY Banda de resumen.
Solo aparece en la hoja final de impresión.
Poner dentro de ella componentes de operaciones como es QRExpr y estudiarlo en la
ayuda, para conocer sus métodos (funciones) y aplicarlas.
PAGE FOOTER Banda de pie de pagina.
Aparece en todas las hojas impresas.
Su función es similar a la banda de encabezado.
De hecho, en un reporte solo se usa la b banda de encabezado o la banda de pie de pagina,
pero no las dos.
Solo poner dentro de esta banda, componentes de numero de pagina, o de fechas, o de hora,
etc.
Lo mas importante a tomar en cuenta es cada componente QRBand que se ponga dentro de
un reporte, se deberá definir usando su propiedad BandType, como una cualquiera de los
seis tipos de bandas, es decir,
En general el procedimiento completo es:
1.-Poner un componente Table en la forma y nadamas cargarle sus tres propiedades
básicas( no usar filtros).
2.-Poner un Componente QuickRep( es la hoja de impresión) y cargarle las propiedades ya
descritas en procedimiento de impresión anterior.
3.- Colocar y expandir un primer componente QRBand dentro del componente QuickRep y
primero asociarle el tipo de banda que representa, por ejemplo de encabezado o de titulo,
recordar que un reporte no necesariamente tiene que llevar las seis bandas.
A este componente QRBand, cambiarle propiedades de font, frame, color, etc.
4.- Colocar dentro del componente QRBand1, los componentes necesarios y apropiados
como se indico en el cuadro anterior de bandas y significados, por ejemplo QRLabel, etc.
5.-Colocar otro componente QRBand en la hoja de impresión, expanderlo y definirlo como
banda de titulo o banda de encabezado de columnas, etc.
6.-Repetir los pasos anteriores, hasta completar todas las bandas.
7.- Colocar un botón de ordenes OK, y asociarle el código de Preview o de impresión.
TAREAS PROGRAMACION C++BUILDER
1.- Desplegar la tabla de Productos, y agregar un botón de impresión de tabla ( son dos
formas una con la tabla y su navegador y la segunda es la forma de reporte) no olvidar
Include File Unit.
15.- MODELO RELACIONAL DE DATOS C++BUILDER
Entre dos tablas básicas o tablas simples cualesquiera, se debe y puede buscar, identificar y
establecer una o varias relaciones entre ellas, ejemplo;
tabla Clientes tabla Productos
tabla Autos tabla TALLERES MECANICOS
R1= El auto ingresa al taller
R2= El auto es diagnosticado en el taller
R3= El auto es reparado en el taller
R4= El auto sale del taller
Una relación simple es la unión o combinación de dos tablas básicas mediante una y solo
una acción, hecho o conducta especifica.
Entiéndase de otra manera, como una frase que relaciona las dos tablas y un y solo un verbo
que las une.
Si se analizan detenidamente las relaciones de los ejemplo, es también posible deducir que
un conjunto de relaciones forman o constituyen un proceso administrativo, contable, fiscal,
o de otro tipo cualesquiera, en el primer ejemplo el proceso es el ventas, en el segundo es el
proceso de reparación de un auto.
Debe ser obvio que un proceso cualesquiera no se podrá describir completamente, con tres
o cuatro relaciones simples nadamas.
Aun mas, en un sistema de información cualesquiera cada una de las relaciones genera una
tabla especial llamada ―de relación‖, pero también genera en muchos casos un documento
especifico, por ejemplo el cliente compra al contado productos genera la tabla de relación y
el documento llamado ―Factura‖, en la relación el auto ingresa al taller se genera la tabla de
relación y/o documento llamado ―ORDEN DE ENTRADA‖, en la relación el cliente aparta
productos se genera la tabla de relación y/o documento llamado ―NOTA O RECIBO DE
APARTADO‖, etc.
Existirán casos o relaciones donde será casi imposible identificar o nombrar el documento o
relación existente, para resolver este problema, existen dos soluciones básicas, la primera
de ellas es crear por nuestra cuenta el documento, es decir si en un modelo practico no
existe un documento para esta parte del proceso lo mas sencillo es crearlo en la empresa,
documentarlo y pedir a la empresa que lo ponga en practica, en algunos casos es también
posible no crear documento alguno, solo llamar a esta relación con el nombre de las dos
tablas, por ejemplo rel perros/gatos, rel clientes/productos, etc. ( aunque no es
recomendable o muy explicativo).
Igualmente es muy recomendable,, al describir un proceso cualquiera y su conjunto de
relaciones, no usar o buscar relaciones muy abstractas, porque será casi imposible pasarlas
a un modelo de información implementado en computadora, por ejemplo la relación al
cliente le gustan los autos, por ejemplo los perros corretean gatos, etcétera.
En resumen las relaciones y en general el proceso deben de ser simples, y documentales.
Para terminar de complicar las cosas un modelo completo de información, no se construye
con dos tablas básicas, un par de procesos y una cuantas relaciones o documentos, el
modelo completo incluye un montón de tablas básicas, otro montón de procesos diferentes
entre ellas, y cada proceso contiene un conjunto amplio de relaciones.
Por ejemplo en una Empresa de ―AUTOREFACCIONES‖, fácilmente se encuentran las
tablas básicas, de clientes, mecánicos, proveedores, partes, proceso de ventas al publico,
proceso de compras a proveedores, etcétera y cada proceso con su propio conjunto de
relaciones y o documentos.
TAREAS PROGRAMACION C++BUILDER
1.- PARA UNA EMPRESA DE VIDEO, IDENTIFICAR SUS TRES TABLAS MAS
BASICAS , SUS DOS PROCESOS MAS IMPORTANTES Y CUANDO MENOS CINCO
RELACIONES EN CADA PROCESO.
2.- CONSTRUIR UN MODELO DE TRES TABLAS BASICAS, DOS PROCESOS Y
CUATRO RELACIONES PARA UNA CASA DE EMPEÑO.
3.- UN EMPRESARIO DE EXITO, TIENE VARIOS LOTES PARA LA VENTA DE
AUTOS, VARIOS TALLERES MECANICOS PARA SU REPARACION, VENDE LOS
AUTOS A CREDITO Y AL CONTADO, CONSTRUIR UN MODELO SIMPLE DE
BASE DE DATOS RELACIÓNALES PARA SU IMPLEMENTACION.
16.- TIPOS DE RELACIONES C++BUILDER
Analizando a fondo, la mayoría de las relaciones y sus documentos son del tipo llamado
1:M ( uno a muchos), es decir cada tabla de relación o documento contiene un renglón de la
primera tabla y muchos renglones de la segunda tabla, por ejemplo en una factura solo hay
o se encuentra, un cliente y muchos productos, en una receta por ejemplo solo hay un
paciente pero hay muchas medicinas, en una orden de compra o de pedido hay un solo
proveedor pero hay muchos productos y así sucesivamente.
En general existen los siguientes tipos de relaciones:
Repitiendo el caso mas común de relaciones, son las de 1:M, en este caso, solamente la
tabla de relación no permite resolver el problema de información, en casos de relaciones
1:M se ocupara una segunda tabla llamada detalle-relación.
El modelo completo de tablas para una y solamente una relación de tipo 1:M es;
tabla de 1(uno) tabla de M(muchos)
- Clave de uno - Clave de muchos
- otros campos - otros campos
tabla de R(relación) tabla detallerelacion
- Clave de relación - Clave de relación
- Clave de uno - Clave de muchos
- otros campos - otros campos
Este es el modelo principal de una base de datos relacional y se deberá siempre aplicar
cuando se tenga que construir una base de datos que tenga una relación 1:M.
Ejemplo;
Clientes(1) Productos (M)
Facturas(relación) DetalleFactura (detallerelación)
Clave Factura Clave Factura
Clave Cliente Clave Producto
Fecha Factura Cantidad Producto
etcétera Factura Etcétera
ejemplo;
Pacientes (1) Medicinas (muchos)
Recetas (relación) DetalleReceta
Como se observa en los dos ejemplos, las tres claves ( la de uno, la de muchos y la de
relación) solo se repiten una sola vez en otra tabla.
De nuevo un problema o sistema de información, que descansa en una base de datos de tipo
relacional, y solo contiene una relación de tipo 1:M ocupa cuatro tablas ( la de uno, la de
muchos, la de relación y la de detalle-relacion).
Si el problema incluye una segunda relación 1:M por ejemplo NotaDeVentaque se deriva
de las mismas dos tablas básicas, entonces el modelo completo se resuelve con seis tablas (
las dos básicas, las dos de relación y las dos de detalle) y así sucesivamente.
Como se dijo anteriormente un problema sencillo de información por ejemplo el de una
tienda de vídeo, ocupa unas cuatro o cinco tablas básicas, unos dos o tres procesos y cada
proceso dos o tres relaciones mínimo, entonces el sistema se resuelve con 20 o mas tablas,
las quejas sobre este modelo a Codd (creador del modelo relacional de bases de datos).
El caso de relaciones 1:1 se resuelve con solo tres tablas, solo agregar también en la tabla
de relación la clave de muchos.
El caso de relaciones 1:Cte también se resuelve con tres tablas, solo agregar en la tabla de
relaciones tantas claves de la tabla de constantes como constantes existan en la relación, por
ejemplo si la relación es boleta de calificaciones y solo contiene tres materias, entonces se
ocupan la tabla de alumnos, la de materias y la tabla de boleta, esta ultima tendría clave
alumno, clave materia1, clave materia2, clave materia3.
El caso de relaciones M:M solo se resuelve localizando o identificando o de plano
construyendo, la dos relaciones 1:M originales de donde salió este documento, por ejemplo
en el informe al gobierno de todos los distribuidores de equipo de computo y todos los
equipos que compraron en el mes, es probable que este informe se construya con las tablas
de relaciones de facturas y notas de ventas.
TAREAS PROGRAMACION C++BUILDER
1.- CONSTRUIR EL MODELO DE LAS CUATRO TABLAS PARA LA RELACION EL
CLIENTE COMPRA A CREDITO PARTES O REFACCIONES EN LA
―REFACCIONARÍA‖.
2.- CONSTRUIR EL MODELO DEL CLIENTE APARTA JOYAS EN UNA ―JOYERIA‖.
3.- CONSTRUIR EL MODELO COMPLETO DE CLIENTES Y PELICULAS CON LAS
RELACIONES, RENTA PELICULAS, DEVUELVE PELICULAS, DAÑA PELICULAS,
COMPRA PELICULAS.
4.- CONSIDERANDO EL PROBLEMA DE LOTES DE AUTOS, AUTOS, CLIENTES,
TALLERES CONSTRUIR MODELO PARA LOS PROCESOS DE COMPRA DE
AUTOS, Y RESTAURACION DE AUTOS( ES CUANDO EL LOTE COMPRA LOS
AUTOS Y LES DA UNA ARREGLADA PARA SU VENTA).
17.- C++BUILDER MODELO RELACIONAL Y DATABASE DESKTOP
El modelo relacional completo, antes de traspasarlo al DataBase DESKTOP, debe incluir
todo lo siguiente:
tabla de uno
* Clave de Uno S, P* (S = ISuno ) * otros
tabla de muchos
* Clave de Muchos S, P* (S = ISmuchos) * otros
tabla de relación
* Clave Relación S, P* (S = ISrelacion) * Clave de Uno S, IR (S = ISReluno)
* otros
tabla de detalle
* Clave Relación C*,S,IR (S = Isdetrel IR = IRDetrel) * Clave Muchos C*,S,IR (S =
ISDetmuchos IR = IRDetmuchos) * otros
notas:
P* , significa que dicho campo es una clave o llave primaria, en DataBase Desktop,
recordar que solo se ocupa un click en la columna llamada KEY para que aparezca la *
C* , se conocen como claves o llaves compuestas, para crear una clave o llave compuesta
solo marcar con *, los dos campos involucrados
S, es un llamado índice secundario ( secondary índex), se usa para dar un orden o
clasificación alterno a la tabla indicada, por ejemplo en la tabla clientes, se puede marcar
ciudad como índice secundario, para que de ser necesario en lugar de desplegarse ordenada
por clave o numero de cliente, se despliegue ordenadas por ciudades, o por nombres, o por
teléfonos, etc.
El (S = ISuno ) es el nombre que va a recibir el índice secundario, por ejemplo si la tabla es
clientes el índice secundario se llamara Isclientes, otra vez en el caso (S = ISmuchos ) si la
tabla es productos al índice secundario se le pondrá el nombre de Isproductos.
Párrafos mas adelante, se muestra el procedimiento para crearlos dentro del Database
Desktop.
IR, se conocen como integridad referencial ( integrity referential), se utiliza para garantizar
que nuevos elementos en una tabla ya existan en la otra tabla, por ejemplo de IR entre la
tabla de relación y la tabla de uno, en el caso de Facturas y Clientes, garantiza que no se
pueda capturar la clave de un cliente cualesquiera, si este cliente no existe o esta dado de
alta en la tabla de clientes.
Otra vez la IR entre la tabla de detalle y la tabla de muchos, en el caso de
DETALLEFACTURA y PRODUCTOS, garantiza que no se pueda capturar la clave de un
producto, en la tabla de detalle, si este producto no existe, en la tabla de relación y así
sucesivamente.
(IR = IRReluno) es el nombre que se le va a asignar a la relación, para el ejemplo que se
esta siguiendo se llamaría IRFacturaCliente, y así sucesivamente.
El procedimiento para crear un índice secundario (S) dentro del DataBase Desktop es:
A)Tools, Utilities, Restructure y seleccionar tabla a indexar.
B)Click en ComboBox de la derecha, hasta que aparezca y seleccionar la opción Secondary
Indexes.
C)Click abajo en botón Define.
D)Aparece ahora el siguiente editor de índices:
E)Solo seleccionar el campo o atributo a indexar y luego click en flecha negra ADD para
que pase a la segunda ventana, luego click en OK.
F)DD pregunta ahora por el nombre del índice mediante la siguiente ventana:
G)Escribir el nombre ya propuesto por ejemplo ISNomProducto y click en OK.
H)DD regresa ahora ala tabla principal, click en botón SAVE para grabarla con los nuevos
cambios.
I) Cerrar la tabla, con click en X arriba.
J) Repetir los pasos desde inciso A, para construir los índices de las otras tablas.
El Procedimiento para crear las integridades referenciales es:
1.- Tools, Utilities, Restructure y seleccionar tabla a construirle la integridad referencial.
2.- Click en ComboBox de la derecha, hasta que aparezca y seleccionar la opción
Referential Integrity.
3.- Click abajo en botón Define.
4.- Aparece ahora el siguiente editor:
5.- En la primera ventana están todos los campos de la tabla a enlazar (factura) solo doble
click en el campo de enlace (Clave Cliente) y observar que se pase a la ventana chica.
6.- En la segunda ventana están todas las tablas del directorio, solo doble click en la tabla a
enlazar (clientes), con eso el campo de enlace (Clave Cliente) de dicha tabla también pasa a
la ventanilla izquierda, como se observa en la gráfica anterior.
7.- En resumen la integridad referencial permite el enlace entre las dos tablas, su efecto
practico, como ya se indicó es que tablas unidas de esta manera no permiten altas o captura
de un renglón, si dicho renglón de información, no existe en la tabla enlazada.
8.- Para terminar este proceso solo click en el botón OK.
9.- DD pregunta ahora por el nombre que tendrá, esta integridad referencial o enlace usando
la siguiente ventana:
10.-Escribir el nombre ya propuesto por ejemplo IRFacturaCliente, en este ejemplo, se esta
simbolizando un enlace de la tabla de factura hacia la tabla de cliente, usando el campo
común en ambas de Clave Cliente.
11.-DD regresa ahora a la tabla principal, click en botón SAVE para grabarla con los
nuevos cambios.
12.-Cerrar la tabla, con click en X arriba.
13.-Repetir los pasos desde inciso A, para construir los enlaces o integridad referencial con
las otras tablas.
Como una nota u observación importante, recordar que es muy simple el proceso de que
enlazar o de a que construirle las integridades referenciales, en este ejemplo es de Factura
hacia Cliente con Clave Cliente, luego es de DETALLEFACTURA a Factura con Clave
Factura y al final es de DETALLEFACTURA hacia Producto con Clave Producto.
Otra vez, siempre es lo mismo, de Receta hacia Paciente con Clave Paciente, es de
DetalleReceta hacia Receta con Clave Receta y al final de DetalleReceta hacia Medicina
con Clave Medicina.
Recordar que solo son tres campos claves y solo están repetidos dos veces, y dos de ellos
siempre están en Detalle, por eso solo son tres enlaces o IR y dos de ellos se encuentran en
Detalle.
El procedimiento general para crear las cuatro tablas, en DataBase Desktop y en el
siguiente y estricto orden es:
1.- Crear un directorio o folder especifico para almacenar las cuatro tablas, con explorer o
my computer de Windows.
2.- Crear las cuatro tablas, solo marcando las llaves primarias y llaves compuestas, (
estrellitas).
3.- Ir cargando las cuatro tablas para aplicarles el procedimiento que se dio para índices
secundarios.
4.- Hasta al final ir cargando las dos tablas que solo se ocupan para crear los enlaces o
Integridad Referencial ( observar las notas, solo se crean enlaces con la tabla de relación y
dos veces con la tabla de detalle).
5.- Abrir e ir cargando las tablas también en orden (1,M,R,D) para capturarles unos cuantos
renglones de pruebas.
TAREAS PROGRAMACION C++BUILDER
1.- CONSTRUIR Y CARGAR EN DATABASE DESKTOP LA RELACION
RECETA(SON CUATRO TABLAS).
2.- CONSTRUIR Y CARGAR EN DATABASE DESKTOP LA RELACION ORDEN DE
COMPRA.
3.- CONSTRUIR EN DATABASE DESKTOP LA RELACION DE LA NOTA DE
RENTA DE PELICULA.
4.- CONSTRUIR EN DATABASE DESKTOP LA RELACION RECIBO DE RENTA(
AQUI SOLO SON TRES TABLAS Y EXISTE TAMBIEN UNA IR O ENLACE DE
RECIBO A DEPARTAMENTOS).
18.- APLICACIONES CON TABLA DE RELACION C++BUILDER
Es tiempo ahora de construir la aplicación final con las tablas construidas con el modelo
relacional de bases de datos.
Recordar primero que en general, el usuario solo tendrá acceso y podrá manipular tres de
ellas, la tabla de uno, la tabla de muchos y la tabla de relación, las dos primeras de ellas son
construidas usando aplicaciones normales por renglón y por tabla, como se realizo en los
primeros temas del capitulo, es recomendación y sugerencia que la tabla de uno se
construya usando el formato de renglón y la tabla de muchos se construya usando el
formato de tabla(DBGrid).
En cuanto a la aplicación a construir con la tabla de relación, también dentro de
C++Builder se debe construir los enlaces con las tablas ya descritas, con los siguientes
considerandos ;
T1-->TR ; TM-->TDET ; TDET-->TREL
Ej. 1) CTE-->FACTURA ; PROD-->DETFAC ; DETFACT-->FACT
ej. 2) PAC-->RECETA ; MED-->DETREC ; DETREC-->RECETA
OBSERVAR Y TOMAR EN CUENTA COMO Y DE DONDE HACIA DONDE SE
GENERAN LOS TRES ENLACES DENTRO de C++BUILDER.
Tomar nota de las diferencias entre los enlaces en DD y en C++Builder.
Estos enlaces se hacen usando dos propiedades extras en los componentes Table dentro del
C++Builder, propiedades que se explican y demuestran mas adelante.
Recordar ademas, que es en la primera tabla de cada uno de estos tres tipos de enlaces.
donde se establece la relación de enlace o donde se manipula la propiedad correspondiente.
Para construir una aplicación para la tabla de relación:
1.- Aunque es solo la tabla de relacion, la que está aparentemente a la vista del usuario, la
forma debera contener los cuatro componentes Table, puesto que esta relación, descansa y
ocupa las cuatro tablas.
2.- Estos cuatro componentes Table se colocaran y usaran en el siquiente orden para el
ejercicio de aplicación:
Table1 →Tabla de uno (ej. clientes)
Table2 →Tabla de muchos (ej. productos)
Table3 → Tabla de relación (ej. facturas)
Table4 → Tabla de detalle (ej. detallefactura)
3) Igualmente se ocupan cuatro componentes DataSource en el mismo orden, es decir
DataSource1 apunta a Table1, DS2 a T2, y así sucesivamente.
4.- La Forma que contiene la tabla de relación se organiza usando tres componentes Panel
para su mejor distribución, estos componentes Panel, se construyen y contienen:
DBNav1(DS3) Nva Fact
DBEdit(DS3)
Panel de uno
Cve Cte Nom Cte Dir Cte etc.Cte NVO Cte
DBEdit DBEdit DBEdit DBEdit Buttonl
(DS3) (DS1) (DS1) (DS1)
Panel de detalle
NUM Prod. Nom Prod. etc. Prod.
DBEdit DBEdit DBEdit
(DS4) (DS2) (DS2)
DDBNav2(DS4)
Notas:
1.- Es muy importante que se respete el tipo de componente que va dentro de cada panel y
mas importante aún que dichos componentes apunten a el DataSource indicado entre
paréntesis.
2.- Igualmente es muy importante, el siguiente código que se deberá poner en el evento
OnExit del ultimo DBEdit que se tenga en pantalla y que se cargue o capture por parte del
usuario de la tabla de relación y su DataSource3 correspondiente, generalmente es la clave
relación o fecha, en particular seria el ultimo componente que se tenga apuntado a DS3, es
en este componente, donde se debe usar:
OnExitDBEdit#() { Table3→Refresh();}
Esta instrucción actualiza los datos o renglón de la tabla de relación, antes que la tabla de
detalle, haga una búsqueda, dentro de la tabla de relación.
3.- El código de los tres botones de ordenes, es el siguiente:
OnClickButton1(){
//ocultar la pantalla de factura y desplegar o llamar la pantalla de
clientes
}
OnClickButton2(){
Table4->Insert();
// para insertar un nuevo renglón en tabla de detalle
}
OnClickButton3(){
// primero operaciones pertinentes si es que existen y
// al final cerrar con la instrucción
Table4->Refresh();
// para cargar en disco el ultimo renglón de la tabla
// de detalle
}
\
4.- Como se observa los métodos Insert() y Refresh(), usados se derivan y se pueden
sustituir con DDBnavegadores y sus botones visibles correspondientes, pero se debe buscar
que el usuario los presione en el momento indicado.
5.- Este esquema se puede aplicar a cualquier tabla relacional(recetas, ordenes de compra,
solicitudes de servicios, etc.) solo realizar los ajustes correspondientes.
PROCEDIMIENTO PARA CONSTRUCCION DE TABLA RELACIONAL
1.- CARGAR C++Builder.
2.- PONER LOS CUATRO COMPONENTES TABLE EN LA FORMA, Y CARGARLES
SUS TRES PROPIEDADES BASICAS(DATABASENAME, TableName,
Active),RESPETANDO EL ORDEN SUGERIDO (Table1→Tabla de uno, Table2→Tabla
de muchos, Table3→Tabla de relación, Table4→Tabla de detalle).
3.- PONER LOS CUATRO COMPONENTES DataSource QUE SE OCUPAN Y
APUNTARLOS A SU TABLA CORRESPONDIENTE EN ORDEN, ES DECIR
DS1→TABLE1, DS2→Table2, DS3→Table3, DS4→Table4, USANDO LA PROPIEDAD
DATASET DEL COMPONENTE DataSource.
4.- ARMAR Y CARGAR LOS TRES ENLACES ENTRE TABLAS YA SUGERIDOS,
ESTO ES T1→TR, 2) TM→ TDET, 3) TDET→TREL, USANDO LAS PROPIEDADES
MASTERSOURCE Y MASTERFIELD EN LA PRIMERA DE LAS DOS TABLAS EN
CADA RELACION, COMO SE DEMUESTRA CON EL SIGUIENTE EJEMPLO DE LA
PRIMERA RELACION ES DECIR, T1→TR.
1. SELECCIONAR LA TABLA DE CLIENTES ( LA DE UNO)
2. CLICK A UN LADO DE LA PROPIEDAD MASTERSOURCE Y SELECCIONAR
DATASOURCE3( QUE ES LA DE RELACION O FACTURA) CLICK A UN LADO EN
LA PROPIEDAD MASTERFIELD (DONDE ESTAN LOS TRES PUNTILLOS) Y SALE
EL SIGUIENTE EDITOR DE CAMPOS DE ENLACE:
3.
4. OBSERVAR QUE EN LA PRIMERA VENTANA ESTA EL CAMPO DE ENLACE
DE LA TABLA DE UNO, Y EN LA SEGUNDA ESTAN TODOS LOS CAMPOS
POSIBLES A ENLAZAR DE LA TABLA DE RELACION( FACTURA)
5. COMO SE VAN A ENLAZAR AMBAS USANDO EL MISMO CAMPO (CLAVE
CLIENTE), SELECCIONAR (CLICK) ESTE MISMO CAMPO (CLAVE CLIENTE) EN
LAS DOS VENTANAS Y LUEGO CLICK EN BOTON ADD, EL ENLACE DEBE
APARECER EN LA VENTANA DE ABAJO, COMO SE MUESTRA EN LA
SIGUIENTE GRAFICA:
6.
7. LUEGO CLICK EN BOTON OK PARA FINALIZAR EL PROCESO
5.- EL PROCEDIMIENTO ANTERIOR 4.1) A 4.6) SE DEBERA REPETIR PARA LOS
DOS CASOS RESTANTES(TM→TDET, TDET→TREL).
6.- PONER LOS TRES COMPONENTES PANEL EN LA FORMA Y DENTRO DE
CADA PANEL, PONER Y APUNTAR LOS COMPONENTES YA DESCRITOS EN EL
MODELO ANTERIOR.
7.- RECORDAR PONER LOS TRES COMPONENTES BUTTON Y CARGARLOS CON
EL CODIGO QUE TAMBIEN YA SE INDICO.
EJEMPLO:
1. PANTALLA DE DISEÑO
1. CODIGO
//---------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{ // En esta parte se oculta la ventana de factura
// y se llama la ventana de cliente
}
//--------------------------------------------------
void __fastcall TForm1::DBEdit3Exit(TObject *Sender)
{ Table3->Refresh();
}
//---------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
Table4->Insert();
}
//---------------------------------------------------
void __fastcall TForm1::Button3Click(TObject *Sender)
{
// operaciones y terminar con:
Table4->Refresh();
}
//---------------------------------------------------
PANTALLA DE EJECUCION
TAREAS PROGRAMACION C++BUILDER
1.- CONSTRUIR UN MENU QUE CONTENGA Y LLAME LAS TABLAS CLIENTES,
PELICULAS Y RECIBO DE RENTA DE UNA VIDEOTIENDA
2.- CONSTRUIR UN MENU QUE CONTENGA Y LLAME LAS TABLAS PACIENTES,
MEDICINAS Y RECETAS DE UNA FARMACIA
3.- CONSTRUIR UN MENU QUE CONTENGA Y LLAME LAS TABLAS
PROVEEDOR, PRODUCTOS Y ORDEN DE COMPRA DE UNA REFACCIONARIA
V UNIDAD C++BUILDER COMPONENTES
TEMA 1.- INTRODUCCION PROGRAMACION ORIENTADA OBJETOS
C++BUILDER
Los componentes son los elementos u objetos mas básicos de la programación visual
moderna, con ellos se construyen las diversas aplicaciones que se ejecutan bajo un
ambiente Windows.
En esta
UNIDAD, se pretende profundizar en el estudio de estos elementos básicos de construcción
de programas, en esta
UNIDAD se pretende:
* Comprender los conceptos de componentes , clases y objetos, tanto visuales como no
visuales.
* Instalación y mantenimiento de nuevos componentes visuales.
* Creación e instalación de componentes visuales.
* Creación e instalación de componentes no visuales.
TEMA 2.- C++BUILDER COMPONENTES, CLASES Y OBJETOS
Como ya se menciono anteriormente, componentes son las piezas basicas, con las que se
arma, construye y diseña, una aplicacion cualesquiera.
Como se explico al principio del libro, la programacion moderna o actual, es de tipo visual,
pero su fondo o esencia es la llamada programacion orientada a objetos.
En orden o principio, recordar que todo en la vida o el universo, no es mas que un objeto de
cualquier clase o naturaleza ya sea material o inmaterial, todos los objetos tienen sentido,
forma, tamaño y un gran conjunto de caracteristicas que permiten diferenciarlos, pero
tambien clasificarlos y agruparlos, entre si.
Desde este punto de vista un programa en ejecucion o un sistema de información, se puede
considerar como un conjunto de objetos que como en la vida real interactuan entre si,
creandose entre ellos ya se una serie de relaciones e interacciones, programacion de punta o
avanzada ya toma en cuenta, la naturaleza dinamica de los propios objetos(esto es llamada
concurrencia, es decir la capacidad de existir en forma independiente y a la vez que el resto
de los objetos del sistema, esto se estudia mas a fondo en el siguiente capitulo de este
libro).
Sin embargo, su manifestacion programatica de los objetos, en los lenguajes modernos de
programacion, son las llamadas clases, es decir una clase es la representacion simbolica y
computacional de toda una serie de objetos con caracteristicas comunes entre si, por eso
existe la clase gatos, empleados, arboles, listas, reportes, vectores, etc, es decir pueden
existir tantas clases como objetos existen en el universo y cada clase contiene todos los
objetos con caraceristicas comunes entre si, o de la misma categoria o clasificaacion, un
ejemplo de una clase en un lenguaje de programacion es:
Class gatos{
public:
int edadgato;
AnsiString nombregato;
maullar();
capturardatosgato();
}gatonegro, garfield, gatotijuanense;
gatos::maullar(){ cin»―miauuuu‖;}
gatos::capturardatos(){ cin»―dame edad‖; cout«edad; }
Como se observa, comprender, localizar y programar todas las carecteristicas o atributos de
una sola clase, es una tarea bastante grande, mientras que los comportamientos ( metodos
en oop) es todavia mas laborioso y complejo y si agregamos la interaccion natural existente
entre objetos ( los llamados eventos en oop), garantiza que existiran la necesidad de
ingenieros de software por mucho tiempo en el futuro.
Observar del ejemplo, que del conjunto de objetos que representa la clase, se derivan
instancias(gatonegro, garfield) individuales de esa clase, desgraciadamente a esas instancias
individuales tambien se les conoce como objetos y esto manifiesta o conduce a la confusion
entre las dos interpretaciones de el concepto objeto, en su sentido generico o universal y su
sentido particular o programatico, como una instancia derivada de una clase, problema
viejo en los ambientes de programacion.
Por ultimo un componente, se puede entender como la manifestacion visible de un objeto
en un ambiente de desarrollo visual, es decir un componente no son mas que algunos
aspectos o propiedades del objeto, que permiten la conceptualizacion y manipulacion de los
objetos en los programas de aplicaciones visuales.
En resumen objeto→clase→componente, es la escencia o trilogia clasica en la
programacion visual moderna.
TEMA 3.- C++BUILDER INSTALACION Y MANTENIMIENTO DE COMPONENTES
VISUALES
En este tema, se estudia la manera de manipular, eliminar, etc, nuevos componentes y
folders o paginas de nuevos componentes, usando el menu de componentes que
proporciona C++Builder.
Para efectuar procesos simples con paginas y componentes ya contenidos en C++builder,
usar en la barra de menu, la opcion de componentes, donde su opcion mas elemental, es
―configure palette‖, que muestra la siquiente ventana:
La primera ventananita, permite manipular las paginas de componentes y la segunda
ventanita permite manipular los componentes, las operaciones mas elementales y a la vista
son, reaacomodar el orden de paginas o componentes, solo click en ellos y luego, usar las
flechas, eliminar y renombrar, para mover un componenente de una pagina a otra pagina,
solo arrastrarlo a la nueva pagina y borrarlo de la antigua.
Solo recordar que al final que para que todas las operaciones indicadas se lleven a cabo, se
debera reconstruir la libreria de componentes con la orden Component, Rebuild Library.
En principio se debera entender claramente que en la actualidad, miles de Ingenieros de
Software, se encuentran desarrollando cantidades increibles de componentes y galerias o
paginas de componentes, especializados en muchas y diversas tareas de programacion,
incluyendo empresas o compañias de diverso ambito y espcialidad que desarrollan
software, muchos de estos componentes e incluso paginas completas de ellas, estan a la
disposicion de todos los programadores, en el INTERNET, una visita rapida a la pagina de
www.borland.com, y concretamente de C++Builder muestra los siguientes lugares y
categorias:
Trademarks & Copyright © 1997 Borland International, Inc.
En muchos de ellos, ademas existen mas bibliotecas o paginas de componentes, asi como
nuevas ligas o enlaces a otros lugares tambien muy interesantes.
Tambien aqui en y de Borland, se encuentra una biblioteca de componentes, especializados
en internet, que no fueron agregados a la version normal de C++Builder actualmente en el
mercado.
Otra manera de localizar componentes, es usar busquedas de ―C++Builder‖, ―C++Builder
Component‖ o ―Delphi Component‖ en los lugares de busquedas habituales, Yahoo,
Altavista, Excite, etc.
Ya localizados y en disco duro, los componentes o galerias, bibliotecas o paginas de
componentes y bajados al disco duro de nuestra maquina, se procede a dar el
procedimiento, para incorporlos a una de las paginas en C++Builder:
TEMA 3.- C++BUILDER INSTALACION Y MANTENIMIENTO DE COMPONENTES
VISUALES
En este tema, se estudia la manera de manipular, eliminar, etc, nuevos componentes y
folders o paginas de nuevos componentes, usando el menu de componentes que
proporciona C++Builder.
Para efectuar procesos simples con paginas y componentes ya contenidos en C++builder,
usar en la barra de menu, la opcion de componentes, donde su opcion mas elemental, es
―configure palette‖, que muestra la siquiente ventana:
La primera ventananita, permite manipular las paginas de componentes y la segunda
ventanita permite manipular los componentes, las operaciones mas elementales y a la vista
son, reaacomodar el orden de paginas o componentes, solo click en ellos y luego, usar las
flechas, eliminar y renombrar, para mover un componenente de una pagina a otra pagina,
solo arrastrarlo a la nueva pagina y borrarlo de la antigua.
Solo recordar que al final que para que todas las operaciones indicadas se lleven a cabo, se
debera reconstruir la libreria de componentes con la orden Component, Rebuild Library.
En principio se debera entender claramente que en la actualidad, miles de Ingenieros de
Software, se encuentran desarrollando cantidades increibles de componentes y galerias o
paginas de componentes, especializados en muchas y diversas tareas de programacion,
incluyendo empresas o compañias de diverso ambito y espcialidad que desarrollan
software, muchos de estos componentes e incluso paginas completas de ellas, estan a la
disposicion de todos los programadores, en el INTERNET, una visita rapida a la pagina de
www.borland.com, y concretamente de C++Builder muestra los siguientes lugares y
categorias:
Trademarks & Copyright © 1997 Borland International, Inc.
En muchos de ellos, ademas existen mas bibliotecas o paginas de componentes, asi como
nuevas ligas o enlaces a otros lugares tambien muy interesantes.
Tambien aqui en y de Borland, se encuentra una biblioteca de componentes, especializados
en internet, que no fueron agregados a la version normal de C++Builder actualmente en el
mercado.
Otra manera de localizar componentes, es usar busquedas de ―C++Builder‖, ―C++Builder
Component‖ o ―Delphi Component‖ en los lugares de busquedas habituales, Yahoo,
Altavista, Excite, etc.
Ya localizados y en disco duro, los componentes o galerias, bibliotecas o paginas de
componentes y bajados al disco duro de nuestra maquina, se procede a dar el
procedimiento, para incorporlos a una de las paginas en C++Builder:
TEMA 4 INSTALACION PRACTICA DE COMPONENTES C++BUILDER
Ejemplo, un componente llamado my_panel que se encuentra en
www.nh.ultranet.com/~bsturk , (el componente se llama my_panel.zip, si no se encuentra
en el lugar indicado, rastrearlo por los medios ya dichos o usar un sitio de busqueda de
archivos como http://ftpsearch.ntnu.no/ftpsearch) este componente permite poner un panel
con un fondo tipo wallpaper en la ventana de la aplicacion:
PROCEDIMIENTO
1.-Bajarlo de Internet y ponerlo en un directorio temporal en disco duro.
2.-Descomprimirlo, observar que deberá haber cuando menos un archivo de tipo *.pas,
*.cpp, *.obj
3.-Copiar los archivos fuentes (.pas, .cpp, .obj, .res. etc.) a el folder BIN de C++Builder, si
C++Builder se instalo con las opciones de default, entonces el path es c:\program
files\borland\cbuilder\bin
4.- Cargar o arrancar el C++Builder.
5.- Dentro de menú principal, primero click en component.
6.- Click en Install (sale ventana Install component).
7.- Click en botón Add (sale una ventana llamada Add module).
8.- Click en botón browse (sale una ventana llamada Add component).
9.- Abajo cambiar el tipo de archivo ( Files of Type) de a .CPP o .PAS dependiendo del
código fuente obtenido con el componente.
10.- Ir subiendo arriba desde el directorio de projects hasta llegar al directorio BIN.
11.- Aquí en este directorio Bin, debe existir y aparecer ahora un archivo llamado
my_panel.cpp o .pas
12.- Seleccionar este ultimo archivo y click en botón open.
13.- C++Builder regresa ahora a la ventana Install Component,
14.- Click en botón OK.
15.- Empieza ahora un proceso de compilación de librerías, esperar hasta que Done=Make,
click en OK, sigue reconstruyendo.
16.- Revisar que ahora en la barra de componentes, se encuentre una nueva pestaña
(Samples),con sus nuevo componentes.
17.- Recordar que con opción Configure Palete y Rebuild Library, se pueden reorganizar
paginas y componentes.
TAREAS PROGRAMACION C++BUILDER
1.- Buscar e instalar los componentes de Internet de Borland
2.- Buscar e Instalar un componente llamado wallpaper
3.- Buscar e instalar una pagina completa de componentes matemáticos.
TEMA 5 CREACION E INSTALACION DE COMPONENTES VISUALES
C++BUILDER
La herramienta mas poderosa de la programacion moderna (objeto-visual) es la capacidad
increible y la manera tan sencilla de poder crear y manipular nuestros propios componentes,
que seguramente seran, mucho mas faciles de usar y de entender, que los que trae de default
el C++Builder o los obtenidos de Internet.
Supongase que se quiere un componente muy especializado o mas estetico, por ejemplo
TRadio o TGrabadora (observar que componentes personales empiezan con la letra T, esto
es una convencion), solo se tiene que :
* primero derivarlo de algún componente del C++Builder que se le parezca o sea
apropiado, por ejemplo el media player.
* luego modificarle, o agregarle algunas o nuevas propiedades, esto se hace mediante
código ya conocido,
* después agregarle nuevos eventos, o programarle, algún default a los ya heredados.
* al final, instalarlo en alguna de las paginas de componentes.
Notas.
1.- Todo nuevo componente visual, se debera derivar de algun componente ya creado.
2.- Todo componente hereda todas las propiedades (caracteristicas),
metodos(procedimientos o funciones propios) y eventos (respuestas programadas del
componente a una interacción con otro objeto o componente) del componente padre.
3.- Borland provee de una tabla, que muestra todos los componentes de caracter visual y no
visual, dicha tabla es necesario conocerla, para poder localizar el componente apropiado,
para derivar el componente que se esta creando.
Diagrama Simplificado de la jerarquía de componentes
* tomado de Component Writer's Guide
* El diagrama jerárquico completo, es muy grande y muestra mas de 100 clases y objetos,
es necesario conseguirlo y tenerlo a la mano.
El ejemplo será muy simple, se derivara un componente llamado miboton a partir del
componente visual TButton, solo se modificaran algunas propiedades.
1.- Cargar el C++Builder
2.- File, Close All
3.- Component, new y aparece la siguiente ventana:
Class Name = miboton.
Ancestor Type= usar flechita para buscar y seleccionar TButton.
Palette Page = usar flechita para buscar y seleccionar Standar.
Click en Ok
4.- Aparece ahora el siguiente código dentro de unit1.cpp:
observar las cuatro partes o áreas bien diferenciadas entre si y la notas (encerradas entre
{{}} personales puestas ahí para su aclaración.
//----------------------------------------------------------------
{{ primera área, solo código para incluir la librería de componentes
visuales(vcl.h) y una librería de interfase(mas adelante se explica que
significa(ver Pascal)) llamada unit.h }}
#include <vcl\vcl.h>
//----------------------------------------------------------------
{{ segunda parte, código de C++Builder para verificar que el componente
creado miboton, es derivado de un componente valido y visual existente,
en este caso de TButton }}
static inline miboton *ValidCtrCheck()
{
return new miboton(NULL);
}
//----------------------------------------------------------------
{{ tercera área y la mas importante, es el constructor (primer
procedimiento o función que se ejecuta cuando se usa este componente, es
decir se activa automáticamente en el momento de ponerlo en Form1), es
decir es en esta parte donde se pueden agregar las modificaciones a las
propiedades que se pretenden hacer, posteriormente desde aquí también se
puede enlazar o llamar o invocar a otros métodos propios }}
__fastcall miboton::miboton(TComponent* Owner): TButton(Owner)
{
}
//----------------------------------------------------------------
{{ cuarta área, código de C++Builder para registrar nuestro componente en
la pagina "Standar" }}
namespace Unit1
{void __fastcall Register()
{
TComponentClass classes[1] = {__classid(miboton)};
RegisterComponents("Standard", classes, 0);
}
}
//----------------------------------------------------------------
Como se observa, solo se deberá usar la tercera área, solo escribir el
siguiente código dentro de las llaves que están abajo del constructor.
//----------------------------------------------------------------
__fastcall miboton::miboton(TComponent* Owner): TButton(Owner)
{
Height = Height * 2;
Width = Width * 3;
Font->Color=clGreen;
Caption = "Hola, Bienvenido a C++Builder";
}
Se ha insistido bastante, que es necesario conocer y estudiar y aprender todas las
propiedades, métodos y eventos de todos los componentes visuales.
5.- File, Save As, escribir miboton y luego click en Save.
Con este paso el nuevo componente miboton, queda en el directorio Bin(en dos archivos,
miboton.cpp y miboton.h) de C++Builder, listo para instalarlo en la paleta de componentes,
los siguientes pasos son similares a la instalación de componentes bajados de Internet.
6.- File, Close All
7.- Componente, Install
8.- Add
9.- Browse y click en miboton
10.- Open, y ya debe aparecer abajo en la ventana izquierda de componentes instalados.
12.- Click en OK, y empieza a compilar la librería de componentes, y esperar hasta que
Done=Make y entonces click en OK.
Si no hay errores, el componente miboton ya se encuentra en la pagina standard y listo para
que lo use cualquier aplicación, si hay errores, usar el siguiente procedimiento de
corrección y modificación de errores y componentes.
TEMA 6 CORRECCION Y MODIFICACION DE COMPONENTES VISUALES
C++BUILDER
Procedimiento:
1.- File, Close All
2.- File, Open y subir hasta el directorio Bin de C++Builder, click en miboton.cpp, para
cargarlo.
3.- Corregirlo o modificarlo.
4.- File, Save
5.- File, Close All
6.- Component, Rebuild Librery
7.- Done=MaKe, entonces click OK
TEMA 7 ELIMINACION DE COMPONENTES C++BUILDER
Recordar que con la opción de Delete en configure Palette, solo se eliminan lógicamente
los componentes visuales instalados.
Este procedimiento elimina completamente los componentes o paginas, para recuperar
paginas se deberá reinstalar C++Builder, para recuperar componentes propios se deberán
crearlos e instalarlos de nueva cuenta.
Procedimiento:
1.- File, Close All
2.- Componente, Install
3.- Seleccionar y click en la ventana derecha, la pagina o componente a remover
4.- Click en botón Remove
5.- Click en OK y empieza la compilación hasta que Done=Make y OK
6.- Cerrar Builder y con el explorer o Mycomputer de Windows ir al directorio Bin de
C++Builder, buscar y eliminar los dos archivos del componente, en este ejemplo
miboton.cpp y miboton.h
8.- AGREGANDO UN RECURSO BITMAP AL COMPONENTE C++BUILDER
A cada componente se le puede asociar tres tipos de recursos graficos:
a) Un bitmap.- Es un icono grafico creado para sustituir, el icono de default en la barra de
componentes.
b) Un icon.- Grafico pequeño que aparece en la parte superior de un componente.(observar
Form1).
c) Un cursor.- Algunos componentes tiene la propiedad de manejar un cursor diferente al
default(la flechita), es posible crear cursores especiales y asignarlos al componente( si el
componente tiene está propiedad), en el momento que el componente recibe el focus del
programa, es decir en el momento que entra el cursor de default, se activara el nuevo
cursor.
Procedimiento:
Se supone que ya esta creado e instalado el componente original, en este ejemplo
miboton.cpp y miboton.h
1.- File, Close All
2.- Component, Install, seleccionar miboton.cpp, Remove, Ok, esperar hasta Done=Make,
Ok
* Este paso remueve el componente con su viejo bitmap, de la paleta de cmponentes.
3.- Tools, Image Editor, que es una ventana muy parecida al paint.
4.- Dentro del editor de imagenes:
4.1.- File, new, Resource File, y aparece una nueva ventanita, que tiene como primer
renglon, -Contents
4.2- Cursor sobre Contents y click derecho para un minimenu y crearle un bitmap, un icon
y un cursor
4.3.- Cursor sobre bitmap y click derecho para, primerlo editarlo y segundo renombrarlo
con miboton ( atención es necesario que el bitmap se llame igual que el componente)
4.4.- Cursor sobre icon y click derecho para, primero editarlo y luego renomrarlo a miboton
4.5.- Cursor sobre cursor y click derecho para, primerlo editarlo y luego renombrarlo a
miboton tambien.
*Esta ventanita debe verse como lo siguiente:
4.6.- File, Save As, conmo miboton.res
4.7.- File, Exit
5.- En C++Builder:
Component, Install, Add, Browse, miboton.cpp, open, ok,
esperar a Done=Make, Ok y ya debe aparecer el componente en la paleta con su nuevo
bitmap.
TEMA 9 CREACION DE COMPONENTES NO VISUALES C++BUILDER
En este temas se analiza, la creación y construcción de componentes no visuales.
La necesidad de este tipo de componentes se desprende del hecho de que existen muchas
tareas de programación de carácter repetitivo a lo largo de la construcción de muchas
aplicaciones, por ejemplo se manejan en 10 programas, o tareas o aplicaciones distintas el
mismo conjunto de tres fórmulas matemáticas o financieras, etc.
En caso como estos, es mas conveniente crear un componente especializado en solución de
dichas fórmulas y estarlo reutilizando en las diversas aplicaciones que lo ocupen.
Para realizar esto primero diseñamos la clase correspondiente, tal como el ejemplo de
clases en paginas anteriores:
// declaración de la clase, sus variables y sus métodos
Class fórmulas
{
int areatriangulo( int base, int altura);
float pesosdolares (int pesos, float tipocambio);
double promedio(int calif1, int calif2);
}
// implementacion de los métodos de la clase
int formulas::areatriangulo(int base, int altura)
{ return base* altura /2 ;}
float formulas::pesosdolares(int pesos, float tipocambio)
{ return pesos/tipocambio; }
double formulas::promedio(int calif1, int calif2)
{return (calif1+calif2)/2.0 ;}
La pasamos ahora al C++Builder, el procedimiento comentado es:
Procedimiento:
1.- File, Close All
2.- Componente New,
Clase Name = fórmulas
Ancestor = TComponent
Page = Standard
* Observar que todo clase no visual, se deriva de TComponent, con esto se asegura un
mínimo visual de propiedades, incluyendo un icono de default, para la barra de
componentes y un par de eventos, los métodos de la clase es lo que se va a construir y
programar.
3.- File Save As, fórmulas, Save
4.- A la vista queda el editor con formulas.cpp , en la parte de arriba donde dice #include
<formulas.h>, poner cursor encima y click derecho para el popupmenu, seleccionar la
primera opción, de open source/header file, y con esto ya se tendrán a la vista los dos
archivos que se ocupan para construir la clase, ellos son formulas.cpp y formulas.h
En estos dos archivos se construye la clase, la parte declarativa de la clase queda en el
archivo formulas.h y la parte de implementacion o los métodos quedan en el archivo
formulas.cpp, como observación en PASCAL solo se ocupa el archivo llamado unit.pas y
ahí quedan juntos pero en su área apropiada las dos partes de una clase, su declaración y su
implementación.
Observar el código ya generado por C++Builder de formulas.h;
//----------------------------------------------------------
#ifndef formulasH
#define formulasH
//----------------------------------------------------------
#include <vcl\SysUtils.hpp>
#include <vcl\Controls.hpp>
#include <vcl\Classes.hpp>
#include <vcl\Forms.hpp>
//----------------------------------------------------------
class fórmulas : public TComponent
{
prívate:
protected:
public:
__fastcall fórmulas(TComponent* Owner);
__published:
};
//----------------------------------------------------------
#endif
1.- Recordar que es en este archivo el .h donde se hace la declaración de la clase.
2.- Observar que C++Builder ya definió la clase y la hizo un descendiente publico de
TComponent, esto de publico es para permitir que todos los demás componentes puedan
accesar las propiedades y métodos de la clase Fórmulas.
3.- Variables, métodos( procedimientos y funciones) y propiedades que ocupe la clase
fórmulas deberán declararse dentro de la llaves.
4.- Tomar nota que pueden existir cuatro tipos diferente de variables, métodos y
propiedades, ellos son:
prívate: solo métodos dentro de la propia clase, tienen
acceso y pueden manipularlos.
protected: No pueden ser accesados por código fuera de la la clase, pero si por métodos de
la propia clase.
public: Código externo, otras clases y métodos propios pueden accesarlos.
_published: Solo para propiedades que se quiera que aparezcan en el inspector de objetos.
5.- Para el ejemplo de la clase que se esta manejando, se escriben o mejor dicho declaran
los métodos en la parte publica de la clase, como en el siguiente ejemplo
//----------------------------------------------------------------
#ifndef formulasH
#define formulasH
//----------------------------------------------------------------
#include <vcl\SysUtils.hpp>
#include <vcl\Controls.hpp>
#include <vcl\Classes.hpp>
#include <vcl\Forms.hpp>
//----------------------------------------------------------------
class fórmulas : public TComponent
{
prívate:
protected:
public:
__fastcall fórmulas(TComponent* Owner);
int areatriangulo( int base, int altura);
float pesosdolares (int pesos, float tipocambio);
double promedio(int calif1, int calif2);
__published:
};
//----------------------------------------------------------------
#endif
6.- La parte de implementacion, se escribe al final del archivo .cpp, como se muestra en el
siguiente ejemplo.
//----------------------------------------------------------------
#include <vcl\vcl.h>
#pragma hdrstop
#include "formulas.h"
//----------------------------------------------------------------
static inline fórmulas *ValidCtrCheck()
{
return new fórmulas(NULL);
}
//----------------------------------------------------------------
__fastcall formulas::formulas(TComponent* Owner):TComponent(Owner)
{
}
//----------------------------------------------------------------
namespace Fórmulas
{
void __fastcall Register()
{
TComponentClass classes[1] = {__classid(fórmulas)};
RegisterComponents("Standard", classes, 0);
}
}
//----------------------------------------------------------------
// implementacion de los métodos de la clase
int formulas::areatriangulo(int base, int altura)
{ return base* altura /2 ;}
float formulas::pesosdolares(int pesos, float tipocambio)
{ return pesos/tipocambio; }
double formulas::promedio(int calif1, int calif2)
{return (calif1+calif2)/2.0 ;}
* Solo se escriben los últimos renglones y en la posición indicada, es decir al final del
archivo .cpp
7.- Files, Save All
8.- File, Close All
9.- Component, Install, Add, Browse, formulas.cpp, Open, Ok hasta
que Done=Make, entonces OK
* Observar el nuevo icono de fórmulas en la barra de componentes.
Ejemplo de aplicación:
1. Pantalla de Diseño:
b) Código
//----------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
Edit3->Text=formulas1->promedio(Edit1->Text.ToInt(),
Edit2->Text.ToInt() );
}
//----------------------------------------------------------------
3. Pantalla de corrida
VI UNIDAD C++BUILDER MULTIPROCESAMIENTO
C++BUILDER TEMA I INTRODUCCION
Uno de los elementos o aspectos mas usados y aprovechados por todos los usuarios de
Windows, es la propiedad que tiene Windows de realizar múltiples tareas a la vez, es con
esta característica por la que se puede tener abiertas tres o mas ventanas a la vez y cada una
de ellas realizando su propia tarea, por ejemplo se puede estar checando ortografía en una
ventana de word, al mismo tiempo buscando un ítem en una columna muy grande de excel,
y a la vez dos o mas ventanas de netscape están bajando software, etc.
Esta capacidad de MULTIPROCESAMIENTO ha sido muy poco aprovechada en los
ambientes de programación, C++Builder hace fácil la tarea de construir programas o
aplicaciones que tomen ventaja de esta capacidad.
Una de las principales razones de este problema, es que los ingenieros de software
(programadores) todavía están muy acostumbrados a razonar los programas o aplicaciones
como un conjunto secuencial y finito de procesos, donde la ejecución de uno de ellos
depende enteramente de la ejecución de los anteriores.
Es mejor y necesario considerar un programa o aplicación, como un conjunto de objetos
interactuando entre si, desde este punto de vista, algunos o muchos de los objetos pueden
tener su propia existencia y tiempo de ejecución en forma autónoma e independiente del
resto de los demás.
Por ejemplo en una aplicación cualquiera, existirán objetos que efectivamente dependan de
la terminación de la funcionalidad de otro objeto, pero es claro que también existirán partes
u objetos con una finalidad propia e independiente de los demás, estos últimos son
candidatos para convertirse en objetos de tipo multiproceso, es decir objetos que se ejecutan
ya no en forma secuencial sino concurrente es decir al mismo tiempo que los demás.
Ejemplo de ellos, se puede construir un objeto cuya función sea exclusivamente a localizar
u dato en una tabla o base de datos muy grande, en este caso, el programa principal solo
tendrá que ir creando instancias de este objeto y mandarle su parámetro de búsqueda, de
esta manera se podrán hacer muchas consultas al mismo tiempo a la tabla, sin tener que
esperar que termine una consulta, para empezar otra.
Una situación similar seria múltiples reportes de impresión, donde cada uno de ellos seria
un hilo de un proceso.
Mas ejemplos:
- Un objeto que este generando continuamente números aleatorios
- Un objeto reloj
- Un objeto que este desplegando dos o mas imágenes muy similares continuamente(30
frames o imágenes por segundo y se tiene una película)
- Un objeto que este actualizando continuamente una base de datos
- etc. ( este etc. es problema sugerido)
C++Builder, recomienda solo hasta 16 procesos ejecutándose concurrentemente a la vez.
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 métodos)
Se analiza el objeto Thread en su perspectiva mas simple y se anexan comentarios para su
comprensión:
Procedimiento:
1.- File, Close All
2.- File, New, Thread Object class name = proceso1
3.- File, Save As
- abrir folder tarea1
- proceso1
4.- Click derecho en donde dice #include ―proceso1.h‖ y open source/header, para tener a la
vista los dos archivos normales de un componente proceso1.cpp y proceso1.h
* Observar que este objeto, crea una clase llamada proceso1 derivada de la clase Thread.
* Esto también significa que en proceso1.h se almacena la declaración o definición de la
nueva clase proceso1 y que en el archivo proceso1.cpp se almacenara la implementación de
los métodos que contenga la clase proceso1, tal como se analizo en la
UNIDAD de componentes.
5.- El Código de proceso1.h es;
//----------------------------------------------------------
#ifndef proceso1H
#define proceso1H
//----------------------------------------------------------
#include <vcl\Classes.hpp>
//----------------------------------------------------------
class proceso1 : public TThread
{
prívate:
protected:
void __fastcall Execute();
public:
__fastcall proceso1(bool CreateSuspended);
};
//----------------------------------------------------------
#endif
* Una clase proceso1 descendiente de la clase TThread, no hay sorpresas aquí.
* Un método protegido llamado Execute(), este método es muy importante porque cuando
se crea una instancia de la clase proceso1, todo el código que contiene es ejecutado
automáticamente, en otras palabras, es dentro de este método donde se coloca el código del
proceso ( en el archivo de implementación).
* El constructor proceso1, lleva como parámetro una variable booleana es decir con valor
true o valor false.
* Además el propio constructor como se observa en el código crea el proceso, pero el hilo
lo tiene suspendido, en cuanto se active o continúe el proceso, este constructor llama o
activa el método Execute().
6.- El código de proceso1.cpp es:
//----------------------------------------------------------
#include <vcl\vcl.h>
#pragma hdrstop
#include "proceso1.h"
//----------------------------------------------------------
// Important: Methods and properties of objects in VCL can
// only be used in a method called using Synchronize, for // // example:
//
// Synchronize(UpdateCaption);
//
// where UpdateCaption could look like:
//
// void __fastcall proceso1::UpdateCaption()
// {
// Form1->Caption = "Updated in a thread";
// }
//----------------------------------------------------------
__fastcall proceso1::proceso1(bool CreateSuspended)
: TThread(CreateSuspended)
{
}
//----------------------------------------------------------
void __fastcall proceso1::Execute()
{
//---- Place thread code here ----
}
//---------------------------------------------------------
* No hay muchas sorpresas, solo la implementación de los dos métodos que contiene la
clase:
1.- El constructor proceso1, con su parámetro
2.- El método Execute() que deberá contener el código del proceso y que se activara cuando
se resuma o se pida que se continúe el proceso.
* Pero si existen unos comentarios o recomendaciones muy importantes que siempre
deberán tenerse en cuenta.
El resumen de la recomendación es que nunca se deberá poner dentro del código del
método Execute(), ninguna instrucción que referencie directamente un componente de
VCL, incluyendo Form1 o cualquier componente visual.
* Si el Método Execute(), necesita procesar cualquier elemento o componente visual,
deberá hacer una llamada a un segundo método que si podrá manipular directamente la
forma o el componente necesitado, y además la llamada de Execute() al segundo método,
deberá ser dentro de un método especial de Execute(), llamado Synchronize(segundo
método).
* El ejemplo que se da en el comentario, es que se pretende que dentro de un proceso
concurrente o hilo, se actualice el Caption de Form1, recordando lo anterior, ese
actualización no puede hacerse directamente dentro del método Execute(), en su lugar
Execute(), hace un llamado a otro método(UpdateCaption) de la clase, para que este ultimo
método lo actualice.
Se construye el primer programa concurrente, usando el ejemplo que esta en el comentario.
Procedimiento:
1.- Crear el Thread Object, grabarlo como se indico, y cargar a la vista los dos archivos,
proceso1.h y proceso1.cpp
2.- Modificar los códigos con las siguientes instrucciones:
2.1.- proceso1.h
//----------------------------------------------------------
#ifndef proceso1H
#define proceso1H
//----------------------------------------------------------
#include <vcl\Classes.hpp>
//----------------------------------------------------------
class proceso1 : public TThread
{
prívate:
protected:
void __fastcall UpdateCaption();
void __fastcall Execute();
public:
__fastcall proceso1(bool CreateSuspended);
};
//----------------------------------------------------------
#endif
* Observar que como se ocupa un segundo método especializado, en accesar componentes
visuales, se tiene que declarar dentro de la clase, ya sea en su parte protegida o en su parte
publica.
2.2.- proceso1.cpp
//----------------------------------------------------------
#include <vcl\vcl.h>
#pragma hdrstop
#include "proceso1.h"
//----------------------------------------------------------
// Important: Methods and properties of objects in VCL can // only be
used in a method called using Synchronize, for // example:
//
// Synchronize(UpdateCaption);
//
// where UpdateCaption could look like:
//
// void __fastcall proceso1::UpdateCaption()
// {
// Form1->Caption = "Updated in a thread";
// }
//----------------------------------------------------------
__fastcall proceso1::proceso1(bool CreateSuspended)
: TThread(CreateSuspended)
{ }
//----------------------------------------------------------
void __fastcall proceso1::Execute()
{
//---- Place thread code here ----
Synchronize(UpdateCaption);
}
//----------------------------------------------------------
void __fastcall proceso1::UpdateCaption()
{
Form1->Caption = "Updated in a thread";
}
* Observar que Execute(), en este caso solo llama a un segundo método(), usando su
método especial.
* El segundo método, es un caso normal, se declaro en el archivo proceso1.h y se construyo
o implemento al final del archivo proceso1.cpp
* Grabar los dos archivos con File, Save All o CTRL S con cada uno, ya grabados en folder
tarea1, usar File, Close All
La preguntas son:
1.- Como se incorpora este objeto concurrente a una aplicación
2.- Como se activa o se continua la ejecución del proceso concurrente.
R.- esperar a la tercera edición del libro :>)
Procedimiento:
1.- Crear y almacenar el objeto thread, llamado proceso1 con el procedimiento anterior,
asegurarse de que ya todo este CLOSE All y los archivos en folder tarea1.
2.- File, New Aplication
3.- File, Save Project as, y asegurarse que se grabe dentro del folder tarea1
4.- Poner un BUTTON OK y solo se escriben los siguientes tres renglones de código:
#include "proceso1.cpp"
proceso1 *pro1;
pro1 = new proceso1(false);
* observar dentro de Unit1, donde va cada uno de ellos;
4.1.- Unit1.cpp
//----------------------------------------------------------
#include <vcl\vcl.h>
#pragma hdrstop
#include "Unit1.h"
//----------------------------------------------------------
#pragma resource "*.dfm"
TForm1 *Form1;
#include "proceso1.cpp"
//----------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//----------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
proceso1 *pro1;
pro1 = new proceso1(false);
}
//----------------------------------------------------------
* #include ―proceso1.cpp‖, es para que Form1 o sus componentes, puedan accesar
proceso1.
* proceso1 *pro1; crea un variable de tipo proceso1 llamada pro1 derivada o instancia de la
clase proceso1
* pro1 = New proceso1(false); crea físicamente o en memoria el objeto, llamando a su
constructor.
* false.- Recordar que el constructor crea el objeto concurrente pero suspendido, es decir en
proceso1, CreateSuspend = true(default), por esa razón en la llamada al constructor se le
informa que CreateSuspend = false, por tanto el proceso se reactiva y hace la llamada al
método Execute().
* Como se observa, no es necesario ni tampoco se puede llamar directamente al método
Execute(), es decir no es valido pro1→Execute(); pero si es valido
pro1→Resume(), pro1→Suspend(), pro1→Terminate(), etc., ver la ayuda de la clase
TThread.
La pantalla de salida es:
Tema 3 Aplicaciones Concurrentes c++builder
Se construye ahora, una aplicación con dos objetos concurrentes, el primero despliega los
números del uno al mil, y el segundo lo mismo pero de dos en dos.
Procedimiento:
1.- File, Close All
2.- Crear el Thread Object, llamarlo y grabarlo como proceso1 con el procedimiento
anteriormente descrito, no olvidar al final File, Close All
2.1.-Codigo de proceso1.h
//---------------------------------------------------------
#ifndef proceso1H
#define proceso1H
//----------------------------------------------------------
#include <vcl\Classes.hpp>
//----------------------------------------------------------
class proceso1 : public TThread
{
prívate:
protected:
int alfa;
void __fastcall Editar();
void __fastcall Execute();
public:
__fastcall proceso1(bool CreateSuspended);
};
//----------------------------------------------------------
#endif
2.2.-Codigo de proceso1.cpp
//----------------------------------------------------------
#include <vcl\vcl.h>
#pragma hdrstop
#include "proceso1.h"
//----------------------------------------------------------
__fastcall proceso1::proceso1(bool CreateSuspended)
: TThread(CreateSuspended)
{
}
//----------------------------------------------------------
void __fastcall proceso1::Execute()
{ //---- Place thread code here ----
for(alfa=1;alfa<=1000;alfa++)
{ Synchronize(Editar); };
}
//---------------------------------------------------------
void __fastcall proceso1::Editar()
{ Form1->Edit1->Text=alfa;
}
3.- Crear otro Thread Object, llamarlo y grabarlo como proceso2 con el procedimiento ya
descrito, no olvidar al final File, Close All
3.1- Código de proceso2.h
//----------------------------------------------------------
#ifndef proceso2H
#define proceso2H
//---------------------------------------------------------
#include <vcl\Classes.hpp>
//----------------------------------------------------------
class proceso2 : public TThread
{
prívate:
protected:
int beta;
void __fastcall Editar();
void __fastcall Execute();
public:
__fastcall proceso2(bool CreateSuspended);
};
//----------------------------------------------------------
#endif
3.2- Código de proceso2.cpp
//----------------------------------------------------------
#include <vcl\vcl.h>
#pragma hdrstop
#include "proceso2.h"
//---------------------------------------------------------
__fastcall proceso2::proceso2(bool CreateSuspended)
: TThread(CreateSuspended)
{
}
//----------------------------------------------------------
void __fastcall proceso2::Execute()
{ //---- Place thread code here ----
for(beta=1;beta<=2000;beta=beta+2)
{ Synchronize(Editar); }
}
//----------------------------------------------------------
void __fastcall proceso2::Editar()
{ Form1->Edit2->Text = beta;
}
4.- File, New Aplication y no olvidar File, Save Project As dentro del folder tarea1.
5.- Colocar dos edits y dos buttons, en la aplicación, el
código de Unit1.cpp, es;
//----------------------------------------------------------
#include <vcl\vcl.h>
#pragma hdrstop
#include "Unit1.h"
//----------------------------------------------------------
#pragma resource "*.dfm"
TForm1 *Form1;
#include "proceso1.cpp"
#include "proceso2.cpp"
//----------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//----------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{ proceso1 *pro1;
pro1 = new proceso1(false);
pro1->Terminate();
}
//----------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{ proceso2 *pro2;
pro2 = new proceso2(false);
pro2->Terminate();
}
//---------------------------------------------------------
* Observar que ahora hay dos include arriba
* cada botón activa su propio proceso
* Se usa el método Termínate(), para asegurarse que termine el proceso, pero es redundante
porque el destructor se activa la terminar el ámbito del buttonclick();
1. La pantalla de salida es:
No parece impresionante, pero las dos cajas Edits, se están cargando al mismo tiempo, es
decir concurrentemente.