Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Contenido
INTRODUCCIÓN.................................................................................................................7
COMPONENTE............................................................................................................................38
TIPOS DE COMPONENTES..............................................................................................................38
Visibles ..........................................................................................................................39
No Visibles .................................................................................................................... 39
COLOCANDO COMPONENTES EN LA FORMA ...................................................................................39
MANIPULACIÓN DE COMPONENTES .............................................................................................. 40
Selección de componentes..............................................................................................40
Formas para seleccionar componentes......................................................................... 41
Moviendo los Componentes .......................................................................................... 41
Cambiándole el Tamaño a los Componentes ................................................................42
Borrando Componentes ................................................................................................ 43
CREACIÓN DE UN FORMULARIO SIMPLE.......................................................................................... 43
Colocación de los componentes en el formulario..........................................................43
USO DEL INSPECTOR DE OBJETO PARA CAMBIAR PROPIEDADES............................................................44
Propiedades....................................................................................................................44
Tipos de propiedades..................................................................................................... 44
LA PROPIEDAD NAME.................................................................................................................47
SINTAXIS PARA LA MANIPULACIÓN DE PROPIEDADES POR PROGRAMACIÓN............................................ 48
USO DEL INSPECTOR DE OBJETO PARA CAMBIAR PROPIEDADES............................................................48
PROGRAMACIÓN DE EVENTOS....................................................................................................... 50
Eventos...........................................................................................................................50
Tipos de eventos.............................................................................................................50
Manejadores de eventos.................................................................................................50
USO DEL INSPECTOR DE OBJETO PARA PROGRAMAR EVENTOS............................................................. 50
RESUMEN DEL DISEÑADOR DE FORMULARIOS..................................................................................53
INTERACTUANDO CON LOS COMPONENTES........................................................54
INTRODUCCIÓN AL DISEÑO DE FORMULARIO.................................................................................... 55
CREACIÓN DE BARRA DE HERRAMIENTAS Y BARRAS DE ESTADO......................................................... 55
COMPONENTE PAGECONTROL......................................................................................................56
Agregando paginas........................................................................................................ 56
Componente ScrollBox...................................................................................................57
COMPONENTES DE CAJA DE DIALOGO.............................................................................................58
Cambiando el tipo de letra y el color.............................................................................58
COMPONENTES DEL SISTEMA....................................................................................................... 59
USO DE LOS COMPONENTES SAMPLES............................................................................................60
Método............................................................................................................................61
RESUMEN DE INTERACTUANDO CON LOS COMPONENTES....................................................................63
CREACIÓN DE MENÚ..................................................................................................... 64
INTRODUCCIÓN A LA CREACIÓN DE MENÚS......................................................................................65
DISEÑADOR DE MENÚS................................................................................................................65
Como abrir el diseñador de menú..................................................................................66
Punto de Inserción......................................................................................................... 66
Autor: José Uribe Página 2
Universidad del Caribe
Introducción
Delphi es la vía más poderosa para crear aplicaciones de propósito general bajo Windows.
Mientras que muchos piensan que es la mejor herramienta para crear aplicaciones cliente /
servidor, es también un magnifico ambiente para crear aplicaciones de propósito mas
general que no están basadas en base de datos. Usted puede crear un paquete de hoja de
calculo o un procesador de palabras.
Este material fue diseñado para que el estudiante aprenda los conceptos básicos, el
funcionamiento, las herramientas de esta poderosa herramienta de programación visual
como lo es Delphi. Para el máximo aprovechamiento de este curso el estudiante deberá
tener una mínima experiencia en programación, y que se esta familiarizado con conceptos
como ciclos, estructuras de decisión, el conocimiento del sistema operativo Windows.
Introducción a Delphi
Características de Delphi
Versiones
Ambiente o entorno de Trabajo
Configuración del Ambiente
Instalación de herramientas
Introducción a Delphi
Características de Delphi
Versiones de Delphi
La versión Standard
La versión profesional
Borland diseñó la edición Profesional para programadores que necesitan mas funcionalidad
que la que viene en la edición Standard, pero que no necesitan todas las características
extras del paquete cliente / servidor. Esta versión viene con todo lo de la Standard Mas:
La versión Enterprise
SQL links native drivers para Oracle, Sybase, Interbase, Informix, DB2
SQL Database Explorer para manejar los datos del servidor
Visual Query Builder
Data Pump expert
Interbase database server con 2 licencias
El ambiente de desarrollo es exactamente el mismo sin importar que versión usted tenga.
La diferencia esta en las herramientas y software que son provistos. De hecho, usted puede
comprar la versión Standard y después actualizarse a la versión Enterprise
Inicialización de Delphi
Una vez que Delphi ha sido instalado en el computador este crea un grupo de programa en
el menú de Windows. Para cargar Delphi solamente hay que hacer clic sobre el Menú Start
(Inicio) de Windows seleccionar la opción Programs (Programas) y buscar el grupo donde
fue instalado Delphi. El grupo normalmente se llama Borland Delphi x y hacer clic sobre el
icono de Delphi que normalmente esta seguido por el siguiente letrero Delphi x ; donde la x
significa la versión de Delphi, por ejemplo: si la versión de Delphi es la 5; entonces el
grupo se llamaría: Borland Delphi 5 y el icono u opción se llamaría Delphi 5.
Ambiente de Delphi
El ambiente o entorno de Delphi es lo que usted ve cuando usted carga Delphi. El ambiente
de Delphi esta constituido por las siguientes herramientas:
Ventana principal
• Menú Principal
• Barra de acceso directo
• Paleta de Componentes
Autor: José Uribe Página 10
Universidad del Caribe
Ventana Principal
Menú principal
Help Ayuda.
Se encuentra ubicada en la parte izquierda de la ventana principal y esta compuesta por una
serie de barras las cuales son independientes cada una. Cada barra esta formada por botones
llamados Speed Button y que nos permiten acceder a las opciones más comunes del menú
principal de una forma más rápida.
Paleta de Componente
La paleta de componente de Delphi esta compuesta de una serie de pagina, donde cada
página selecciona una categoría diferente de componente y los componentes están
agrupados de acuerdo a su función. Además en la esquina superior derecha de la paleta de
componente se encuentran dos botones que sirven para mostrar las paginas de componentes
que se encuentran ocultas. Por otro lado se debe notar que también existen unas pequeñas
flechas al lado de los componentes, estas flechas sirven para mostrar los componentes que
se encuentran ocultos en una pagina.
Consiste en una ventana con un menú que aparece próximo al puntero del Mouse cuando
usted presiona el botón de la derecha del Mouse. El menú de acceso directo permite acceder
de una forma más rápida a los comandos del menú principal que aplican en el lugar donde
es invocado el menú de acceso directo. Es decir, las opciones que aparecen en el menú son
los comandos que aplican en ese lugar.
El menú de acceso directo permite ejecutar comandos de una forma mas rápida que desde
el menú principal, ya que no hay que buscar la opción, pues las opciones mostradas son
aquellas que aplican al lugar donde se invocó el menú de acceso directo.
El Inspector de Objeto
La parte superior de la ventana del inspector incluye un control de tipo combobox el cual
contiene todos los componentes que se encuentran en el formulario activo en el diseñador
de formularios (incluyendo al formulario mismo, ya que el formulario es un componente
también). Al seleccionar un componente, la parte inferior del inspector muestra las
propiedades o los eventos del mismo.
El inspector de objeto esta compuesto por dos pagina, una para las propiedades “Properties”
y otra para los eventos “Events”. Cada página esta dividida por una línea vertical que divide
cada página en un lado izquierdo y un lado derecho. En el lado izquierdo están los nombres
de las propiedades o de los eventos dependiendo de la página donde se encuentre; y del
lado derecho están los valores de las propiedades o los manejadores de eventos
Autor: José Uribe Página 15
Universidad del Caribe
dependiendo de la página en que se encuentre. Para cambiar de página solo hay que hacer
clic sobre la página deseada.
Así mismo algunos valores de algunas de las propiedades, no dependen de un valor simple
(numero o cadena), sino de un conjunto de ellos o un valor más complejo (el icono esta
marcado por tres puntos, en algunos casos), los cuales se pueden acceder a través de un
CLIC sobre el botón determinado o haciendo doble-clic en el lado derecho del nombre de la
propiedad (donde se asignan los valores).
Diseñador de Formulario
Editor de Código
Esta ventana se encuentra ubicada detrás del diseñador de formulario. Este editor es la
herramienta con la que el programador escribe o modifica el código del programa. Tiene
todas las características de cualquier editor de programa y otras características muy
especiales que hacen que sea un buen editor de programa. Entre las otras características
podemos mencionar: Resaltado de sintaxis en color, posibilidad de deshacer ilimitadamente
cualquier acción Undo o Redo, copiado de secciones de texto, copiado entre líneas, manejo
de bloque, cambio de mayúsculas a minúsculas, entre otras.
Como podemos observar en la figura anterior la ventana del editor de código esta dividida
en paginas. Cada página corresponde a un archivo abierto. En la barra de título de la
ventana no indica el nombre del archivo que esta activo actualmente. Tiene una barra de
estado que indica la línea y columna donde se encuentra el cursor. El estado del archivo y el
modo de edición (Insert o Overwrite). En la esquina superior derecha podemos observar
unos botones de desplazamiento; que sirven para mostrar las paginas de archivos abiertos
que están ocultas. Una nueva característica del editor de código en esta versión de Delphi es
la ventana de exploración de código. Esta ventana facilita la navegación a través de las
unidades de código. En ella podemos ver detalladamente las partes de una unidad y
podemos movernos a cualquiera de ellas con solo hacer un Doble-clic.
Instalación de herramientas
Delphi es una ambiente de trabajo abierto, lo que quiere decir que Borland ha creado una
interfase para que los programadores puedan integrar sus productos y herramientas de
trabajo dentro de Delphi. De esta forma pueden ejecutar cualquier programa sin necesidad
de seguir los pasos tradicionales en el sistema operativo de Windows.
Para integrar una aplicación dentro de Delphi es bien fácil, solamente hay que ejecutar la
opción Tools | Configure Tools del menú principal y aparecerá la siguiente ventana:
Esta ventana le permite agregar cualquier herramienta que usted desee ejecutar desde el
ambiente de trabajo de Delphi. Para agregar una aplicación solamente haga clic sobre el
botón Add e introduzca las informaciones necesarias en la ventana que aparecerá al
presionar este botón. El botón Delete sirve para eliminar de la ventana de herramienta
cualquier aplicación que ya no se desee tener. El botón Edit permite cambiar las
informaciones de la aplicación. Los botones de flecha sirven para cambiar el orden de los
programas que ya se encuentran agregados en la ventana de herramienta. Los programas
que son agregados en la ventana de herramientas aparecen bajo el título Tools del menú
principal.
Todo el desarrollo de aplicaciones en Delphi se centra en los proyectos; cuando usted crea
una aplicación en Delphi, usted esta creando un proyecto. El proyecto normalmente es
almacenado en un archivo con la extensión DPR (que significa Delphi Project). En la
arquitectura general de un programa en Delphi, el archivo de proyecto es el programa
principal de toda aplicación en Delphi. El archivo de proyecto corresponde a lo que era un
programa en Pascal de ahí es que viene que la primera línea del archivo de proyecto
comienza con la palabra clave program seguido del nombre del proyecto.
Partes de un proyecto
Unidad
Formulario
El archivo del formulario DFM (Delphi Form) contiene la parte visual de la aplicación,
todos los objetos gráficos que son colocados en él en tiempo de diseño, además este
archivo contiene los valores de las propiedades de los objetos, el archivo del formulario es
un archivo binario lo que significa que no puede ser abierto con cualquier editor de texto.
Como acabamos de ver anteriormente un proyecto en Delphi esta compuesto por Unidades
y formularios; las unidades contienen el código fuente y los formularios contienen la parte
visual. En los proyectos existen ciertas reglas que detallaremos a continuación:
En un proyecto en Delphi no puede haber una unidad con el mismo nombre que el
proyecto y viceversa;
Cuando usted graba o salva un proyecto, Delphi crea un archivo en el disco duro con el
nombre que usted le puso al momento de grabarlo mas la extensión DPR; además de esto
Delphi crea otros archivos con el mismo nombre del proyecto con las siguientes
extensiones RES, DOF, DSK;
Cuando usted graba una unidad Delphi crea dos archivo en el disco duro con el nombre
que usted le puso al momento de grabar, uno con la extensión PAS y otro con la extensión
DFM – en el caso que la unidad tenga un formulario -, es decir que Delphi le pide grabar la
unidad, pero graba el archivo del formulario y la unidad con el nombre que usted le puso a
la unidad.
El nombre del proyecto es tomado de la primera línea del archivo DPR, el nombre que
sigue a la palabra reservada program;
El nombre de la unidad es tomado de la primera línea del archivo PAS, el nombre que sigue
a la palabra reservada unit;
Project manager
Delphi tiene una herramienta muy poderosa para el manejo de proyectos, esta herramienta
recibe el nombre de project manager.
El project manager lista los nombres de todas las unidades, los formularios de las unidades
en caso que haya un formulario declarado en la unidad y la ruta o carpeta donde se
encuentra guardada la unidad. En Delphi 4 y Delphi 5 puede haber mas de un proyecto
abierto a la vez, para lo cual el project manager crea un projectgroup. El project manager
tiene una barra de botones en la parte superior:
El ComboBox contiene una lista de todos los proyectos que se encuentran abierto;
El botón New: sirve para agregar un nuevo proyecto;
El botón Remove sirve para quitar cualquier archivo del project manager, esto no lo
eliminará físicamente de la carpeta.
El project manager en Delphi 5 tiene una nueva característica y esta es que se puede
arrastrar cualquier archivo desde el explorador de Windows para agregarlo a un proyecto en
particular, también se puede arrastrar cualquier unidad entre proyectos.
En la opción Project del menú principal se encuentra la opción Options que sirve para
cargar la ventana Project Options que sirve para cambiar varios aspectos del proyecto. Es
una ventana que se encuentra dividida en diferentes secciones mediante el método de “Tab”
o pestañas. Las secciones en las cuales esta dividida son: Forms, Application, Compile,
Linker, Directories/Conditionals, Versión Info y Packages.
Forms
Esta ventana permite especificar cual formulario será el principal en la aplicación (en otras
palabras cual será el primer formulario que aparecerá cuando la aplicación se ejecute). La
lista que se encuentra en la parte izquierda (Auto-create forms) despliega todos los
formularios que pertenecen al proyecto. La lista que se encuentra en la parte derecha
(Available forms) permite especificar si el formulario será auto creado o no; cuando usted
tiene un formulario en la lista auto-create, el proyecto creara automáticamente la referencia
al formulario en tiempo de ejecución. Esta es la mejor opción si se sabe de antemano que
Autor: José Uribe Página 27
Universidad del Caribe
un formulario será utilizado en la aplicación. La otra opción es no dejar que Delphi cree
automáticamente el formulario lo que quiere decir que el usuario tendrá que crear la
referencia del formulario mediante código de programación para poder mostrar un
formulario. Esta es la mejor opción para los formularios que no serán utilizados cada vez
que la aplicación sea ejecutada. Cuando los formularios no son auto creados la aplicación
carga mas rápido y utiliza menos memoria.
Application
La caja de texto Title permite nombrar la aplicación con otro nombre que no sea el nombre
del archivo de proyecto. La ventana Application también permite especificar cual será el
archivo de ayuda asociado a la aplicación y además permite especificar un icono para la
aplicación.
Compiler
Note que en este lugar se especifican la configuración de compilación para cada proyecto.
La configuración de compilación es mantenida al nivel de proyecto, lo contrario del nivel
del ambiente. Esto quiere decir que usted puede tener proyectos con diferentes
configuraciones de compilación sin tener que cambiar la configuración global cada vez que
trabaje en un proyecto.
Linker
Estas opciones incluyen la especificación de un archivo Map, el cual es utilizado para fines
de depuración de errores. El uso del buffer de encadenamiento de memoria para mayor
rapidez, o el buffer de encadenamiento de disco para programas realmente grandes y cuya
información de encadenamiento no cabe en memoria.
Directories / Conditionals
Aquí se puede especificar los directorios de salida para todos los archivos del proyecto
generados por el sistema. Para algunas situaciones usted querrá mantener separados en
diferentes directorios los archivos fuente, objetos y ejecutables.
Version Info
Packages
Compilación y Encadenamiento
Para correr y distribuir la aplicación, se debe compilar. Nótese que no existe ningún
interprete de Pascal corriendo en el background, ósea que el código debe ser compilado
antes de ser ejecutado.
Compilación
Para compilar la aplicación usted puede seleccionar la opción Project | Compile del menú
principal. Usted puede solamente seleccionar Project | Syntax Check del menú para
compilarlo sin encadenarlo. De todos modos esta opción crea los archivos objetos (DCU si
usted esta compilando una unidad).
El comando Compile automáticamente compila solamente los archivos que necesitan ser
compilados. Es decir que Delphi solo compila los archivos fuentes que han sufrido cambios
y cualquier archivo que dependa de un archivo que usted haya modificado. Esta
compilación limitada aumentara el tiempo de compilación considerablemente. Delphi es lo
suficientemente inteligente para realizar solamente el trabajo que es necesario para
reconstruir el ejecutable.
Puede ser que haya situaciones en las cuales sea necesario o usted desee compilar todos los
módulos. Para realizar esto seleccione la opción Project | Build All Projects del menú.
Esto forzara al compilador a recompilar todos los archivos de todos los proyectos.
Encadenamiento
El encadenamiento en Delphi no podría ser más fácil, porque usted nunca tiene que hacerlo.
El encadenador es automáticamente invocado cuando usted le dice a Delphi que compile y
cree la aplicación. A diferencia de otros encadenadores, el encadenador de Delphi es tan
rápido que usted rara veces se da cuenta del proceso de encadenamiento.
Si usted desea ver el status del proceso de compilación y encadenamiento, coteje la opción
Show Compiler Progress en la ventana de Environment Options.
Diseñador de Formulario
Diseño de la interfase visual
Configuración del diseñador de formulario
Concepto de componente
Tipos de componentes
Como colocar los componentes en el formulario
Manipulación de componente
Como crear un formulario
Concepto de propiedades
Tipos de propiedades
Sintaxis para cambiar el valor de las propiedades por código de programación
Uso del inspector de objeto para cambiar propiedades
Concepto de evento
Use del inspector de objeto para programar eventos
Introducción
De cualquier manera, con estas herramientas no era posible cambiar el código generado y
ver los resultados reflejados en el diseño visual. Usted podía manipular la interfase con el
diseñador por un momento, pero una vez que se necesitaba manipular el código generado
usted era sacado del ambiente visual. Si hubo cualquier cambio en el código generado, el
diseñador rechazaría el cambio en el diseño.
Aquí se le puede decir si se van a desplegar los puntos de ubicación del formularios; si los
componentes que se coloquen en el formulario van a ser alineado a estos puntos; si se van a
mostrar los títulos de los componentes; si cada vez que se cree un formulario nuevo se va a
ver como texto; si los formularios nuevos que se creen van a ser agregados por defecto a la
lista Auto create forms del proyecto y por ultimo se pueden cambiar el tamaño horizontal y
vertical de los puntos de ubicación dentro del formulario.
Componente
Tipos de componentes
Delphi tiene dos tipos de componentes: visibles e invisibles. Usted lo utiliza de la misma
Autor: José Uribe Página 38
Universidad del Caribe
Visibles
No Visibles
Algunos componentes aparecen en la forma cuando esta es diseñada, pero no pueden ser
vistos en tiempo de ejecución, los componentes no visibles proveen servicios para algunos
otros componentes o a una aplicación.
Delphi nos brinda diferentes maneras para colocar componentes en el formulario. Los
métodos mas conocidos para colocar un componente en el formulario son:
Component List del menú principal. Esto provoca que aparezca una
pequeña ventanita que permite buscar los componentes por su nombre y
agregarlo al formulario. Los componentes aparecen en el centro del
formulario y con un tamaño por defecto.
También usted puede colocar múltiples componentes del mismo tipo, para hacer esto
presione la tecla Shift y mientras la mantiene presionada haga clic sobre el componente que
desea colocar en el formulario, luego suelte la tecla Shift y proceda a colocar los
componentes en el formulario. Cada vez que usted haga clic en el formulario un
componente del tipo seleccionado aparecerá. Cuando usted termine, haga clic en el puntero
del Mouse en la paleta de componente para desactivarlo.
Manipulación de Componentes
Si por alguna razón usted no coloca los componentes en el lugar correcto, no se preocupe
usted puede modificarlo en el Diseñador de Formulario en cualquier momento.
Selección de componentes
Nota: Cuando hay mas de un componente seleccionado cada componente tendrá un total de
cuatro handle y el color del mismo será un color opaco (gris normalmente).
Después de haber colocado los componentes en el formulario, puede ser que surja la
necesidad de cambiarlo de lugar. Para mover un componente solo hay que seleccionarlo y
arrastrarlo a la nueva ubicación. El proceso de arrastrarlo consiste en colocar el puntero del
Mouse encima del componente (nunca colocarlo encima de un handle, pues de esta forma
le cambiaria el tamaño en vez de moverlo que es lo que se desea) y presionar el botón del
Mouse y mientras se tiene presionado el botón del Mouse mover el puntero del Mouse al
lugar donde se desea poner el componente, luego solo hay que soltar el botón del Mouse.
Existen dos formas para mover un componente con el teclado, estas son:
Los pasos para utilizar estos mecanismos son: seleccionar el componente y luego utilizar la
combinación de tecla correspondiente para moverlo. La diferencia entre ellas es que la
primera mueve el componente más rápido. Además la segunda forma permite mover de una
forma bien lenta el componente. Para el caso de las propiedades solo hay que seleccionar el
componente y cambiar los valores de estas propiedades en el Inspector de Objeto.
Existen varias formas para reducir o aumentar el tamaño de los componentes colocados en
el diseñador de formulario, pero la más común y por cierto la más rápida es seleccionando
el componente y arrastrando uno de los handle que se encuentran en la dirección hacia
donde se desea cambiar el tamaño del componente. Nótese que cuando se coloca el puntero
del Mouse encima de un handle, el puntero del Mouse cambia y se convierte en una flecha
de doble vía, indicando que se puede mover en cualquiera de las direcciones. Para arrastrar
el handle no olvide que tiene que presionar el botón del Mouse y mientras lo mantiene
presionado debe mover el Mouse hacia la dirección en que desea cambiar el tamaño.
Para el caso de las propiedades solo hay que seleccionar el componente y cambiar los
valores de estas propiedades en el inspector de objeto. En el caso de las teclas solo hay que
seleccionar el componente y utilizar la combinación de tecla, la combinación de teclas
permite cambiarle el tamaño de una forma más lenta.
Borrando Componentes
Borrar un componente es la operación más simple que existe, solo hay que seleccionar el
componente y presionar la tecla Delete (Suprimir), esta es la forma más sencilla.
Ctrl. + X
Propiedades
Tipos de propiedades
Los tipos de propiedades son: Simples, enumeradas, conjunto y propiedades tipo editor.
Simple
Enumeradas
Son aquellas propiedades cuyos valores están predefinidos y el usuario debe seleccionar
solo uno de ellos. Estas propiedades se pueden identificar porque tienen un combobox en el
inspector de objeto del cual debemos seleccionar el valor.
Conjunto
Las propiedades tipo conjunto son propiedades que están formadas por propiedades. Este
tipo de propiedades esta estructurado para contener o permitir cambiar el valor de varias
propiedades. Estas propiedades la podemos identificar en el inspector de objeto porque
tienen un signo de mas (+) del lado izquierdo del nombre de la propiedad. Al hacer doble-
clic sobre el signo de mas la propiedad se expande mostrando todas las propiedades por las
cuales ella esta compuesta. Cuando la propiedad esta expandida presenta un signo de menos
(-) del lado izquierdo del nombre de la propiedad. Un ejemplo de esta propiedad es la
propiedad Font. Si nos fijamos en la figura anterior del inspector de objeto, podremos ver la
propiedad Anchors que es tipo conjunto y se encuentra expandida mostrando las
propiedades que contiene, si nos fijamos en la propiedad Font, podremos ver que esta
contraída, signo de mas del lado izquierdo.
Tipo editor
Son propiedades cuyos valores no son introducidos en el inspector de objeto, sino en otra
ventana que es invocada desde el inspector de objeto y que recibe el nombre de editor.
Estas propiedades las podemos identificar en el inspector de objeto porque tienen un botón
con tres puntos suspensivo (...) en el lado derecho de la propiedad en el inspector de objeto.
Este botón con los tres puntos recibe el nombre de ellipsis. Para llamar el editor solo hay
que hacer clic sobre el botón. Un ejemplo de esta propiedad es la propiedad Font.
La propiedad Name
Esta propiedad es común en todos los componentes, es decir, todos los componentes tienen
una propiedad name. Esta propiedad sirve para identificar a los componentes. A esta
propiedad no es obligatorio cambiarle el valor ya que Delphi le asigna un nombre a todos
los componentes, y además Delphi controla que dos componentes no tengan el mismo
nombre. La nomenclatura que Delphi utiliza para nombrar los componentes consiste en: el
tipo del componente mas un numero secuencial que es generado de acuerdo a la cantidad de
componentes de un mismo tipo que se hayan colocados en el formulario.
Ya hemos visto como el cambio del valor de una propiedad impacta considerablemente en
el funcionamiento de un componente. Los valores de las propiedades pueden ser cambiados
en tiempo de diseño utilizando el inspector de objeto, pero la esencia de la programación
orientada a objeto consiste en todos los efectos que se pueden lograr con el mero hecho de
poder cambiar una propiedad en tiempo de ejecución (es decir mientras el programa se
encuentra en ejecución); para esto debemos conocer la forma en que podemos manipular
una propiedad por código de programación.
Sintaxis:
nombredelcomponente.nombredela propiedad;
Donde nombre del componente consiste en el valor que tenga la propiedad Name. Y
nombre de la propiedad es el nombre de la propiedad a la cual se desea hacer referencia por
código de programación. Nota el punto es parte de la sintaxis e indica que lo que se
encuentra a la derecha del punto pertenece al objeto que se encuentra a la izquierda del
punto. El punto sirve para denotar quien contiene a quien.
Ejemplos:
El inspector de objeto es la herramienta que proporciona Delphi para cambiar los valores de
las propiedades y programar los eventos de los diferentes componentes en tiempo de
diseño. Los nombres de las propiedades y los eventos se encuentran organizados en orden
alfabéticos ascendente.
En la parte superior del inspector de objeto, hay un combobox que indica a que componente
pertenece la lista de propiedades y eventos que están siendo desplegadas, además indica el
nombre y la clase a que pertenece el componente, por ejemplo: en la figura anterior
podemos notar que el componente seleccionado se llama Form1 y que pertenece a la clase
Tform.
Al principio la lista de propiedades y eventos puede ser confusa ya que usted desconoce el
significado o la función que desempeña cada una. Delphi proporciona una ayuda en línea
muy buena para sobrepasar esta barrera, para investigar que hace una propiedad o evento
simple y llanamente selecciónela y presione la tecla F1 para ver la ventana de ayuda de esa
propiedad o evento. El numero de propiedades puede aterrorizar a los nuevos
programadores, pero no hay porque temer, si usted comienza aprendiendo las propiedades
mas importante, el resto se aprenderá sobre la marcha, además habrá muchas de esas
propiedades que a lo mejor nunca la llegue a utilizar.
propiedades que sean comunes a todos los componentes seleccionados. El mismo valor de
la propiedad será asignado a todos los componentes. Cuando hay mas de un componente
seleccionado el combobox del inspector de objetos se vera en blanco.
Programación de eventos
Eventos
Tipos de eventos
Los eventos del usuarios son aquellos que ocurren en respuesta a una acción del
usuario, tales como la presión de una tecla, oprimir un botón del Mouse.
Manejadores de eventos
Son los procedimientos que se conectan a los eventos. Estos procedimientos contienen
código de programación en Object Pascal. Estos procedimientos se crean para darle una
respuesta particular a la ocurrencia de un evento.
La pestaña “Events” del inspector de objeto muestra todos los eventos asociados con el
componente que se encuentra actualmente seleccionado. La pestaña “Events” del inspector
de objeto luce como la figura siguiente:
En la figura de arriba podemos ver como el inspector de objeto muestra todos los eventos
asociados a un formulario. La mayoría de los nombres de eventos comienzan con la palabra
“On” para enfatizar la ocurrencia de una acción.
El inspector de objeto permite crear los manejadores de eventos de los eventos que usted
desee capturar. Si usted quiere escribir el código del manejador de evento de un evento de
un componente, lo primero que hay que hacer es seleccionar el componente en el diseñador
de formulario o en el combobox del inspector de objeto, luego seleccionar la pestaña
“Events” en el inspector de objeto y localizar el nombre del evento que usted desea
manejar. Después usted hace doble-clic en el combobox que se encuentra a la derecha del
nombre del componente, Delphi mostrara el editor de código con la definición del
manejador de evento, lo único que hará falta en este momento es que usted termine de
llenar en el espacio en blanco con el código necesario para completar el manejador de
eventos. A continuación un ejemplo del resultado de los pasos anteriores:
Si ya existe una rutina que usted quiere ejecutar en respuesta a un evento, solamente tiene
que hacer clic en el botón del combobox en el inspector de objeto y seleccionarlo de la lista.
La barra de herramienta sirve para facilitar el trabajo en una aplicación Windows. Los
botones en una barra de herramienta pueden ser utilizados para cualquier propósito, desde
cargar una ventana hasta cerrar una aplicación. En este capitulo lo utilizaremos para
mostrar mensajes en la barra de estados. Una vez que usted aprende como asociar acciones
a ellos, no importa que usted quiera hacer con ellos, la forma de utilizarlos será la misma.
Ahora queremos que el primer panel muestre un mensaje cuando el usuario presione el
primer botón. Lograremos esto con el uso de los eventos OnMouseDown y OnMouseUp.
Cree el manejador de evento haciendo doble clic en el evento OnMouseDown. Pondremos
la siguiente línea de código:
Debe notarse que el primer panel es referenciado con el índice cero. Ahora programe el
evento OnMouseUp para limpiar el panel, para esto asígnele una cadena de longitud cero al
panel.
En el evento OnClick del tercer botón, cambie el mensaje del segundo panel, para que le
informe al usuario que el botón de la derecha esta abajo. Haga lo mismo con el segundo
botón. Ejecute el proyecto y observe los mensajes en la barra de estado. A continuación una
figura del formulario hasta ahora:
Componente PageControl
Agregando paginas
Algunas veces se tiene tanta información relacionada que la que cabe en un formulario.
Delphi resuelve este problema con los componentes PageControl y TabSheet.
Los Items en la lista no son estáticos, usted puede manipular por código de programación
esta propiedad para agregar y quitar valores de la lista en tiempo de ejecución. Podemos
permitir que el usuario agregue items en vez de tenerlos todos predefinidos. Un
componente Edit puede proporcionar el mecanismo de entrada de datos. Coloque un botón
y un componente Edit debajo del RadioGroup. Vamos a limpiar la propiedad Text del Edit
para que el despliegue del componente en tiempo de ejecución sea en blanco. Ahora vamos
a hacer que cuando el usuario haga clic en el botón, el texto que se encuentre en el edit sea
agregado a la lista del RadioGroup. En el evento OnClick del botón, digite el siguiente
código:
Componente ScrollBox
FontDialog1.Execute;
Label1.Font := FontDialog1.Font;
end;
Cree una nueva página en el mismo formulario que hemos estado trabajando y póngale
“Manejador de Archivos” en la propiedad Caption. En esta página colocaremos un total de
cinco componentes: Edit, FileListBox, FilterComboBox, DirectoryListBox,
DriveComboBox. Como cada componente del sistema esta diseñado para trabajar con los
otros, cada uno de ellos tienen propiedades para referencial el tipo de componente
apropiado. Trabajando en orden inverso, al componente DriveComboBox lo ponemos a
referenciar el componente DirectoryListBox a través de la propiedad DirList; la propiedad
FileList de los componentes DirectoryListBox y FilterComboBox ponerlo a referenciar el
componente FileListBox; y por ultimo el componente Edit es referenciado por el
componente FileListBox mediante la propiedad FileEdit.
Lo ultimo que nos falta por hacer es utilizar un componente de los que se encuentran en la
página Sample, para el caso será el componente Calendar. Agregaremos otra página y le
pondremos “Calendario” en la propiedad Caption del TabSheet. Colocaremos un
componente Calendar en la página y cuatros botones para navegar el calendario.
Autor: José Uribe Página 60
Universidad del Caribe
Utilizaremos los métodos que tiene el calendario para movernos entre meses y años
adelante y hacia atrás. En el evento OnClick de cada botón colocaremos una línea de
código de las que pondremos a continuación:
Calendar1.PrevYear;
Calendar1.PrevMonth;
Calendar1.NextMonth;
Calendar1.NextYear;
Antes de continuar con nuestro ejemplo vamos a ver el concepto del ultimo integrante de
un componente.
Método
Es una porción de código - procedimiento o función – que hace algo para el componente o
con el componente. En lugar de escribir el código que realice la función deseada, solo hay
que invocarlo ya que los métodos son partes que integran los componentes. Los métodos
varían de un componente a otro, así como la función que pueden realizar. Todas las líneas
de código que pusimos anteriormente corresponden a métodos del componente Calendar.
Estos métodos nos permiten movernos un mes o año hacia delante o hacia atrás.
La fecha actual del calendario la desplegaremos en la etiqueta y el código que realice esto
lo pondremos en el evento OnCreate del formulario. Cada vez que la fecha en el calendario
cambie la actualizaremos en el evento OnChange del calendario. Ambos manejadores de
eventos tendrán la misma codificación:
Creación de Menú
En este capitulo:
Concepto de menú
Partes de un menú
El diseñador de menú
Componentes para crear menú
Conexión de los menús con otros componentes
Cuando el usuario hace clic en un título de un menú, se despliega automáticamente una lista
que visualiza las opciones de ese menú y si no contiene ningún elemento, se ejecuta el
evento asociado – si es que tiene alguno -. Las partes de un menú son: Opción, submenús y
separador.
Diseñador de menús
Es la herramienta que nos permite crear un menú en Delphi. El diseñador de menú permite
agregar, editar, borrar y reorganizar los elementos de los menús en tiempo de diseño,
además usted no tiene que ejecutar el programa para ver el resultado.
Para crear un menú existen dos formas: se puede comenzar a construir un menú desde la
nada; o se puede utilizar una de las plantillas de Delphi, las plantillas son modelos de
menús pre-construidos.
El diseñador de menú trabaja mas o menos igual que el diseñador de formularios. Ambas
herramientas permiten utilizar el inspector de objeto para configurar las propiedades de los
elementos que ellos contienen.
Como abrir el diseñador de menú
Para crear un menú principal (MainMenu) o menú de acceso directo (PopupMenu) primero
hay que colocar un componente MainMenu (para un menú principal) o un componente
PopupMenu (para un menú de acceso directo). Estos componentes se encuentran en la
página Standard de la paleta de componentes y sirven para crear los diferentes tipos de
menú que existen en Delphi.
Punto de Inserción
El punto de inserción marca el lugar donde aparecerá la próxima opción cuando sea
introducida. Cuando se termina de introducir una opción, el punto de inserción se moverá
hacia abajo o hacia la derecha, para permitir insertar una nueva opción a la derecha – si se
Autor: José Uribe Página 66
Universidad del Caribe
están creando los títulos de los menús o un submenú - o hacia abajo – si se están agregando
opciones de un menú -.
Los separadores se utilizan para agrupar las opciones en función de su actividad. Delphi
permite crear diferentes tipos de separadores, entre estos tenemos la tradicional línea
horizontal, líneas verticales y multi-columnas sin líneas verticales. Para crear un separador
Autor: José Uribe Página 67
Universidad del Caribe
de línea horizontal solamente hay que poner un guión “-“ en la propiedad Caption de la
opción que se esta creando, no debe confundirse el guión “-“ con el signo de subrayado
“_”, es el guión el que debe utilizarse para crear el separador de línea horizontal.
Para crear los otros tipos de separadores debemos utilizar la propiedad Break de la opción,
los posibles valores que toma esta propiedad son:
mbNone es el valor por defecto, y significa que no habrá ningún tipo de separador;
mbBreak sirve para hacer un menú multi-columna sin líneas verticales entre las
columnas;
mbBreakBar sirve para hacer un menú multi-columna con líneas verticales entre las
columnas.
Submenu
El submenú sirve para desplegar una nueva lista de opciones. Para crear un submenú lo
primero que hay que hacer es seleccionar la opción que contendrá el submenú y luego
utilizar una de las dos formas que existen para crear un submenú, estas formas son:
Una vez creado el submenú se vera un punto de inserción a la derecha de la opción que
contiene el submenú para agregar las opciones correspondientes.
Interruptores
Un interruptor en un menú no es mas que una opción que puede estar encendida o apagada
en un momento determinado. Normalmente estas opciones se construyen para activar o
desactivar una determinada función en la aplicación.
Existen dos tipos de interruptores que se pueden crear que son CheckItem y RadioItem.
Los CheckItem son aquellas opciones que pueden estar encendidas o apagadas. Cuando
están encendida tienen una marca de cotejo del lado izquierdo de la opción en caso
contrario no tienen nada. La figura anterior muestra un menú con opciones CheckItem.
Los radioItem permiten seleccionar una opción de entre varias. Usted solo puede
seleccionar una de todas las opciones. En este tipo de menú aparece un pequeño punto del
lado izquierdo de la opción cuando una opción esta seleccionada.
Nota: nunca repita una misma letra para mas de una opción en el mismo nivel, esto no
producirá ningún error, pero solamente se ejecutara la opción que este en primer lugar.
Componente MainMenu
Componente PopUpMenu
El componente MainMenu solamente puede ser conectado a formularios, pues los menús
principales siempre van en la parte superior de un formulario. Para conectar un menú
principal con un formulario se utiliza la propiedad Menu del formulario, aquí aparecerá una
lista de todos los componentes MainMenu que están colocados en el formulario. También
es posible cambiar el menú de un formulario en tiempo de ejecución, para esto cambiamos
el valor de esta propiedad por código de programación. Normalmente el usuario no tiene
que conectar el menú principal con el formulario, pues tan pronto se coloca el componente
MainMenu en el formulario automáticamente es conectado con el mismo.
o Mantenimientos
Clientes
Vendedores
Artículos
Almacenes
Unidades
o Procesos
Facturación
Devoluciones
Cancelación de facturas
Reimpresión de facturas
Registro de inventario
o Consultas
Ventas del día
Ventas por vendedor
o Reportes
Ventas
Autor: José Uribe Página 70
Universidad del Caribe
Devoluciones
Cree un nuevo proyecto para esto seleccione la opción File | New Application del menú
principal de Delphi. Esto creara un nuevo proyecto y un nuevo formulario dentro del
proyecto. Cambie el nombre al formulario, para esto utilice la propiedad Name, póngale de
nombre Form_Menu; Cambie el título del formulario, para esto utilice la propiedad
Caption, póngale “Mini-Sistema de Punto de Venta – Menú Principal -”. Grabe el proyecto
y la unidad en el directorio de trabajo que creamos anteriormente (CSSDelphi), para esto
seleccione la opción File | Save Project As... del menú principal de Delphi, grabe la unidad
con el nombre UnitFormMenu y grabe el proyecto con el nombre de PtoVenta.
Ahora aparecen dos puntos de inserción uno al lado de Mantenimiento y otro debajo; el que
esta debajo esta seleccionado, si no lo esta selecciónelo para que construyamos el menú de
mantenimientos. Ahora digite “Clientes” y presione la tecla Enter, digite “Vendedores” y
presione la tecla Enter, digite “Articulos” y presione la tecla Enter, digite “Almacenes” y
presione la tecla Enter, digite “Unidades” y presione la tecla Enter. Cabe mencionar que
cada vez que se digita una opción y se presiona la tecla Enter, el editor de menú inserta la
opción digitada y un nuevo punto de inserción en blanco para que se continúen agregando
opciones al menú. Cada una de las opciones anteriores debe ser digitadas en un punto de
inserción en blanco, pues si lo hace sobre el mismo, lo que ocurrirá es que se irán
sobrescribiendo las opciones. Aunque si se sigue el procedimiento anterior no habrá ningún
inconveniente, se hace el comentario por si acaso usted se equivoca y selecciona una
opción ya introducida. Nuestro menú hasta ahora debe lucir como la figura siguiente:
Seleccione el punto de inserción que se encuentra al lado del menú procesos, y digite
“Consultas” y presione la tecla Enter, al igual que con los menús anteriores aparece el
menú Consultas, un punto de inserción al lado y un punto de inserción debajo y
seleccionado para introducir las opciones del menú consultas. Digite “Ventas del día” y
presione la tecla Enter, digite “Ventas por vendedor” y presione la tecla Enter.
Seleccione el punto de inserción que se encuentra al lado del menú consultas, y digite
“Reportes” y presione la tecla Enter, al igual que con los menús anteriores aparece el menú
Reportes, un punto de inserción al lado y un punto de inserción debajo y seleccionado para
introducir las opciones del menú reportes. Digite “Ventas” y presione la tecla Enter, digite
“Devoluciones” y presione la tecla Enter. Hemos terminado de construir nuestro menú,
ahora nuestro menú debe lucir como la siguiente figura:
Grabe la unidad y el proyecto para que reflejen los nuevos cambios, ya que lo utilizaremos
en las practicas de los siguientes capítulos. Para grabar todos los cambios utilice la opción
File | Save All del menú principal de Delphi.
Autor: José Uribe Página 72
Universidad del Caribe
Por supuesto usted hace clic sobre las opciones y nuestro menú no hace nada, no desespere
mas adelante construiremos otros formularios que los llamaremos desde nuestro menú.
El primero (Show) permite abrir un formulario no Modal, lo que significa que usted puede
acceder al formulario que lo cargó, sin necesidad de cerrar el formulario cargado, por
ejemplo: si usted tiene un formulario A y desde éste formulario usted cargó el formulario B
utilizando el método Show, usted puede acceder al formulario A sin necesidad de cerrar el
formulario B.
El último (ShowModal) permite abrir un formulario Modal, lo que significa que usted no
puede acceder al formulario que lo cargó hasta que cierre el formulario cargado, por
ejemplo: si usted tiene un formulario A y desde éste formulario usted cargó el formulario B
utilizando el método ShowModal, usted no podrá acceder al formulario A hasta que no
haya cerrado el formulario B.
La sintaxis para utilizar cualquiera de ellos es la misma utilizada para ejecutar cualquier
método de un componente, esto es:
Nombredelcomponente.nombredelmetodoaejecutar;
Por ejemplo: si tenemos un formulario que se llama frmClientes y lo queremos cargar desde
otro formulario, escribiríamos la siguiente línea de código:
frmClientes.Show;
o
frmClientes.ShowModal;
Pues bien después de haber revisado los métodos utilizados para cargar un formulario,
vamos a cargar un formulario desde un menú, lo primero que debemos hacer es seleccionar
la opción del menú desde la cual llamaremos el formulario y hacemos clic sobre ella –esto
abrirá el editor de código- y ahí solamente tenemos que poner el código que cargue nuestro
formulario de acuerdo a lo discutido anteriormente.
Autor: José Uribe Página 74
Universidad del Caribe
La cláusula Uses
Sirve para identificar todas las unidades utilizadas por un programa, y significa que a partir
de esa línea se podrán utilizar todas las variables, tipos de datos, constantes,
procedimientos, funciones y componentes; siempre y cuando estos hayan sido declarados
públicos para las otras unidades. La cláusula uses permite que dos unidades puedan
compartir los recursos entre ellas.
Cuando usted intenta utilizar algunos de los elementos de una unidad (variables, tipos de
datos, funciones, etc), en otra unidad y usted no ha puesto en uso (Uses) la unidad que
contiene los elementos referenciados obtiene un mensaje de error o un mensaje de
información parecido al siguiente:
Por otro lado, en el caso que éste mensaje no aparezca y usted esté tratando de utilizar
algún elemento de otra unidad, usted debe agregar la unidad manualmente en la lista Uses.
También se debe prestar especial atención en el caso que se haya colocado en la lista Uses
el nombre de una unidad, y luego se haya grabado con otro nombre la unidad, Delphi
renombrara la unidad, pero no lo hará con las unidades que se encuentran en la lista Uses,
por ejemplo: Imagínese que usted esta construyendo una aplicación que constaría de dos
formularios, usted crea un formulario nuevo (la unidad se llamaría Unit1 y el formulario
Form1) y luego crea el segundo formulario (la unidad se llamaría Unit2 y el formulario
Form2). Ahora usted procede a llamar el segundo formulario (Form2) desde el primer
formulario (Form1), el código que usted colocó para llamar el segundo formulario fue
Form2.Show; apareció la ventana de información diciéndole que el form1 referencia el
form2..., usted respondió “Yes” y el Unit2 fue agregado a la lista Uses del Unit1.
Usted ejecuta su aplicación y todo funciona correctamente. Pero ahora usted decide grabar,
graba las unidades con los siguientes nombre: UPrincipal para el Unit1, USecundario para
Autor: José Uribe Página 75
Universidad del Caribe
Cuando usted desee cargar un formulario desde otro formulario y el formulario que se va a
cargar se encuentra colocado en la lista Auto-Create forms del proyecto, solamente hay que
llamar uno de los dos métodos para desplegar el formulario (Show o ShowModal).
La lista Auto-Create forms del proyecto contiene todos los formularios que serán
automáticamente creados (colocados en memoria) por el proyecto (aplicación) cuando este
comience a ejecutarse. De esta forma se gana tiempo al momento de llamar los formularios,
Autor: José Uribe Página 76
Universidad del Caribe
pues no hay que cargarlos antes de llamarlos; pero la aplicación tarda mas tiempo en cargar,
ya que tiene que ir colocando en memoria cada uno de los formularios que se encuentran en
la lista Auto-Create forms del proyecto.
De esta forma cuando un formulario ha sido previamente cargado en memoria por Delphi,
solamente hay que llamar el formulario con uno de los dos métodos dependiendo del modo
como se desee desplegar, por ejemplo:
Cuando usted desee cargar un formulario desde otro formulario y el formulario que se va a
cargar se encuentra colocado en la lista Available forms del proyecto, usted debe cargar en
memoria el formulario antes de llamar uno de los dos métodos para desplegar el formulario
(Show o ShowModal).
La lista Available forms del proyecto contiene todos los formularios que no serán
automáticamente creados (colocados en memoria) por el proyecto (aplicación) cuando este
Autor: José Uribe Página 77
Universidad del Caribe
Un mensaje de error de violación de memoria, este error ocurre cuando usted intenta
acceder a un objeto que aun no ha sido creado (colocado en memoria), no importa el objeto
que sea, así pues cada vez que este error le ocurra, verifique que haya creado con
anterioridad el objeto al que se hace referencia, esta referencia puede ser a una propiedad,
método o evento.
En Delphi existe una regla general que dice así: “Si Delphi lo crea, Delphi lo destruye; Si
usted lo crea, usted es responsable de destruirlo”.
Destruir un objeto no es mas que liberar el espacio de memoria utilizado por el objeto. Para
destruir un formulario podemos utilizar el método Release del formulario. Para destruir un
formulario creado por usted (lista Available forms), programe el evento OnClose del
formulario y utilice el método release, por ejemplo:
LENGUAJE PASCAL
Breve Historia
Pascal fue originalmente disecado por Nicklas Wirth a finales de los 60s, pero fue
considerado uno de los primeros lenguajes de los 70s. Wirth creo Pascal en respuesta a otro
lenguaje que fue desarrollado en ese tiempo, Algol 68. Ambos lenguajes estaban basados
en el lenguaje Algol 60, pero Algol 68 fue considerablemente más complejo. Wirth creo
Pascal para incorporar el funcionamiento opuesto de Algol 68. Él quería crear un lenguaje
pequeño, simple que pudiera combinar el poder con la simpleza. De hecho, Pascal fue
introducido y todavía es usado como uno de los primeros lenguajes para los estudiantes de
computadoras.
En todo programa Object Pascal se encuentra dos partes: el encabezado y el bloque del
programa; este ultimo formado a su vez por una parte declarativa y otra ejecutable o
sentencia.
Program hola;
Program Reporte;
Sentencia
Los programas, procedimientos y funciones están todos compuestos por sentencias que no
es nada mas que cada una de las líneas ejecutables de código. Las sentencias pueden ser
simples y compuestas. Ejemplos de sentencias simples son asignaciones, llamadas de
procedimientos o funciones, por Ejemplos:
A:= 20;
Nombre:=’Jose’;
Inicializacion;
Se pueden tener sentencias compuestas en cualquier parte donde puede haber una sentencia
simple. Una sentencia compuesta es un grupo de sentencias tratadas como un bloque. El
inicio de una sentencia compuesta esta siempre delimitado por la palabra BEGIN y el final
de una sentencia compuesta esta delimitado por la palabra reservada END, por Ejemplo:
If A = 20 then
Begin
Showmessage(‘El Valor de A es: ‘ + IntToStr(A));
A:= 0
End;
El punto y coma tiene una sección aparte porque la mayoría de los programadores nuevos
en Object Pascal tienen problema con el. Si usted tiene experiencia de programación en un
Xbase o Basic, suena inusual poner un punto y coma después de cada línea de código. En
los Xbase un punto y coma sirve para continuar una línea de código en una próxima línea.
Note que, en Object Pascal, usted puede crear múltiples líneas de códigos que hagan una
sentencia simple. Para empeorar las cosas, hay situaciones en las que usted no puede poner
un punto y coma.
Bueno, esta es la regla: Todas las sentencias en un programa Pascal tienen que ser
separadas por un punto y coma. En este caso, note que sentencia se refiere a ambas,
sentencia simple y compuesta. Esta es la razón por la cual no hay punto y coma después del
BEGIN y el punto y coma antes del END es opcional. Por eso en el ejemplo de abajo, la
sentencia de asignación no tiene un punto y coma porque hay un END después. Pero el
END tiene que tener un punto y coma después porque es el final de una sentencia
compuesta.
If A = 0 then
Begin
Showmessage(‘A es igual a 0’);
A:=10
End;
Una ultima nota sobre la puntuación en los programas en Object Pascal. El ultimo END del
programa termina en un punto, no en punto y coma. El punto indica al compilador que este
es el fin del programa. Afortunadamente, Delphi se encarga de este detalle.
Operadores
El Operador de asignación en Object Pascal es los dos puntos seguidos del signo
igual(‘:=’). Esto es diferente al operador igual (‘=’) que es utilizado para probar o comparar
la igualdad entre dos expresiones y para la definición de tipos.
Operadores aritméticos
Los operadores aritméticos son aquellos que nos facilitan la realización de operaciones
aritméticas y son siempre binarios, actuando sobre dos operando.
Operador Función
+ Suma
- Resta
* Multiplicación
/ División
Div División entera
Mod Resto de división entera
Operadores lógicos
A los operadores lógicos también se les conoce como operadores "Boléanos", ya que
trabajan sobre valores de tipo boolean (true o false), Una expresión relacional simple
devolverá un tipo de dato booleano dependiendo de que la relación sea cierta o falsa
Operador Función
Not Negación a nivel de bit
And Y a nivel de bit
or O a nivel de bit
Xor O exclusivo a nivel de bit
Operadores relacionales
Los operadores relacionales nos permiten obtener una afirmación o negación de una
determinada relación entre dos operando.
Operador Función
= Igual
<> Diferente de
< Menor que
<= Menor o igual que
> Mayor que
>= Mayor o igual que
Tal como sucede en matemática, se debe saber cómo evaluar una expresión. Para ello se
necesita conocer en que orden se deben evaluar las diferentes partes de la expresión. Al
igual que en matemática, la precedencia de los operadores afecta los resultados del código,
como se puede ver en la siguiente tabla:
Operadores Precedencia
Not Primera
*, /, div, mod, and Segunda
+, -, or, xor Tercera
=, <> ,> ,< ,<=, >=, in, is Cuarta
Los bloques están formados por declaraciones y sentencias, los bloques no solo forman
parte de un programa sino también de un procedimiento, función o una unidad.
La parte ejecutable o de sentencias es la otra parte del bloque, la que es usada para describir
el algoritmo del bloque; esta parte esta formada por una sentencia compuesta.
Las unidades que son módulos residentes (previamente compilados), que se incorporan en
un programa, es una colección de constantes, tipos de datos, variables, procedimientos y
funciones.
Como en un programa Object Pascal, una unidad tiene la parte de encabezado y el cuerpo.
La parte de encabezado, es como el encabezado de un programa y solo difiere en la palabra
reservada unit.
Las unidades, son invocadas en los programas o en otras unidades, mediante la cláusula
uses, seguida de uno o más identificadores, lo que amplia la parte declarativa de un modulo.
La parte que se inicia con la palabra reservada interface, es "visible" a cualquier aplicación
(inclusive a otra unidad); Aquí se encuentran las declaraciones de las constantes, tipos,
variables y los encabezados de los subprogramas que pueden ser accesados exteriormente.
type
Tform1 = class(TForm)
procedure FormShow(Sender: TObject);
private
{Private declarations}
public
{Public declarations}
end;
var
Forml: Tforml;
implementation
{$R *.DFM}
end.
En Object Pascal a diferencia de lo que ocurre en otros lenguajes como Visual Basic por
ejemplo, cualquier variable debe ser declarada antes de utilizarse.
const
pi =3.14159;
alfa =2*pi;
mensaje= ‘Hola!!!’
var
contador, auxiliar : Integer;
Autor: José Uribe Página 86
Universidad del Caribe
cadena : String;
vector : Array[l...50] of word;
otra de las cosas fundamentales son los registros, conjuntos, matrices, etc.
Veamos unos ejemplos de declaraciones:
Las variables en un programa, se clasifican por su ámbito o alcance en: globales y locales.
Tipos de datos
Object Pascal dispone de todos los tipos de datos necesarios para facilitar el trabajo con
números en distintas precisiones, cadenas de caracteres y direcciones de memoria. A partir
de estos tipos podemos definir tipos de datos adicionales, mas complejos que los ya
existentes, y adaptarlos a nuestras necesidades.
Tanto para declarar una variable como para utilizar una constante, es necesario el que
conozcamos los diferentes tipos de datos con los que se puede trabajar.
Estos tipos nos permitirán trabajar con números de diferentes precisiones, además de
caracteres, punteros, etc.
Identificadores
Para poder dar nombre a una variable tendremos que crear un identificador o, lo que es lo
mismo, crear un nombre para dicha variable. Para ello primero debemos conocer las reglas
de nomenclatura que rigen el lenguaje Object Pascal, de tal forma que nuestros
identificadores se ajusten a ellos y sean validos.
A pesar de que un identificador Object Pascal puede tener cualquier longitud, el compilador
tan solo tendrá en cuenta los primeros 63 caracteres, por lo que si existen dos
identificadores que a pesar de ser distintos coincide en sus primeros 63 caracteres, el
compilador creerá que se trata de un mismo identificador, generándose un error.
Además, Object Pascal no distingue entre mayúsculas y minúsculas, por lo que los
identificadores pueden declararse con una cierta combinación de mayúsculas y minúsculas
y después usarse otra distinta, ya que el compilador lo que tiene en cuenta es cuales
caracteres componen el identificador y en que orden.
No podrán existir dos identificadores iguales a no ser que estén en ámbitos diferentes. De
esta forma, los procedimientos diferentes podrán declarar variables con el mismo nombre
sin problema alguno (no es absurdo esto puesto que en algunos lenguajes no existe el
ámbito de las variables, y una variable es global y visible para todo el mundo, con lo que 2
variables con el mismo nombre no pueden coexistir).
Object Pascal y particularmente Delphi incluye la conversión de un tipo de dato a otro, así
como la conversión de una variable de tipo fecha en una string, una variable real a un
entero, un string a un entero, etc.
Para la conversión de tipos, se siguen una serie de reglas como por ejemplo, una variable de
tipo real toma en cuenta 15 cifras significativas al convertir a un string, etc. Como ejemplo
podemos ver la conversión de una cadena de caracteres a un numero entero.
Estructuras de Control
Las estructuras de control permiten tomar decisiones y realizar un proceso repetidas veces.
Permite tomar una decisión referente al camino a seguir o acción a ejecutar en un proceso
basándose en el resultado (verdadero o falso) de la evaluación de una expresión. Su sintaxis
es:
Donde expresión debe ser una expresión numérica, relacional o lógica. El resultado que se
obtiene al evaluar la expresión es verdadero (True) o falso (False).
En cualquier caso, la ejecución continua con la siguiente sentencia ejecutable después del
if, por ejemplo:
CASE <x> OF
Esta instrucción permite ejecutar una de varias acciones en función del valor de una
expresión. Cuando lo que se necesita es comparar la misma expresión con diferentes
valores. Su sintaxis es:
case expresión of
lista 1: sentencia 1;
...
lista n: sentencia n;
else
sentencia
end;
ejemplo:
case numero of
1: Showmessage(‘El numero es el 1’);
2: ShowMessage('El numero es el 2');
end;
Estructuras de Repetición
FOR ... DO
ejemplo:
for contador := 1 to 25 do
begin
ShowMessage('Hola Mundo');
end;
WHILE ... DO
Repite la ejecución una sentencia mientras una condición dada sea cierta. La condición se
verifica antes de ejecutarse la sentencia. Su sintaxis es:
Ejemplo
Contador := 1;
while contador <25 do
begin
ShowMessage('Hola Mundo');
inc(contador);
end;
1. Se evalúa la expresión
REPEAT... UNTIL
Repite la ejecución de un conjunto de sentencias hasta que una condición dada sea cierta.
La condición se verifica después de ejecutarse el conjunto de sentencias. Su sintaxis es:
repeat
sentencia 1;
…;
sentencia n;
until expresión
Contador := 1;
repeat
ShowMessage('Hola Mundo');
inc(contador);
until contador> 25;
Funciones y procedimientos
Un programa en Object Pascal, esta compuesto de uno o más bloques y alguno de ellos
anidados; es decir conteniendo otro bloque. Los bloques son llamados subprogramas, y
pueden ser funciones y procedimientos.
La diferencia entre uno y otro tipo es que las funciones devuelven un valor y los
procedimientos no. Pero esto prácticamente ya lo sabe todo el mundo.
También es posible la diferenciación del paso de parámetros por valor o por referencia.
Veamos unos ejemplos:
Try
<sentencia>;
<sentencia>;
finally
<sentencia>;
<sentencia>;
end;
El bloque try ... finally comienza con la palabra reservada Try, seguido por una o más
líneas de código. Además debe notarse que esta es otra construcción Object Pascal que
inicializa un bloque de sentencia pero que no requiere de un begin aunque termina en end.
El cuerpo del bloque termina con la palabra reservada finally. A continuación del Finally
puede ir una o más líneas de código.
El bloque try ... finally garantiza que la porción de código que se encuentra después de
finally se ejecutará sin importar que ocurra. En otras palabras, si no hay error o ninguna
circunstancia inusual ocurre mientras el bloque try ... finally se esta ejecutando, el código
que se encuentra después de finally se ejecuta de forma normal, como si no existiera
ningún bloque try ... finally. Ahora bien, el poder de esta estructura es cuando una
condición de error ocurra durante la ejecución del código que se encuentra después de try,
bajo esta circunstancia, cualquier código que se encuentre después del finally se ejecutará
antes que el control de ejecución abandone el bloque de código. Aun cuando un error fatal
ocurra en la porción de código del try, el código en el finally siempre se ejecutará.
Protección de recursos
El comportamiento del bloque try ... finally es particularmente muy útil en un par de
situaciones diferentes. La primera es protección de recurso. Antes una breve introducción
acerca del manejo de los recursos en Windows. Windows se encarga de todos los recursos
que son alocados y usados por las aplicaciones. Cuando una aplicación necesita mas
recursos(memoria, manejadores de gráficos, etc.), la aplicación le pide a Windows que se la
proporcione, es entonces responsabilidad de la aplicación de liberar ese recurso cuando
termine de utilizarlo.
Cuando una aplicación en Windows ocupa recursos y nunca lo libera se dice que tiene
escape de recursos. Si la aplicación no libera los recursos, el recurso se encuentra ocupado
hasta que la aplicación termine, por ejemplo: si un programa le pide a Windows un
manejador de grafico (para dibujar algo en la pantalla) y nunca libera el manejador, el
numero disponible de manejadores de gráficos se reduce. Esta aplicación es considerada
como de pobre funcionamiento en Windows.
Como ejemplo, la aplicación de ejemplo debe mostrar una ventana Acerca de... cuando el
usuario ejecute la opción Ayuda | Acerca de... del menú de la aplicación, como es un
desperdicio de memoria permitir que el formulario Acerca de... sea auto creado a través del
proyecto, es mejor alocar los recursos para el formulario (llamar su constructor) cuando lo
necesitemos para mostrar el formulario y llamar su destructor cuando terminemos. A
continuación el código para crear, mostrar y destruir el formulario:
Autor: José Uribe Página 96
Universidad del Caribe
Recuerde cada vez que usted llame un constructor, usted es responsable para llamar el
destructor lo cual es evidente en el código anterior. De cualquier manera, si ocurre un error
mientras el formulario se esta mostrando en la pantalla, su destructor no es llamado,
entonces todos los recursos alocados por este formulario(memoria y los recursos gráficos)
se perderán. Por supuesto, la forma de resolver este problema es a través del manejo de
excepciones para protección de recurso, a continuación los cambios necesarios para el
código anterior con el manejo de excepciones:
Esta versión del código es mas segura y mas robusta. Ahora, no importa que pase mientras
el formulario este activo, Delphi asegurará que el destructor para el formulario se ejecute en
el tiempo apropiado.
Operador de Encapsulación
El uso del bloque try ... finally no es solamente para protección de recursos como el
anterior. En cualquier momento usted puede cambiar un recurso y desea asegurarse que el
recurso quede como estaba al final del bloque de código, el bloque try ... finally es la mejor
vía para manejarlo. Por ejemplo, si usted abre un archivo de texto dentro de un procedure
para leer alguna información, usted quiere asegurarse que el archivo sea cerrado cuando
usted salga de la rutina. El bloque try ... finally es una excelente forma para manejar la
situación
Var F: TextFile;
Línea: String;
begin
Assign(f, ‘C:\datos.dat’)
Autor: José Uribe Página 97
Universidad del Caribe
Reset(f);
Try
Readln(f,línea);
Finally
CloseFile(f);
End;
End;
Por esta razón el bloque try ... finally podría ser llamado el operador de encapsulación.
Note que usando el bloque try ... finally, usted garantiza que todos los procedimientos y
funciones( y cualquier otro bloque lógico de programa) ejecutara siempre cualquier código
final necesario para poner como estaban las cosas originalmente.
El bloque Try... except sirve para capturar los errores en tiempo de ejecución. La sintaxis
para el bloque Try.. except es similar al bloque Try.. finally:
Try
<sentencia>;
<sentencia>;
except
on ExceptionType1 do
<sentencia>;
on ExceptionType2 do
<sentencia>;
end;
A continuación un ejemplo que muestra como utilizar el bloque Try.. except para el manejo
de errores:
Try
a:= b/c
except
on EzeroDivide do
MessageDlg(‘Division entre Cero’, mtError, [mbOk],0);
on Eunderflow do
begin
MessageBeep(0);
MessageDlg(‘El numero esta por debado del soportado’,mtError, [mbOK],0);
end
end;
Autor: José Uribe Página 98
Universidad del Caribe
Al igual que el bloque Try.. finally, el bloque Try.. except termina con un end.
Si durante la ejecución del código que se encuentra entre try y except se produce algún
error, el programa salta automáticamente desde la línea que produjo el error a ejecutar el
código que se encuentra entre except y end. Esto quiere decir que el código que esta
después de except solo se ejecuta cuando se produce algún error durante la ejecución del
código que esta después del try. A diferencia del bloque try.. finally que la parte del finally
siempre se ejecuta.
El Borland Database Engine (comúnmente llamado BDE) es una serie de drivers que
permiten que Delphi pueda comunicarse con una base de datos. Un driver no es nada mas
que un archivo que contiene informaciones sobre como interactuar con un hardware o con
un software.
Delphi utiliza los servicios BDE para acceder a una base de datos. El BDE trabaja de la
misma manera con bases de datos locales así como con base de datos Cliente / Servidor.
Hace muchos años, Borland confrontó un problema con el acceso de base de datos en sus
softwares. Todos los productos de Borland que eran utilizados para acceder a base de datos
tenían un método diferente para conectarse y utilizar los datos. Borland determinó que una
manera unificada para la conectividad con base de datos proporcionaría muchas ventajas y
resolveria el problema. Así que decidieron crear un software contendría todas las
funcionalidades de base de datos en un solo engranaje.
Años atrás, Borland vendía un motor de acceso a base de datos para paradox. Este consistía
en su mayor parte en la porción de acceso de datos del manejador de base de datos de
Paradox y el uso que se pretendía era utilizarlo en programas que necesitaban leer y escribir
a las tablas DB de Paradox. El BDE contiene este motor, pero con funciones agregadas
para conectarse a cualquier otro tipo de base de datos. El BDE incluye todo el poder del
motor viejo de Paradox, la capacidad para acceder a tablas dBase y la habilidad para escalar
de un sistema de base de datos local a un sistema de base de datos Cliente / Servidor.
BDE Administrator
El BDE Administrator es un utilitario que sirve para configurar el BDE. Este programa es
instalado durante el proceso de instalación de Delphi, el programa de instalación crea un
icono de acceso directo dentro del grupo Borland Delphi – en el menú de Windows -,
además se crea un icono de acceso directo dentro del grupo Control Panel de Windows.
Los archivos ejecutables así como los de configuración son colocados dentro de un
directorio que se llama BDE que normalmente se encuentra en la siguiente ruta:
C:\Program Files\Common Files\Borland Shared o C:\Archivos de Programas
\Archivos Comunes\Borland Shared de acuerdo al idioma de la versión del sistema
operativo que tenga instalado en su maquina. El BDE Administrator luce de la siguiente
manera:
En el lado Database se encuentran todos los alias que existen configurados en el BDE; el
lado configuration contiene todos los Drivers que hay instalados para conectarse a los
diferentes tipos de bases de datos, así como la configuración de cada uno de ellos; cabe
decir que estos drivers pueden ser Nativos o pueden ser drivers ODBC. Además de los
drivers, en el lado configuration se encuentra la configuración del sistema. A continuación
un vistazo a la página configuration; en ella podemos apreciar los drivers que hay instalado
así como los parámetros del sistema.
Hay que mencionar que la cantidad de driver varían de acuerdo a la versión de Delphi que
usted tenga instalado.
Los alias de base de datos permiten cambiar la forma como se trabaja con los datos de una
manera muy poderosa. En el mundo de las aplicaciones de negocio, las bases de datos son
cambiadas de lugar frecuentemente a medida que la organización adquiere nuevos
servidores de archivos y tiene que mover sus operaciones de base de datos a servidores de
base de datos dedicados. Algunos ambientes de desarrollo requieren que la aplicación sea
compilada de nuevo cada vez que se cambia la ubicación de la base de datos o para
construir un modelo abstracto adicional en el código.
Una alias no es nada mas que un nombre o identificador en el BDE que sirve para
identificar la ubicación de la base de datos. El alias es utilizados por los componentes de
Delphi para manejo de base de datos para conectarse a la base de datos.
Autor: José Uribe Página 103
Universidad del Caribe
Creación de un alias
Seleccione la página Database en el BDE Administrator. Para crear un alias desde el BDE
Administrator, existen dos formas, que son:
Una vez que usted ejecuta cualquiera de las opciones anteriores para crear un alias, aparece
la ventana New databases alias:
Esta ventana sirve para escoger el driver de base de datos para el cual se va a crear el alias.
En el botón del combobox se debe hacer clic para seleccionar el driver, una vez
seleccionado el driver se procede a presionar el botón OK para aceptar lo que se ha
seleccionado.
El paso siguiente después de haberle asignado un nombre, hay que configurar los
parámetros que se encuentran en el lado derecho del BDE Administrator. Estos parámetros
varían de acuerdo al tipo de base de datos.
la ruta presione el botón que aparece en el lado derecho del parámetro path. Asígnele la
siguiente ruta “C:\CSSDELPHI”.
El Database DeskTop
En este capitulo:
En la figura anterior podemos ver como luce el Database DeskTop cuando se carga.
En la opción File del menú principal del Database DeskTop, se puede cambiar el directorio
de trabajo como también el directorio privado.
Para configurar el directorio de trabajo seleccione la opción File | Working Directory del
menú principal del DBD, esto hará que aparezca la siguiente ventana:
Para cambiar el directorio privado seleccione la opción File | Private Directory del menú
principal del DBD. Esto hará que aparezca la siguiente ventana:
Se debe notar que se puede escribir directamente la ruta o buscarla mediante el botón
Browse... que se observa, una vez hecho esto procedemos a presionar el botón OK para
aceptar los cambios.
Creación de tablas
El desarrollo de aplicaciones de base de datos mediante Delphi implica el tener que crear
las tablas que van a guardar los datos. El DBD sirve para crear tablas DBF (dBase) y DB
(Paradox) así como cualquier tabla en servidores de base de datos, siempre y cuando usted
tenga los drivers instalados.
Para crear una tabla seleccione la opción File | New | Table... del menú principal del DBD.
Cuando usted selecciona esta opción, el DBD le pide seleccionar el formato de base de
datos que usted desea utilizar, a continuación una grafica de la ventana donde se debe
seleccionar el formato de base de datos:
En la grafica anterior cabe destacar que contiene un combobox que contiene todos los tipos
de tablas que se pueden crear. Para seleccionar otro tipo de tabla que no sea el que trae por
defecto presione el botón del combobox, una lista de los tipos de tabla aparecerá y usted
debe seleccionar el que desea. Una vez que se ha seleccionado el tipo de tabla solo hay que
presionar el botón OK.
Tablas DBF
Si el tipo de tabla que usted seleccionó es dBase, el DBD mostrara el diseñador de tabla
para dBase que luce como sigue:
La figura anterior muestra la creación de una tabla con un campo llamado “CÓDIGO” y de
tipo carácter con un tamaño de 8.
Para comenzar a crear la tabla solo hay que comenzar a digitar el nombre del campo y
luego presionar la tecla TAB o Enter para pasar a la siguiente casilla, una vez terminados
de introducir todos los campos, tipos de datos de cada uno, el tamaño de cada campo y
crearle el índice a la tabla – si es necesario – se debe grabar la tabla.
Los índices en una tabla dBase son almacenados en un archivo aparte con el mismo nombre
de la tabla, con la extensión MDX – si es un índice mantenido – o con el nombre del índice
y la extensión NDX – si el índice no es mantenido -. Para crear un índice a un campo,
seleccione Indexes, en el combobox Table Properties y haga clic sobre el botón Define.
Cuando usted pulsa el botón Define aparece la ventana Define Index:
Aquí se pueden crear dos tipos de índices, que son: índice por un solo campo e índices por
una expresión. La expresiones permiten indexar la tabla por mas de un campo, por ejemplo
si usted desea crear un índice por dos campos: “NOMBRE” y “APELLIDO”, para crear un
índice combinado la sintaxis seria “NOMBRE + APELLIDO”. Esto ordenaría los registros
por nombre y luego por apellido.
El DBD creará los índices y actualizara el archivo de índice con el archivo abierto, pero el
DBD no deja ver los datos en el orden del índice, se necesita usar Delphi para hacer eso.
Para ver los datos de una tabla, lo primero que hay que hacer es abrir la tabla, la tabla se
puede abrir seleccionando la opción File | Open del menú principal del DBD o haciendo
clic sobre el speedbutton en la barra de acceso directo. Cuando la tabla es abierta,
automáticamente esta en modo Browse (Navegación), los datos no se pueden cambiar ni
introducirse en la tabla a no ser que se cambie al modo de edición.
Se puede cambiar de modo de trabajo seleccionando View Data o Edit Data de la opción
View del menú principal. Tan pronto usted cambia al modo Edit Data, se puede utilizar
cualquier opción del menú Record para insertar, bloquear, borrar, o hacer búsquedas en la
tabla. El DBD no permite interactuar con campos tipo Binary, OLE o Memo. Lo que se
vera es un letrero identificando el tipo de dato del campo. Para interactuar con cualquiera
de estos tipo de campo, se tiene que hacer vía nuestra aplicación en Delphi.
El DBD tiene unas características interesantes que permiten personalizar la forma de ver los
datos.
Por defecto, todas las columnas de la tabla son desplegadas en el mismo orden en que
fueron creadas, ocasionalmente, usted podría cambiar el orden en que se ven las columnas,
tal vez para quitar de la vista los datos menos relevantes.
Si usted mueve el puntero del Mouse por encima de los encabezados de las columnas,
podrá notar que el puntero del Mouse cambia y se convierte en una pequeña cajita. Para
mover una columna de lugar, coloque el puntero del Mouse encima del encabezado de la
columna, cuando aparezca la pequeña cajita, presione el botón del Mouse y mientras
mantiene presionado el botón del Mouse, arrastre la columna a su nueva ubicación.
Fijación de Columna
Normalmente no podemos ver todas las columnas de datos de la tabla, porque son
demasiadas, algunas son muy grandes, etc. Y tenemos que navegar a través de ellas para
ver las informaciones, pero cuando navegamos para ver otra columna, se oculta la anterior.
Para resolver esta situación el DBD permite fijar una o varias columnas en pantalla, y de
esa manera estas columnas que han sido fijadas no se ocultan cuando navegamos a través
de las otras. Para fijar una columna debemos utilizar el control de bloqueo, el control de
bloqueo se encuentra ubicado en la esquina inferior izquierda de la ventana.
Para fijar una columna solo hay que arrastrar con el Mouse el control de bloqueo hacia la
derecha, cuando usted arrastra el control de bloqueo hacia la derecha, todas las columnas
que se encuentran a la izquierda del control de bloqueo son fijadas mientras que las que se
encuentran a la derecha permanecen movibles. El control de bloque cambia de una flecha a
dos cuando es fijada una o mas columnas.
Guardando la Vista
El DBD permite guardar la forma como se muestran las columnas en el Browser, la forma
como luce el Browser es almacenada en un archivo aparte del DBF. Otro punto es que si
usted cambia en algo la forma como se muestran los datos de la tabla, cuando usted cierra
la tabla el DBD pregunta si desea guardar la vista del Browser, si usted contesta que si
(Yes), es almacenada en un archivo con la extensión TVF (para DBF) o TV (para DB). La
próxima vez que usted abra la tabla, la tabla se mostrara con la nueva vista que fue grabada.
Para borrar una vista almacenada solamente hay que seleccionar la opción Table | Table
View Properties... | Delete del menú principal del DBD.
ALMACEN
CAMPO TIPO LONGITUD DECIMALES CLAVE
ALMACEN C 4 *
DESCRIPCIO C 40
ESTADO C 1
EMPLEADO
CAMPO TIPO LONGITUD DECIMALES CLAVE
EMPLEADO N 4 *
NOMBRE C 40
APELLIDO C 40
CEDULA C 15
DIRECCION C 80
EMAIL C 40
TELEFONO C 13
CELULAR C 13
BEEPER C 13
COMISION N 5 2
ESTADO C 1
UNIDADES
CAMPO TIPO LONGITUD DECIMALES CLAVE
UNIDAD C 4 *
NOMBRE C 40
SIGLA C 40
ESTADO C 1
ARTICULO
CAMPO TIPO LONGITUD DECIMALES CLAVE
ARTICULO C 16 *
DESCRIPCIO C 40
UNIDAD C 4
COSTO N 10 2
REFERENCI C 40
ESTADO C 1
CLIENTES
CAMPO TIPO LONGITUD DECIMALES CLAVE
CLIENTE N 4 *
NOMBRE C 40
APELLIDO C 40
CEDULA C 15
DIRECCION C 80
EMAIL C 40
TELEFONO C 13
CELULAR C 13
BEEPER C 13
NOMBREC C 40
APELLIDOC C 40
TELEFONOC C 13
EXTENSION C 4
ESTADO C 1
FACTURA
CAMPO TIPO LONGITUD DECIMALES CLAVE
NUMERO N 8 *
FECHA D
CLIENTE N 4
EMPLEADO N 4
FLETE N 10 2
IMPUESTO N 10 2
DESCUENTO N 10 2
SUBTOTAL N 10 2
TOTAL N 10 2
Autor: José Uribe Página 118
Universidad del Caribe
IMPRESA C 1 2
ESTADO C 1
DFACTURA
CAMPO TIPO LONGITUD DECIMALES CLAVE
NUMERO N 8 *
LINEA N 6 *
ALMACEN C 4
ARTICULO C 16
UNIDAD C 4
CANTIDAD N 6
IMPUESTO N 10 2
DESCUENTO N 10 2
COSTO N 10 2
PRECIO N 10 2
ARTALM
CAMPO TIPO LONGITUD DECIMALES CLAVE
ALMACEN C 4 *
ARTICULO C 16 *
EXISTENCIA N 6
UNIDAD C 4
ORDENADA N 6
VENDIDA N 6
COSTO N 10 2
PRECIO N 10 2
Para conectar una aplicación en Delphi a una base de datos hay que utilizar tres tipos de
componentes, que son: Dataset, Datasource y los componentes Data-aware, mejor
conocidos como los DBControls. A continuación mostraremos como se relacionan estos
componentes:
Los objetos dataset: permiten conectar la aplicación con la base de datos (back end). Los
componentes Dataset proporcionan la interfase entre la base de datos y la aplicación
desarrollada en Delphi.
En esta parte vamos a ver como trabajan juntos los componentes DataSet, DataSource y
DBControls.
Forma Manual
Cree un nuevo proyecto para esto seleccione la opción File | New Application del menú
principal de Delphi. Esto creara un nuevo proyecto y un nuevo formulario dentro del
proyecto. Cambie el nombre al formulario, para esto utilice la propiedad Name, póngale de
nombre Form_Animales; Cambie el título del formulario, para esto utilice la propiedad
Caption, póngale “Información de los Animales”. Grabe el proyecto y la unidad, para esto
seleccione la opción File | Save Project As... del menú principal de Delphi, grabe la unidad
con el nombre UnitFormAnimales y grabe el proyecto con el nombre de ClaseBaseDato.
Conecte el componente Table con la ubicación de la base de datos para esto utilizaremos la
propiedad DataBaseName del componente Table, la ubicación de la base de datos puede
ser especificada mediante un alias o mediante una ruta (Path). La propiedad DatabaseName
proporciona un ComboBox que cuando usted hace clic en el botón aparece una lista que
contiene todos los alias definidos en el BDE. Seleccione el alias DBDemos. Cuando se va a
especificar una ruta, solamente hay que escribir la ruta en la propiedad DataBaseName,
pero este no es nuestro caso ahora.
Conecte el componente Table con la tabla de la base de datos con la cual se desea conectar
el componente Table. Para esto utilizaremos la propiedad TableName. La propiedad
TableName proporciona un ComboBox que cuando usted hace clic en el botón aparece una
lista que contiene todas las tablas. Seleccione la tabla Animals.DBF.
Para que el usuario pueda ver y manipular los datos dentro de la tabla, debemos utilizar los
controles data-aware o DBControls. Coloque un componente DBEdit en el formulario
desde la página Data Controls de la paleta de componente. Póngale de nombre
DBEdit_Area.
Para que los componentes DBControls puedan mostrar o manipular los datos es necesario
conectarlo con un componente datasource. Conecte el Componente DBEdit con el
Componente DataSource correspondiente, para esto utilizaremos la propiedad DataSource
del DBEdit. La propiedad DataSource proporciona un ComboBox que cuando usted hace
clic en el botón aparece una lista que contiene todos los componentes DataSource que están
colocados en el formulario, de ahí se debe elegir con cual datasource se desea conectar el
DBEdit, por el momento nuestro formulario solo contiene un solo componente DataSource.
Seleccione el DataSource_Animales:
Conectar el Componente DBEdit con el campo de la tabla que se desea acceder a través de
la propiedad DataField del DbEdit. La propiedad DataField proporciona un ComboBox
que cuando usted hace clic en el botón aparece una lista que contiene todos los campos que
posee la tabla de la base de datos. Seleccione el campo AREA.
Coloque tres componentes Label mas, uno para cada DBEdit, ponerles de título en la
propiedad Caption: Nombre, Tamaño y Peso respectivamente, como lo hicimos con el
componente Label del DBEdit_Area. Después de todo esto el formulario debería lucir
como la figura siguiente:
En la tabla ANIMALS.DBF existe el campo BMP, este campo es especial, ya que contiene
la foto del animal. Un campo de datos tipo Memo o Binary no puede ser manipulado con un
componente DBEdit, ya que no puede presentar el contenido. Para poder manipular el
campo BMP en nuestro formulario vamos a necesitar otro DBControl llamado DBImage.
Coloque un componente DBImage en el formulario y conéctelo con el campo BMP. Las
propiedades para conectarlo son exactamente las misma que el DBEdit (ya que ambos son
controles data-aware), así que usted sabe ya como hacerlo.
Active el componente Table mediante la propiedad Active, seleccione el valor True del
combobox de la propiedad Active. Activamos la tabla para ver los datos en tiempo de
diseño.
Agregue un nuevo formulario al proyecto, para esto seleccione la opción File | New Form
del menú principal de Delphi. Esto agregará un nuevo formulario en blanco en el proyecto.
Cambie el nombre al formulario, para esto utilice la propiedad Name, póngale de nombre
Form_Clientes; Cambie el título del formulario, para esto utilice la propiedad Caption,
póngale “Información de los Clientes”. Grabe la unidad, para esto seleccione la opción File
| Save As... del menú principal de Delphi, grabe la unidad con el nombre
UnitFormClientes.
Conecte el componente Table con la ubicación de la base de datos para esto utilizaremos la
propiedad DataBaseName del componente Table. Seleccione el alias DBDemos.
Conecte el componente Table con la tabla de la base de datos con la cual se desea conectar
el componente Table. Para esto utilizaremos la propiedad TableName. Seleccione la tabla
Clients.DBF.
Haga Doble-Clic sobre el componente Table (Table_Clientes); esto hará que aparezca la
ventana del editor de campos (Field Editor):
Ahora Haga Clic con el botón de la derecha del Mouse sobre el editor de campos; esto hará
que aparezca el menú de acceso directo (Speed Menú):
Seleccione la opción Add fields del menú de acceso directo para agregar los campos de la
base de datos en el editor de campos; esto mostrara la ventana Add Fields con todos los
campos de la tabla de base de datos. Aquí con la ayuda del Mouse y las teclas Shift y Ctrl
se deben seleccionar los campos que se desean agregar al editor de campos. Para nuestro
caso, vamos a agregar todos los campos y como por defecto vienen todos los campos
seleccionado, solamente hay que presionar el botón OK para aceptarlo.
Utilizar el Mouse y la tecla Shift o Ctrl para seleccionar los campos en el editor de campos
que se desean agregar en el formulario. Seleccione todos los campos.
Hacer la operación de Drag and Drop; para esto posicione el puntero del Mouse encima de
uno de los campos que se encuentran seleccionados, presione el botón del clic del Mouse y
mientras mantiene presionado el botón del Mouse mueva el puntero del Mouse hacia la
posición en el formulario donde desea colocar los componentes, luego suelte el botón del
Mouse.
Como se puede notar en la figura anterior, con el drag and drop se agrega automáticamente
el componente DataSource, todos los componentes data-aware control y los componentes
Label para todos los campos que fueron seleccionados. La Tarea siguiente es: organizar los
controles en el formulario, cambiar los nombres de los componentes que sean necesarios,
cambiar los títulos de los Labels de la forma deseada.
Active el componente Table mediante la propiedad Active, seleccione el valor True del
combobox de la propiedad Active.
Como habíamos dicho anteriormente es sumamente mas fácil hacer un formulario con el
Drag and Drop.
Agregue un nuevo formulario al proyecto, para esto seleccione la opción File | New Form
del menú principal de Delphi. Esto agregará un nuevo formulario en blanco en el proyecto.
Cambie el nombre al formulario, para esto utilice la propiedad Name, póngale de nombre
Form_Ordenes; Cambie el título del formulario, para esto utilice la propiedad Caption,
póngale “Ordenes de Compra”. Grabe la unidad, para esto seleccione la opción File | Save
As... del menú principal de Delphi, grabe la unidad con el nombre UnitFormOrdenes.
Coloque dos componentes Table en el formulario desde la página Data Access de la paleta
de componente. Cambie el nombre de los Table: a uno póngale Table_Ordenes; y al otro
póngale Table_Items.
Conecte los componentes Table con la ubicación de la base de datos para esto utilizaremos
la propiedad DataBaseName de los componente Tables. Seleccione el alias DBDemos
para ambas tablas.
Conecte los componentes Table con la tabla de la base de datos con la cual se desea
conectar los componentes Table respectivamente. Para esto utilizaremos la propiedad
TableName. Seleccione la tabla Orders.db para el componente Table_Ordenes e Items.db
para el componente Table_Items.
Ahora con el componente Table_Ordenes vamos a hacer un drag and drop para crear la
interfase del Master (Maestro). Hasta ahora nuestro formulario luce de la siguiente forma:
Vamos a crear la relación entre las dos tablas, para esto utilizaremos la propiedad
MasterSource y MasterFields del componente table. La relación se establece en el
componente Table que esta conectado a la tabla de Detalle, en nuestro caso el componente
Table_Items. Primero se especifica el DataSource de la tabla maestra en la propiedad
MasterSource de la tabla de detalle (Table_Items), presione el botón del combobox y
solamente aparecera el DataSource_Ordenes, selecciónelo; luego se presiona el botón
(ellipsis) en la propiedad MasterFields de la tabla de detalle (Table_Items) y aparece la
siguiente ventana:
Esta ventana sirve para establecer las relaciones entre la tabla maestra y la tabla de detalle.
El ComboBox Available Indexes ubicado en la parte superior de la ventana sirve para
seleccionar el índice por el cual se desea establecer la relación.
En la parte central de la ventana existen dos listas (Detail Fields y Master Fields) que
listan los campos por los cuales se pueden establecer relaciones, en una lista están los
campos de la tabla de detalle (Detail Fields) y en la otra (Master Fields) están los campos
de la tabla maestra. Para establecer la relación solo hay que hacer clic en el campo
correspondiente en la lista Detail Fields y Master Fields. Cuando se seleccionan los
campos a relacionar, se activa el botón Add que se encuentra entre las dos listas.
Una vez se haya presionado el botón Add los campos relacionados aparecerán en la parte
de abajo de la pantalla llamada Joined Fields, los campos aparecerán separados por ->. Si
se necesita establecer una relación por mas de un campo, solamente hay que seleccionar los
campos siguientes en la relación y presionar el botón Add estos pasos se deben estar
repitiendo hasta haber establecido la relación por todos los campos necesarios.
El Botón Delete sirve para borrar de la lista Joined Fields una relación, el botón Clear
sirve para limpiar todas las relaciones. Para terminar y aceptar los cambios realizados
presione el botón OK y para cancelar sin grabar los cambios presione el botón Cancel.
Componente DBGrid
Ahora que ya sabemos que es un DBGrid, para que sirve y como funciona. En la parte del
detalle necesitamos ver todos los registros del maestro, lo que quiere decir que
necesitaremos un componente DBGrid. Coloque un componente Dbgrid en el formulario y
conectarle con el componente DataSource de la tabla de detalle mediante la propiedad
Datasource del Dbgrid. Seleccione el componente DataSource_Items en la propiedad
DataSource del DBGrid y ya esta.
Active los componentes Table mediante la propiedad Active, seleccione el valor True del
combobox de la propiedad Active.
Para ejecutar el Form Wizard usted puede utilizar uno de los dos métodos existente que hay
para cargarlo, estos son:
Seleccionando la opción File New... del menú principal de Delphi, luego seleccione la
página Bussines de la ventana New Items que aparece:
Para iniciar el Form Wizard, seleccione el icono Database Form Wizard y pulse el botón
OK o simplemente haga doble-clic sobre el icono.
Cualquiera que fuere la forma que usted utilice para iniciar el Form Wizard, la pantalla
iniciar del Form Wizard será la misma:
la figura anterior muestra la ventana iniciar del Form Wizard, en esta pantalla el usuario
debe especificar que tipo de formulario desea crear.
Para crear un formulario simple de base de datos con el Form Wizard, lo primero que
tenemos que hacer es cargar el Form Wizard, una vez cargado el Form Wizard en la
pantalla de inicio del Form Wizard procedemos a seleccionar el tipo de formulario que
deseamos crear, para esto debemos seleccionar una de las dos opciones que se encuentran
debajo del grupo Form Options, haga clic sobre la opción Create a simple form; luego
procedemos a seleccionar el tipo de componente DataSet que deseamos utilizar, para esto
debemos seleccionar una de las dos opciones que se encuentran debajo del grupo DataSet
Options, haga clic sobre la opción Create a form using TTable objects. Haga clic sobre el
botón Next, esto traerá la siguiente pantalla:
Esta pantalla del Form Wizard nos permite seleccionar la tabla de base de datos para la cual
vamos a crear el formulario. En esta pantalla podemos ver que existen varios controles para
seleccionar la tabla:
Tenemos un Edit llamado Table Name que sirve para especificar el nombre de la
tabla de base de datos. Además este mismo Edit nos permite especificar un criterio
de búsqueda para especificar los tipos de archivos que andamos buscando cuando
las tablas la vamos a conectar vía una ruta y no un Alias.
Inmediatamente debajo del Edit Table Name tenemos una lista que muestra todas
las tablas de base de datos u objetos de base de datos dependiendo del tipo de base
de datos (Local o Cliente / Servidor) y que cumplan con los criterios de filtros. De
esta lista podemos seleccionar la tabla a la que le vamos a construir el formulario.
Es importante notar que cuando usted hace clic sobre una tabla u objeto en esta lista,
el nombre del objeto seleccionado aparece en el Edit Table Name.
Tenemos una lista llamada Directories que nos permite navegar a través de todos los
directorios del disco duro para seleccionar la ubicación de la tabla de base de datos.
Debemos mencionar que el contenido de la lista cambia de acuerdo al tipo de base
de datos, Local o Cliente / Servidor.
Un ComboBox llamado List Files of Type que muestra los tipos de archivos que se
van a desplegar en la lista de las tablas si el tipo de base de datos es Local, o los
objetos de la base de datos si es Cliente / Servidor.
Un ComboBox llamado Drive or Alias Name que sirve para seleccionar la unidad
de drive – si estamos buscando la tabla por directorios – o un alias de base de datos
– si vamos a seleccionar la tabla desde un alias.
Seleccione la tabla animals.dbf y presione el botón Next. Cabe mencionar que el botón Next
solo se activa una vez que usted ha completado las informaciones necesaria para cada
pantalla. Ahora aparece la tercera pantalla del Form Wizard que debe lucir como la
siguiente figura:
En esta ventana debemos seleccionar los campos de la tabla que deseamos que aparezcan
en el formulario. Esta ventana cuenta con dos listas: Available Fields y Ordered Selected
Fields. La primera contiene todos los campos que están en la tabla y la segunda contiene los
campos y el orden en que van a aparecer en el formulario. Aquí la idea es pasar de una lista
a otra los campos, para esto se deben utilizar los botones que se encuentran entre las dos
listas o simplemente arrastrar de una lista a otra los campos. Los botones permiten mover
los campos en la dirección de la Flecha y los que tienen dos flechas mueven todos los
campos a la vez en la dirección que indica la flecha. Debajo de la lista Ordered Selected
Fields hay dos botones, estos botones sirven para intercambiar el orden de los campos.
Transfiera todos los campos a la lista Ordered Selected Fields, la ventana debe lucir como a
continuación:
En esta ventana se debe escoger la forma como aparecerán organizados los controles en el
formulario. Las opciones que nos proporcionan son: Horizontally, Vertically e In a grid.
Horizontally esta forma permitirá que los controles aparezcan colocado uno al lado del otro.
Vertically esta forma permitirá que los controles aparezcan uno debajo del otro. Y In a grid
hará que los campos sean manipulados desde un DBGrid. Es importante mencionar que
después de la primera ventana del Form Wizard el botón Back siempre esta activo y sirve
Autor: José Uribe Página 146
Universidad del Caribe
Esta es la ultima pantalla del Form Wizard. Aquí podemos apreciar unos cuantos
parámetros:
el CheckBox Generate a main form: sirve para indicarle al Form Wizard que el
formulario que se va a crear debe ser colocado como el main form del del proyecto
– el formulario que aparece cuando se manda a ejecutar el proyecto.
Una vez seleccionado los respectivos parámetros, solo hay que presionar el botón Finish
para que el Form Wizard cree nuestro formulario. Presione el botón Finish y vea el
resultado de nuestro trabajo.
Para crear un formulario maestro / detalle de base de datos con el Form Wizard, lo primero
que tenemos que hacer es cargar el Form Wizard, una vez cargado el Form Wizard en la
pantalla de inicio del Form Wizard procedemos a seleccionar el tipo de formulario que
deseamos crear, para esto debemos seleccionar una de las dos opciones que se encuentran
debajo del grupo Form Options, haga clic sobre la opción Create a Master/Detail form;
luego procedemos a seleccionar el tipo de componente DataSet que deseamos utilizar, para
esto debemos seleccionar una de las dos opciones que se encuentran debajo del grupo
DataSet Options, haga clic sobre la opción Create a form using TTable objects. Haga clic
sobre el botón Next, esto mostrará la siguiente pantalla:
Esta pantalla del Form Wizard nos permite seleccionar la tabla de base de datos para la cual
vamos a crear el formulario. En esta pantalla podemos ver que existen varios controles para
seleccionar la tabla:
Tenemos un Edit llamado Table Name que sirve para especificar el nombre de la
tabla de base de datos. Además este mismo Edit nos permite especificar un criterio
de búsqueda para especificar los tipos de archivos que andamos buscando cuando
las tablas la vamos a conectar vía una ruta y no un Alias.
Inmediatamente debajo del Edit Table Name tenemos una lista que muestra todas
las tablas de base de datos u objetos de base de datos dependiendo del tipo de base
de datos (Local o Cliente / Servidor) y que cumplan con los criterios de filtros. De
esta lista podemos seleccionar la tabla a la que le vamos a construir el formulario.
Es importante notar que cuando usted hace clic sobre una tabla u objeto en esta lista,
el nombre del objeto seleccionado aparece en el Edit Table Name.
Tenemos una lista llamada Directories que nos permite navegar a través de todos los
directorios del disco duro para seleccionar la ubicación de la tabla de base de datos.
Debemos mencionar que el contenido de la lista cambia de acuerdo al tipo de base
de datos, Local o Cliente / Servidor.
Un ComboBox llamado List Files of Type que muestra los tipos de archivos que se
van a desplegar en la lista de las tablas si el tipo de base de datos es Local, o los
objetos de la base de datos si es Cliente / Servidor.
Un ComboBox llamado Drive or Alias Name que sirve para seleccionar la unidad
de drive – si estamos buscando la tabla por directorios – o un alias de base de datos
– si vamos a seleccionar la tabla desde un alias.
En esta pantalla seleccionaremos la tabla de base de datos que será el maestro (master) en el
formulario, seleccione la tabla orders.db y presione el botón Next. Ahora aparece la
siguiente pantalla del Form Wizard que debe lucir como la siguiente figura:
En esta ventana debemos seleccionar los campos de la tabla que deseamos que aparezcan
en la parte maestra del formulario. Esta ventana cuenta con dos listas: Available Fields y
Ordered Selected Fields. La primera contiene todos los campos que están en la tabla y la
segunda contiene los campos y el orden en que van a aparecer en el formulario. Aquí la
idea es pasar de una lista a otra los campos, para esto se deben utilizar los botones que se
encuentran entre las dos listas o simplemente arrastrar de una lista a otra los campos. Los
botones permiten mover los campos en la dirección de la Flecha y los que tienen dos
flechas mueven todos los campos a la vez en la dirección que indica la flecha. Debajo de la
lista Ordered Selected Fields hay dos botones, estos botones sirven para intercambiar el
orden de los campos. Transfiera todos los campos a la lista Ordered Selected Fields, la
ventana debe lucir como a continuación:
En esta ventana se debe escoger la forma como aparecerán organizados los controles en el
formulario. Las opciones que nos proporcionan son: Horizontally, Vertically e In a grid.
Horizontally esta forma permitirá que los controles aparezcan colocado uno al lado del otro.
Vertically esta forma permitirá que los controles aparezcan uno debajo del otro. Y In a grid
hará que los campos sean manipulados desde un DBGrid. Es importante mencionar que
después de la primera ventana del Form Wizard el botón Back siempre esta activo y sirve
Autor: José Uribe Página 152
Universidad del Caribe
En esta pantalla seleccionaremos la tabla de base de datos que será el detalle (detail) en el
formulario, seleccione la tabla items.db y presione el botón Next. Ahora aparece la
siguiente pantalla del Form Wizard que debe lucir como la siguiente figura:
En esta ventana debemos seleccionar los campos de la tabla de detalle que deseamos que
aparezcan en la parte de detalle del formulario. Esta ventana cuenta con dos listas:
Available Fields y Ordered Selected Fields. La primera contiene todos los campos que
están en la tabla y la segunda contiene los campos y el orden en que van a aparecer en el
formulario. Aquí la idea es pasar de una lista a otra los campos, para esto se deben utilizar
los botones que se encuentran entre las dos listas o simplemente arrastrar de una lista a otra
los campos. Los botones permiten mover los campos en la dirección de la Flecha y los que
tienen dos flechas mueven todos los campos a la vez en la dirección que indica la flecha.
Debajo de la lista Ordered Selected Fields hay dos botones, estos botones sirven para
intercambiar el orden de los campos. Transfiera todos los campos a la lista Ordered
Selected Fields, la ventana debe lucir como a continuación:
En esta ventana se debe escoger la forma como aparecerán organizados los controles en el
formulario. Las opciones que nos proporcionan son: Horizontally, Vertically e In a grid.
Horizontally esta forma permitirá que los controles aparezcan colocado uno al lado del otro.
Vertically esta forma permitirá que los controles aparezcan uno debajo del otro. Y In a grid
hará que los campos sean manipulados desde un DBGrid. Se debe notar que por defecto
viene seleccionado la opción In a grid, ya que la parte del detalle estará formado por uno o
mas registros, presione el botón Next para pasar a la siguiente ventana:
En esta ventana se debe establecer las relaciones entre la tabla maestra y la tabla de detalle.
El ComboBox Available Indexes ubicado en la parte superior de la ventana sirve para
seleccionar el índice por el cual se desea establecer la relación.
En la parte central de la ventana existen dos listas (Detail Fields y Master Fields) que
listan los campos por los cuales se pueden establecer relaciones, en una lista están los
campos de la tabla de detalle (Detail Fields) y en la otra (Master Fields) están los campos
de la tabla maestra. Para establecer la relación solo hay que hacer clic en el campo
correspondiente en la lista Detail Fields y Master Fields. Cuando se seleccionan los
campos a relacionar, se activa el botón Add que se encuentra entre las dos listas.
Una vez se haya presionado el botón Add los campos relacionados aparecerán en la parte
de abajo de la pantalla llamada Joined Fields, los campos aparecerán separados por ->. Si
se necesita establecer una relación por mas de un campo, solamente hay que seleccionar los
campos siguientes en la relación y presionar el botón Add estos pasos se deben estar
repitiendo hasta haber establecido la relación por todos los campos necesarios.
El Botón Delete sirve para borrar de la lista Joined Fields una relación, el botón Clear
sirve para limpiar todas las relaciones. Para terminar y aceptar los cambios realizados
presione el botón OK y para cancelar sin grabar los cambios presione el botón Cancel.
Esta es la ultima pantalla del Form Wizard. Aquí podemos apreciar unos cuantos
parámetros:
el CheckBox Generate a main form: sirve para indicarle al Form Wizard que el
formulario que se va a crear debe ser colocado como el main form del del proyecto
– el formulario que aparece cuando se manda a ejecutar el proyecto.
Una vez seleccionado los respectivos parámetros, solo hay que presionar el botón Finish
para que el Form Wizard cree nuestro formulario. Presione el botón Finish y vea el
resultado de nuestro trabajo.
El acceso a los campos de una tabla de base de datos es quizás uno de los puntos
primordiales en la construcción de aplicaciones de base de datos. La necesidad por parte de
los programadores de interactuar y manipular las columnas de una tabla sin necesidad que
el usuario tenga que editarlo en pantalla. Los componentes de campos son componentes
invisibles que son creados por Delphi en tiempo de ejecución para el manejo de las
columnas de la tabla. Los componentes de campos son descendientes del objeto Tfield o
uno de sus subclases. Por defecto cada vez que usted coloca en la aplicación un
componente DataSet y lo abre, Delphi automáticamente asigna un descendiente del objeto
Tfield para cada campo de la tabla de base de datos.
Estos componentes que Delphi crea dinámicamente, son invisibles y tienen un tipo de datos
especifico para el tipo de datos que tiene definido el campo en la tabla. Los campos que
Delphi crea son almacenados en la propiedad Fields del componente Table y Querie, esta
propiedad es un arreglo.
Este funcionamiento por defecto de crear los campos cada vez que usted abre un
componente DataSet puede ser omitido en tiempo de diseño, para lograr esto solo hay que
crear campos persistentes. Para crear campos persistentes solo hay que crearlos en el editor
de campo.
Los componentes de campos son creados a partir del objeto TField. Usted no puede crear
un componente de tipo TField, pero si existe una serie de componentes de campos que
corresponden a los tipos de campos dentro de una tabla de base de datos. A continuación
una lista de los componentes de campos:
Estos son los componentes de campos que son creados automáticamente por Delphi o que
son creados por usted en el diseñador de campos. La ventaja que existe en crearlo en
tiempo de diseño (campos persistentes) es que podemos manipular las propiedades y los
eventos de estos componentes a través del inspector de objeto. Existen otros tipos de
campos, pero estos son los mas utilizados.
El editor de campos es la herramienta que nos permite crear campos persistentes o mejor
dicho crear los campos en tiempo de diseño para omitir el funcionamiento por defecto que
tiene Delphi de crear los campos dinámicamente.
Y hacer clic con el botón de la derecha del Mouse encima del componente DataSet
y seleccionar la opción Fields Editor... del menú de acceso directo que aparece.
Para crear los campos solamente hay que hacer clic con el botón de la derecha del Mouse y
seleccionar la opción Add fields... del menú de acceso directo:
Cabe mencionar que solamente tenemos tres opciones disponibles en el menú, pues no
existe ningún campo creado en el editor de campo. Cuando seleccionamos la opción Add
fields... aparece una ventana con todos los campos del componente DataSet seleccionados:
Para crear todos los componentes de campos para todos ellos , haga clic en el botón OK.
Cuando usted desee dejar sin crear algún campo, utilice la combinación Ctrl. + clic del
Mouse para desmarcarlo, y esto evitara que sea creado. Una vez que los campos han sido
agregados el editor de campos luce como la siguiente figura:
Ahora podemos cambiar las propiedades y programar los eventos de los campos creados.
Se puede notar en la figura anterior que el campo seleccionado en el editor de campos, es el
componente que aparece seleccionado en el inspector de objeto.
Propiedad Descripción
Currency Esta propiedad es utilizada para controlar los valores de los campos
tipo TBCDField, TcurrencyField y TFloatField, cuando las
propiedades DisplayFormat y EditFormat no tienen ningún valor.
DisplayFormat Sirve para asignar una mascarilla. Esta mascarilla es utilizada
solamente para desplegar los datos.
DisplayLabel Permite cambiar el titulo de encabezado que es desplegado en la
columna del componente DBGrid.
DisplayWidth Permite cambiar la cantidad de caracteres que será desplegada para
el campo.
EditMask Sirve para asignar una mascarilla. Esta mascarilla es utilizada para
editar los datos.
ReadOnly Permite especificar si el campo será solo lectura o no
Required Esta propiedad sirve para controlar si el campo debe tener valor o
no.
Visible Permite desplegar o no un campo.
Como se puede notar los componentes TField solamente constan con cuatros eventos:
Evento Descripción
OnChange Este evento se dispara inmediatamente los datos han sido
introducido en el buffer del registro.
OnGetText Este evento se ejecuta cada vez que la propiedad DisplayText o Text
del campo son referenciada.
OnSetText Este evento se ejecuta cuando se le asigna un valor a la propiedad
Text del campo.
OnValidate Sirve para validar los datos que se introducen en el campo.
Una de las tareas mas comunes que debe acompañar la creación de formularios para entrada
de datos es determinar como se quiere formatear la información. Para modificar la forma
como la información es capturada se debe utilizar la propiedad EditMask para los datos tipo
String. Este método permite insertar caracteres que se convertirán en parte del campo, por
Ejemplo: guiones o paréntesis que son definidos como caracteres literales dentro de la
mascarilla, aparecerán como parte de los datos del campo en la tabla.
La ventana Input Mask Editor presenta una serie de mascarilla de ejemplo en la parte
derecha de la ventana. Para utilizar una de estas mascarillas, solamente hay que hacer
doble-clic sobre ella. La mascarilla puede ser probada para ver como trabaja en el cuadro
Test Input. Después de haber definido su mascarilla, usted puede introducir cadenas de
caracteres de prueba para ver si la mascarilla formatea el texto correctamente. El botón
Masks permite cargar archivos de mascarillas de otros países.
Existen varias formas para acceder a un campo por código de programación, entre la que
mencionaremos:
1. La propiedad Fields del componente DataSet, que permite acceder a un campo por
el orden en la tabla de base de datos y donde el primer campo de la tabla es el
elemento 0, por ejemplo:
Table1.Fields[0].Value;
Table1.FieldByName(‘NUMERO’).Value;
NombredelcomponentedatasetNombredelCampo
Por Ejemplo:
Table1NUMERO.Value;
Cabe comentar aquí que las dos primeras formas funcionan con campos dinámicos como
con campos persistente, pero que el ultimo formato solamente funciona con campos
persistente.
1. Para crear un campo calculado cargue el editor de campo y haga clic con el botón de
la derecha del Mouse y seleccione la opción New field... del menú de acceso
directo. Esto ocasionará que aparezca la ventana New Field:
2. Introduzca el nombre del campo en el edit box Name, este nombre debe ser
diferente de los que existen en la tabla de base de datos.
4. Introduzca el tamaño del campo en el edit box Size, si aplica. El tamaño del campo
solamente aplica a campos de tipo: TstringField, TbytesField y TVarBytesField.
6. Haga clic en el botón OK. El nuevo campo calculado es agregado al final de la lista
de campos del editor de campos.
7. Programe el evento OnCalcFields del componente DataSet para calcular el valor del
campo calculado.
Nota: los campos calculados solamente se le puede asignar valor en el evento OnCalcFields
y el evento OnCalcField se programa en el componente DataSet donde se creó el campo
calculado.
tabla dentro de una lista, esto permite que el usuario vea un conjunto de opciones para
seleccionar desde ahí, en vez de tener que digitarlo. Esto permite asegurar que los datos que
el usuario introduzca siempre serán validos, lo que le ahorrara al programador el tener que
usar una serie de validaciones.
1. Para crear un campo lookup cargue el editor de campo y haga clic con el botón de la
derecha del Mouse y seleccione la opción New field... del menú de acceso directo.
Esto ocasionará que aparezca la ventana New Field vista anteriormente
3. Introduzca el tamaño del campo en el edit box Size, si aplica. El tamaño del campo
solamente aplica a campos de tipo: TstringField, TbytesField y TVarBytesField.
4. Seleccione la opción Lookup en el radio group Field type. Cuando usted selecciona
la opción Lookup se habilitan los combobox DataSet y Key Fields.
En esta practica vamos a crear un campo calculado para desplegar el nombre y apellido del
cliente.
Cree un formulario Maestro / Detalle con las tablas Factura y Detalle que fueron creadas
en el capitulo del Database DeskTop. El formulario debería lucir de la siguiente forma:
Coloque un DBEdit al lado del DBEdit de cliente y conéctelo con el DataSource de factura
y con el campo calculado que creamos (NOMBRE_CLIENTE). A continuación un vistazo
a nuestro formulario:
En esta practica vamos a utilizar el evento OnValidate para validar que un usuario no
digite dos veces el mismo código.
Cree un formulario simple con la tabla CLIENTE que fue creada en el capitulo del
Database DeskTop. El formulario debería lucir de la siguiente forma:
Haga doble clic sobre el componente table_cliente, para cargar el editor de campos y
agregue todos los campos sino están agregados, seleccione el campo CLIENTE y vaya al
inspector de objeto y seleccione la pagina Events. Seleccione el evento OnValidate y haga
doble clic en la parte derecha, esto hará que aparezca el editor de código, escriba el
siguiente código:
Autor: José Uribe Página 170
Universidad del Caribe
Cuando se esta desarrollando una aplicación en Delphi que interactúa con bases
de datos debemos tener en cuenta unos cuantos detalles, por ejemplo: en un
formulario de base de datos siempre existirá una tabla que es la tabla principal del
formulario – tabla principal quiere decir que en esa tabla es que el formulario
procesa toda las informaciones que se manejan en el formulario-.
ARTICULO
CAMPO TIPO LONGITUD DECIMALES CLAVE
ARTICULO C 16 *
DESCRIPCIO C 40
UNIDAD C 4
COSTO N 10 2
Autor: José Uribe Página 172
Universidad del Caribe
REFERENCI C 40
ESTADO C 1
ORDCOMP
CAMPO TIPO LONGITUD DECIMALES CLAVE
NUMERO N 6 *
SUPLIDOR N 4
FECHA D
ESTADO C 1
OBSERVACIO C 250
TOTALORDE N 14 2
DETORDC
CAMPO TIPO LONGITUD DECIMALES CLAVE
NUMERO N 6 *
LINEA N 4 *
ARTICULO C 16
CANTIDAD N 10 2
COSTO N 12 2
SUPLIDOR
CAMPO TIPO LONGITUD DECIMALES CLAVE
SUPLIDOR N 4 *
NOMBRE C 60
DIRECCION C 80
EMAIL C 40
TELEFONO C 13
ESTADO C 1
Cree un nuevo proyecto en Delphi con la opción File | New Application del menú
principal de Delphi. En el formulario que trajo el proyecto cree un menú principal
con las siguientes opciones:
Mantenimiento
Artículos
Suplidor
Proceso
Ordenes de compra
Como se puede notar en la figura se necesita introducir el código del suplidor, pero
no se puede apreciar el nombre del suplidor, con lo cual el usuario no sabría de
quien es el código que esta utilizando.
Vamos a poner que en el formulario cuando el usuario digite el código del suplidor
muestre el nombre del suplidor.
Para lograr que se visualice el nombre del suplidor en nuestra pantalla, debemos
programar un evento para que cuando introduzcan el código del suplidor se
busque este código en la tabla de suplidores y si existe lo muestre.
if tblSuplidores.FindKey([editsuplidor.Text]) then
edit_nombre_suplidor.Text := tblSuplidores.FieldByName('nombre').AsString
else
begin
edit_nombre_suplidor.Clear;
ShowMessage('ERROR... EL CODIGO DE SUPLIDOR NO EXISTE');
editsuplidor.SetFocus;
end;
Todo funciona bien, eso es lo que usted piensa, agregue dos ordenes de compras
en el formulario y utilice los botones de navegación del formulario para moverse de
un registro a otro y observe lo que ocurre.
EditSUPLIDORExit(EditSUPLIDOR);
if tblArticulos.FindKey([tblDetOrdC.FieldByName('articulo')]) then
tblDetOrdCdescripcion_articulo.AsString:=
tblArticulos.FieldByName('descripcio').AsString;
Cree un campo calculado que se llame total, para calcular el total de importe del
articulo, y coloque la siguiente línea de código para calcularlo:
tblDetOrdCtotal.AsFloat:= tblDetOrdCcantidad.AsFloat *
tblDetOrdCcosto.AsFloat;
En la figura anterior podemos ver un formulario con un componente QuickRep y este con
un componente QRBand en el. El componente QRBand representa las diferentes secciones
de un reporte, este componente tiene una propiedad BandType que especifica banda el
lugar y la frecuencia de impresión del mismo. El componente QRBand puede ser colocado
desde la paleta de componente o con la ventana de configuración de QuickReport. Cuando
se coloca un componente QRBand, el valor por defecto de la propiedad BandType es
rbTitle. Este tipo de banda se imprimirá solamente una vez al inicio del reporte.
Tipos de bandas
Tipo Ubicación
rbChild
rbColumnHeader Se imprime una vez por pagina y encima de cada columna del reporte.
rbDetail Se imprime una vez por cada registro del componente DataSet
rbGroupFooter Se imprime cada vez que el dato de la expresión cambia. Se imprime
debajo de la banda de detalle.
rbGroupHeader Se imprime cada vez que el dato de la expresión cambia. Se imprime
encima de la banda de detalle.
rbOverlay Una vez por página.
rbPageFooter Se imprime una vez en la parte inferior de la página.
Autor: José Uribe Página 182
Universidad del Caribe
Ventana de Configuración
Para llamar la ventana Report Settings de QuickReport solamente hay que hacer clic con el
botón de la derecha del mouse encima del componente QuickRep y seleccionar la opción
Report Settings del menú que aparece. Otra forma para llamar la ventana Report Settings
es haciendo doble clic sobre el componente QuickRep. Sea cual fuere la forma que usted
utilice para llamarla, la ventana Report Settings debe lucir como la figura siguiente:
En esta ventana se puede ajustar el tamaño del papel (Paper size), los margenes de la pagina
(Margins), el tipo de letra (Other), si la pagina va a tener un marco (Page frame) y lo mas
importante las bandas que va a tener el reporte(Bands). Como se puede apreciar la ventana
es bien facil de utilizar y como dijimos anteriormente, con unos cuantos clic podemos
definir nuestros reportes.
Nota: es muy importante mencionar que cualquiera de los métodos de llamar la ventana
Report Settings debe ser utilizado sobre el componente QuickRep, ya que si por
equivocación se selecciona el área de una banda, el resultado no será el esperado.
En este capitulo vamos a crear un reporte de clientes con la tabla Customer, el reporte
contendrá las siguientes columnas: Nombre, Dirección, Ciudad y Pais para los campos:
Company, Addr1, City y Country. Lo primero que vamos a necesitar es crear un nuevo
proyecto y formulario y agregar un componente QuickRep en él.
Normalmente las informaciones son almacenadas en archivos o base de datos. Sea cual
Autor: José Uribe Página 184
Universidad del Caribe
fuere el lugar donde se guardan las informaciones, al momento de crear nuestro reporte con
QuickReport, debemos decirle de donde el va a sacar los datos para generar el reporte.
Para especificar la fuente de los datos del reporte utilizaremos los componentes DataSet,
con los cuales ya usted esta familiarizado y que sirven para acceder a la información de la
base de datos vía el BDE. Al igual que con los formularios, el componente DataSet puede
residir localmente en el formulario o en un DataModule.
El próximo paso consiste en decirle a QuickReport desde donde va a obtener los datos, esto
lo haremos utilizando la propiedad DataSet del componente QuickRep. Seleccione el
componente QuickRep y en la propiedad DataSet seleccione el componente Table
respectivamente. Ahora nuestro reporte debe parecerse a la siguiente figura:
El paso siguiente para la creación de nuestro reporte es poner los letreros y encabezados de
nuestro reporte. En el grupo de componentes de QuickReport se encuentra un componente
llamado QRLabel. Este componente sirve para poner letreros o informaciones fijas en
nuestro reporte. El funcionamiento de este componente es parecido al componente Label,
Autor: José Uribe Página 185
Universidad del Caribe
con la ligera diferencia que el Label no puede ser utilizado con QuickReport. Para utilizar
el componente QRLabel solamente hay que seleccionarlo y colocarlo en la banda deseada.
Para nuestro ejemplo vamos a crear cuatro columnas de encabezados utilizando el
componente QRLabel y lo vamos a colocar en banda ColumnHeader. Les pondremos de
nombre: QRLabelNombre, QRLabelDireccion, QRLabelCiudad, QRLabelPais
respectivamente. Y en la propiedad Caption le pondremos: Nombre, Dirección, Ciudad,
País respectivamente. Nuestro reporta ahora debe lucir como la figura siguiente:
Después de haber terminado de construir los encabezados, el paso siguiente es colocar los
datos del reporte. Para colocar los datos de la base de datos en el reporte se utilizan los
componentes QRDB de QuickReport. estos componentes no son mas que todos los
comoponentes que comienzan con estas siglas y que denotan que son componentes de
QuickReport para base de datos. El componente que utilizaremos en nuestro ejemplo es el
QRDBText. Este componente sirve para mostrar información proveniente de la base de
datos, este componente tiene dos propiedades que sirven para conectarlo con la tabla de
base de datos y con el campo, esta propiedades son: DataSet y DataField respectivamente.
Para crear un componente QRDBText solamente haga clic en la paleta de componente y
colóquelo en la banda deseada del reporte. Para nuestro caso, crearemos cinco QRDBText
en la banda de detalle. Estos objetos corresponden a los QRLabel creados anteriormente en
la banda ColumnHeader y deben ir alineados con ellos.
Conecte los componentes QRDBText con el componente Table vía la propiedad DataSet
del componente QRDBText. Una vez se ha conectado el componente QRDBText con el
componente DataSet, se puede conectar el mismo con el campo de la tabla de base de datos
vía la propiedad DataField. Para conectar el componente QRDBText con el campo
solamente hay que seleccionar el campo de la lista de campos de la propiedad DataField.
Conecte los componentes QRDBText con los campos Company, Addr1, City y Country
respectivamente.
Vamos ahora a colocar un encabezado con el nombre del reporte y el numero de pagina en
la banda PageHeader. Coloque un componente QRLabel en la banda PageHeader y en la
propiedad Caption del QRLabel escriba “Reporte de Clientes”, centralice el letrero al
centro de la venta. Ahora vamos a colocar el numero de pagina del reporte, para colocar el
numero de pagina en el encabezado, necesitaremos un componente QRSysData: este
componente sirve para poner informaciones del sistema en el reporte. Coloque un
componente QRSysData en la esquina superior derecha de la banda PageHeader. Ahora en
la propiedad Data del componente QRSysdata seleccione el valor qrsPageNumber y en la
propiedad Text del mismo introduzca “Numero de Página: ”, este será el letrero que
aparecerá antes del numero de página. Nuestro reporte debe lucir ahora como la figura a
continuación:
Vamos a ver como luce nuestro reporte, pero primero debemos activar la tabla para que los
datos estén disponibles. Seleccione la tabla y en la propiedad Active de la tabla seleccione
el valor True, ahora haga clic con el botón de la derecha del mouse encima del componente
Autor: José Uribe Página 187
Universidad del Caribe
QuickRep y seleccione la opción Preview del menú de acceso directo o bien llame la
ventana Report Settings y haga clic sobre el botón preview.
Los campos de totales se construyen en la banda de total (rbSummary), por lo tanto cada
vez que deseemos calcular totales en nuestro reporte debemos agregar una banda de este
tipo. El próximo paso a seguir es crear el campo de total. En la página Qreport de la paleta
de componente hay un componente llamado QRExpr. Este componente sirve para crear
campos calculados.
Para ejecutar el Form Wizard usted puede utilizar uno de los dos métodos existente que hay
para cargarlo, estos son:
Seleccionando la opción File New... del menú principal de Delphi, luego seleccione la
página Bussines de la ventana New Items que aparece:
Para iniciar el Form Wizard, seleccione el icono Database Form Wizard y pulse el botón
OK o simplemente haga doble-clic sobre el icono.
Cualquiera que fuere la forma que usted utilice para iniciar el Form Wizard, la pantalla
iniciar del Form Wizard será la misma:
la figura anterior muestra la ventana iniciar del Form Wizard, en esta pantalla el usuario
debe especificar que tipo de formulario desea crear.
Para crear un formulario simple de base de datos con el Form Wizard, lo primero que
tenemos que hacer es cargar el Form Wizard, una vez cargado el Form Wizard en la
pantalla de inicio del Form Wizard procedemos a seleccionar el tipo de formulario que
deseamos crear, para esto debemos seleccionar una de las dos opciones que se encuentran
debajo del grupo Form Options, haga clic sobre la opción Create a simple form; luego
procedemos a seleccionar el tipo de componente DataSet que deseamos utilizar, para esto
debemos seleccionar una de las dos opciones que se encuentran debajo del grupo DataSet
Options, haga clic sobre la opción Create a form using TTable objects. Haga clic sobre el
botón Next, esto traerá la siguiente pantalla:
Esta pantalla del Form Wizard nos permite seleccionar la tabla de base de datos para la cual
vamos a crear el formulario. En esta pantalla podemos ver que existen varios controles para
seleccionar la tabla:
Tenemos un Edit llamado Table Name que sirve para especificar el nombre de la
tabla de base de datos. Además este mismo Edit nos permite especificar un criterio
de búsqueda para especificar los tipos de archivos que andamos buscando cuando
las tablas la vamos a conectar vía una ruta y no un Alias.
Inmediatamente debajo del Edit Table Name tenemos una lista que muestra todas
las tablas de base de datos u objetos de base de datos dependiendo del tipo de base
de datos (Local o Cliente / Servidor) y que cumplan con los criterios de filtros. De
esta lista podemos seleccionar la tabla a la que le vamos a construir el formulario.
Es importante notar que cuando usted hace clic sobre una tabla u objeto en esta lista,
el nombre del objeto seleccionado aparece en el Edit Table Name.
Tenemos una lista llamada Directories que nos permite navegar a través de todos los
directorios del disco duro para seleccionar la ubicación de la tabla de base de datos.
Debemos mencionar que el contenido de la lista cambia de acuerdo al tipo de base
de datos, Local o Cliente / Servidor.
Un ComboBox llamado List Files of Type que muestra los tipos de archivos que se
van a desplegar en la lista de las tablas si el tipo de base de datos es Local, o los
objetos de la base de datos si es Cliente / Servidor.
Un ComboBox llamado Drive or Alias Name que sirve para seleccionar la unidad
de drive – si estamos buscando la tabla por directorios – o un alias de base de datos
– si vamos a seleccionar la tabla desde un alias.
Seleccione la tabla animals.dbf y presione el botón Next. Cabe mencionar que el botón Next
solo se activa una vez que usted ha completado las informaciones necesaria para cada
pantalla. Ahora aparece la tercera pantalla del Form Wizard que debe lucir como la
siguiente figura:
En esta ventana debemos seleccionar los campos de la tabla que deseamos que aparezcan
en el formulario. Esta ventana cuenta con dos listas: Available Fields y Ordered Selected
Fields. La primera contiene todos los campos que están en la tabla y la segunda contiene los
campos y el orden en que van a aparecer en el formulario. Aquí la idea es pasar de una lista
a otra los campos, para esto se deben utilizar los botones que se encuentran entre las dos
listas o simplemente arrastrar de una lista a otra los campos. Los botones permiten mover
los campos en la dirección de la Flecha y los que tienen dos flechas mueven todos los
campos a la vez en la dirección que indica la flecha. Debajo de la lista Ordered Selected
Fields hay dos botones, estos botones sirven para intercambiar el orden de los campos.
Transfiera todos los campos a la lista Ordered Selected Fields, la ventana debe lucir como a
continuación:
En esta ventana se debe escoger la forma como aparecerán organizados los controles en el
formulario. Las opciones que nos proporcionan son: Horizontally, Vertically e In a grid.
Horizontally esta forma permitirá que los controles aparezcan colocado uno al lado del otro.
Vertically esta forma permitirá que los controles aparezcan uno debajo del otro. Y In a grid
hará que los campos sean manipulados desde un DBGrid. Es importante mencionar que
después de la primera ventana del Form Wizard el botón Back siempre esta activo y sirve
Autor: José Uribe Página 195
Universidad del Caribe
Esta es la ultima pantalla del Form Wizard. Aquí podemos apreciar unos cuantos
parámetros:
el CheckBox Generate a main form: sirve para indicarle al Form Wizard que el
formulario que se va a crear debe ser colocado como el main form del del proyecto
– el formulario que aparece cuando se manda a ejecutar el proyecto.
Una vez seleccionado los respectivos parámetros, solo hay que presionar el botón Finish
para que el Form Wizard cree nuestro formulario. Presione el botón Finish y vea el
resultado de nuestro trabajo.
Para crear un formulario maestro / detalle de base de datos con el Form Wizard, lo primero
que tenemos que hacer es cargar el Form Wizard, una vez cargado el Form Wizard en la
pantalla de inicio del Form Wizard procedemos a seleccionar el tipo de formulario que
deseamos crear, para esto debemos seleccionar una de las dos opciones que se encuentran
debajo del grupo Form Options, haga clic sobre la opción Create a Master/Detail form;
luego procedemos a seleccionar el tipo de componente DataSet que deseamos utilizar, para
esto debemos seleccionar una de las dos opciones que se encuentran debajo del grupo
DataSet Options, haga clic sobre la opción Create a form using TTable objects. Haga clic
sobre el botón Next, esto mostrará la siguiente pantalla:
Esta pantalla del Form Wizard nos permite seleccionar la tabla de base de datos para la cual
vamos a crear el formulario. En esta pantalla podemos ver que existen varios controles para
seleccionar la tabla:
Tenemos un Edit llamado Table Name que sirve para especificar el nombre de la
tabla de base de datos. Además este mismo Edit nos permite especificar un criterio
de búsqueda para especificar los tipos de archivos que andamos buscando cuando
las tablas la vamos a conectar vía una ruta y no un Alias.
Inmediatamente debajo del Edit Table Name tenemos una lista que muestra todas
las tablas de base de datos u objetos de base de datos dependiendo del tipo de base
de datos (Local o Cliente / Servidor) y que cumplan con los criterios de filtros. De
esta lista podemos seleccionar la tabla a la que le vamos a construir el formulario.
Es importante notar que cuando usted hace clic sobre una tabla u objeto en esta lista,
el nombre del objeto seleccionado aparece en el Edit Table Name.
Tenemos una lista llamada Directories que nos permite navegar a través de todos los
directorios del disco duro para seleccionar la ubicación de la tabla de base de datos.
Debemos mencionar que el contenido de la lista cambia de acuerdo al tipo de base
de datos, Local o Cliente / Servidor.
Un ComboBox llamado List Files of Type que muestra los tipos de archivos que se
van a desplegar en la lista de las tablas si el tipo de base de datos es Local, o los
objetos de la base de datos si es Cliente / Servidor.
Un ComboBox llamado Drive or Alias Name que sirve para seleccionar la unidad
de drive – si estamos buscando la tabla por directorios – o un alias de base de datos
– si vamos a seleccionar la tabla desde un alias.
En esta pantalla seleccionaremos la tabla de base de datos que será el maestro (master) en el
formulario, seleccione la tabla orders.db y presione el botón Next. Ahora aparece la
siguiente pantalla del Form Wizard que debe lucir como la siguiente figura:
En esta ventana debemos seleccionar los campos de la tabla que deseamos que aparezcan
en la parte maestra del formulario. Esta ventana cuenta con dos listas: Available Fields y
Ordered Selected Fields. La primera contiene todos los campos que están en la tabla y la
segunda contiene los campos y el orden en que van a aparecer en el formulario. Aquí la
idea es pasar de una lista a otra los campos, para esto se deben utilizar los botones que se
encuentran entre las dos listas o simplemente arrastrar de una lista a otra los campos. Los
botones permiten mover los campos en la dirección de la Flecha y los que tienen dos
flechas mueven todos los campos a la vez en la dirección que indica la flecha. Debajo de la
lista Ordered Selected Fields hay dos botones, estos botones sirven para intercambiar el
orden de los campos. Transfiera todos los campos a la lista Ordered Selected Fields, la
ventana debe lucir como a continuación:
En esta ventana se debe escoger la forma como aparecerán organizados los controles en el
formulario. Las opciones que nos proporcionan son: Horizontally, Vertically e In a grid.
Horizontally esta forma permitirá que los controles aparezcan colocado uno al lado del otro.
Vertically esta forma permitirá que los controles aparezcan uno debajo del otro. Y In a grid
hará que los campos sean manipulados desde un DBGrid. Es importante mencionar que
después de la primera ventana del Form Wizard el botón Back siempre esta activo y sirve
Autor: José Uribe Página 201
Universidad del Caribe
En esta pantalla seleccionaremos la tabla de base de datos que será el detalle (detail) en el
formulario, seleccione la tabla items.db y presione el botón Next. Ahora aparece la
siguiente pantalla del Form Wizard que debe lucir como la siguiente figura:
En esta ventana debemos seleccionar los campos de la tabla de detalle que deseamos que
aparezcan en la parte de detalle del formulario. Esta ventana cuenta con dos listas:
Available Fields y Ordered Selected Fields. La primera contiene todos los campos que
están en la tabla y la segunda contiene los campos y el orden en que van a aparecer en el
formulario. Aquí la idea es pasar de una lista a otra los campos, para esto se deben utilizar
los botones que se encuentran entre las dos listas o simplemente arrastrar de una lista a otra
los campos. Los botones permiten mover los campos en la dirección de la Flecha y los que
tienen dos flechas mueven todos los campos a la vez en la dirección que indica la flecha.
Debajo de la lista Ordered Selected Fields hay dos botones, estos botones sirven para
intercambiar el orden de los campos. Transfiera todos los campos a la lista Ordered
Selected Fields, la ventana debe lucir como a continuación:
En esta ventana se debe escoger la forma como aparecerán organizados los controles en el
formulario. Las opciones que nos proporcionan son: Horizontally, Vertically e In a grid.
Horizontally esta forma permitirá que los controles aparezcan colocado uno al lado del otro.
Vertically esta forma permitirá que los controles aparezcan uno debajo del otro. Y In a grid
hará que los campos sean manipulados desde un DBGrid. Se debe notar que por defecto
viene seleccionado la opción In a grid, ya que la parte del detalle estará formado por uno o
mas registros, presione el botón Next para pasar a la siguiente ventana:
En esta ventana se debe establecer las relaciones entre la tabla maestra y la tabla de detalle.
El ComboBox Available Indexes ubicado en la parte superior de la ventana sirve para
seleccionar el índice por el cual se desea establecer la relación.
En la parte central de la ventana existen dos listas (Detail Fields y Master Fields) que
listan los campos por los cuales se pueden establecer relaciones, en una lista están los
campos de la tabla de detalle (Detail Fields) y en la otra (Master Fields) están los campos
de la tabla maestra. Para establecer la relación solo hay que hacer clic en el campo
correspondiente en la lista Detail Fields y Master Fields. Cuando se seleccionan los
campos a relacionar, se activa el botón Add que se encuentra entre las dos listas.
Una vez se haya presionado el botón Add los campos relacionados aparecerán en la parte
de abajo de la pantalla llamada Joined Fields, los campos aparecerán separados por ->. Si
se necesita establecer una relación por mas de un campo, solamente hay que seleccionar los
campos siguientes en la relación y presionar el botón Add estos pasos se deben estar
repitiendo hasta haber establecido la relación por todos los campos necesarios.
El Botón Delete sirve para borrar de la lista Joined Fields una relación, el botón Clear
sirve para limpiar todas las relaciones. Para terminar y aceptar los cambios realizados
presione el botón OK y para cancelar sin grabar los cambios presione el botón Cancel.
Esta es la ultima pantalla del Form Wizard. Aquí podemos apreciar unos cuantos
parámetros:
el CheckBox Generate a main form: sirve para indicarle al Form Wizard que el
formulario que se va a crear debe ser colocado como el main form del del proyecto
– el formulario que aparece cuando se manda a ejecutar el proyecto.
Una vez seleccionado los respectivos parámetros, solo hay que presionar el botón Finish
para que el Form Wizard cree nuestro formulario. Presione el botón Finish y vea el
resultado de nuestro trabajo.
El acceso a los campos de una tabla de base de datos es quizás uno de los puntos
primordiales en la construcción de aplicaciones de base de datos. La necesidad por parte de
los programadores de interactuar y manipular las columnas de una tabla sin necesidad que
el usuario tenga que editarlo en pantalla. Los componentes de campos son componentes
invisibles que son creados por Delphi en tiempo de ejecución para el manejo de las
columnas de la tabla. Los componentes de campos son descendientes del objeto Tfield o
uno de sus subclases. Por defecto cada vez que usted coloca en la aplicación un
componente DataSet y lo abre, Delphi automáticamente asigna un descendiente del objeto
Tfield para cada campo de la tabla de base de datos.
Estos componentes que Delphi crea dinámicamente, son invisibles y tienen un tipo de datos
especifico para el tipo de datos que tiene definido el campo en la tabla. Los campos que
Delphi crea son almacenados en la propiedad Fields del componente Table y Querie, esta
propiedad es un arreglo.
Este funcionamiento por defecto de crear los campos cada vez que usted abre un
componente DataSet puede ser omitido en tiempo de diseño, para lograr esto solo hay que
crear campos persistentes. Para crear campos persistentes solo hay que crearlos en el editor
de campo.
Los componentes de campos son creados a partir del objeto TField. Usted no puede crear
un componente de tipo TField, pero si existe una serie de componentes de campos que
corresponden a los tipos de campos dentro de una tabla de base de datos. A continuación
una lista de los componentes de campos:
Estos son los componentes de campos que son creados automáticamente por Delphi o que
son creados por usted en el diseñador de campos. La ventaja que existe en crearlo en
tiempo de diseño (campos persistentes) es que podemos manipular las propiedades y los
eventos de estos componentes a través del inspector de objeto. Existen otros tipos de
campos, pero estos son los mas utilizados.
El editor de campos es la herramienta que nos permite crear campos persistentes o mejor
dicho crear los campos en tiempo de diseño para omitir el funcionamiento por defecto que
tiene Delphi de crear los campos dinámicamente.
Y hacer clic con el botón de la derecha del Mouse encima del componente DataSet
y seleccionar la opción Fields Editor... del menú de acceso directo que aparece.
Para crear los campos solamente hay que hacer clic con el botón de la derecha del Mouse y
seleccionar la opción Add fields... del menú de acceso directo:
Cabe mencionar que solamente tenemos tres opciones disponibles en el menú, pues no
existe ningún campo creado en el editor de campo. Cuando seleccionamos la opción Add
fields... aparece una ventana con todos los campos del componente DataSet seleccionados:
Para crear todos los componentes de campos para todos ellos , haga clic en el botón OK.
Cuando usted desee dejar sin crear algún campo, utilice la combinación Ctrl. + clic del
Mouse para desmarcarlo, y esto evitara que sea creado. Una vez que los campos han sido
agregados el editor de campos luce como la siguiente figura:
Ahora podemos cambiar las propiedades y programar los eventos de los campos creados.
Se puede notar en la figura anterior que el campo seleccionado en el editor de campos, es el
componente que aparece seleccionado en el inspector de objeto.
Propiedad Descripción
Currency Esta propiedad es utilizada para controlar los valores de los campos
tipo TBCDField, TcurrencyField y TFloatField, cuando las
propiedades DisplayFormat y EditFormat no tienen ningún valor.
DisplayFormat Sirve para asignar una mascarilla. Esta mascarilla es utilizada
solamente para desplegar los datos.
DisplayLabel Permite cambiar el titulo de encabezado que es desplegado en la
columna del componente DBGrid.
DisplayWidth Permite cambiar la cantidad de caracteres que será desplegada para
el campo.
EditMask Sirve para asignar una mascarilla. Esta mascarilla es utilizada para
editar los datos.
ReadOnly Permite especificar si el campo será solo lectura o no
Required Esta propiedad sirve para controlar si el campo debe tener valor o
no.
Visible Permite desplegar o no un campo.
Como se puede notar los componentes TField solamente constan con cuatros eventos:
Evento Descripción
OnChange Este evento se dispara inmediatamente los datos han sido
introducido en el buffer del registro.
OnGetText Este evento se ejecuta cada vez que la propiedad DisplayText o Text
del campo son referenciada.
OnSetText Este evento se ejecuta cuando se le asigna un valor a la propiedad
Text del campo.
OnValidate Sirve para validar los datos que se introducen en el campo.
Una de las tareas mas comunes que debe acompañar la creación de formularios para entrada
de datos es determinar como se quiere formatear la información. Para modificar la forma
como la información es capturada se debe utilizar la propiedad EditMask para los datos tipo
String. Este método permite insertar caracteres que se convertirán en parte del campo, por
Ejemplo: guiones o paréntesis que son definidos como caracteres literales dentro de la
mascarilla, aparecerán como parte de los datos del campo en la tabla.
La ventana Input Mask Editor presenta una serie de mascarilla de ejemplo en la parte
derecha de la ventana. Para utilizar una de estas mascarillas, solamente hay que hacer
doble-clic sobre ella. La mascarilla puede ser probada para ver como trabaja en el cuadro
Test Input. Después de haber definido su mascarilla, usted puede introducir cadenas de
caracteres de prueba para ver si la mascarilla formatea el texto correctamente. El botón
Masks permite cargar archivos de mascarillas de otros países.
Existen varias formas para acceder a un campo por código de programación, entre la que
mencionaremos:
4. La propiedad Fields del componente DataSet, que permite acceder a un campo por
el orden en la tabla de base de datos y donde el primer campo de la tabla es el
elemento 0, por ejemplo:
Table1.Fields[0].Value;
Table1.FieldByName(‘NUMERO’).Value;
NombredelcomponentedatasetNombredelCampo
Por Ejemplo:
el siguiente código:
Table1NUMERO.Value;
Cabe comentar aquí que las dos primeras formas funcionan con campos dinámicos como
con campos persistente, pero que el ultimo formato solamente funciona con campos
persistente.
8. Para crear un campo calculado cargue el editor de campo y haga clic con el botón de
la derecha del Mouse y seleccione la opción New field... del menú de acceso
directo. Esto ocasionará que aparezca la ventana New Field:
9. Introduzca el nombre del campo en el edit box Name, este nombre debe ser
diferente de los que existen en la tabla de base de datos.
11. Introduzca el tamaño del campo en el edit box Size, si aplica. El tamaño del campo
solamente aplica a campos de tipo: TstringField, TbytesField y TVarBytesField.
13. Haga clic en el botón OK. El nuevo campo calculado es agregado al final de la lista
de campos del editor de campos.
14. Programe el evento OnCalcFields del componente DataSet para calcular el valor del
campo calculado.
Nota: los campos calculados solamente se le puede asignar valor en el evento OnCalcFields
y el evento OnCalcField se programa en el componente DataSet donde se creó el campo
calculado.
9. Para crear un campo lookup cargue el editor de campo y haga clic con el botón de la
derecha del Mouse y seleccione la opción New field... del menú de acceso directo.
Esto ocasionará que aparezca la ventana New Field vista anteriormente
11. Introduzca el tamaño del campo en el edit box Size, si aplica. El tamaño del campo
solamente aplica a campos de tipo: TstringField, TbytesField y TVarBytesField.
12. Seleccione la opción Lookup en el radio group Field type. Cuando usted selecciona
la opción Lookup se habilitan los combobox DataSet y Key Fields.
14. Seleccione de la lista Key Fields el campo al cual se le va a asignar el valor. Para
asignarle valor a mas de un campo, digítelo directamente, pues no podrá
seleccionarlo de la lista, cuando son varios campos deben estar separados por punto
y coma “;”. Cuando se utilicen mas de un campo, se deben utilizar campos
persistentes.
En esta practica vamos a crear un campo calculado para desplegar el nombre y apellido del
cliente.
Cree un formulario Maestro / Detalle con las tablas Factura y Detalle que fueron creadas
en el capitulo del Database DeskTop. El formulario debería lucir de la siguiente forma:
Coloque un DBEdit al lado del DBEdit de cliente y conéctelo con el DataSource de factura
y con el campo calculado que creamos (NOMBRE_CLIENTE). A continuación un vistazo
a nuestro formulario:
En esta practica vamos a utilizar el evento OnValidate para validar que un usuario no
digite dos veces el mismo código.
Cree un formulario simple con la tabla CLIENTE que fue creada en el capitulo del
Database DeskTop. El formulario debería lucir de la siguiente forma:
Cargue el editor de campos y agregue todos los campos sino están agregados, seleccione el
campo CLIENTE y vaya al inspector de objeto y seleccione la pagina Events. Seleccione el
evento OnValidate y haga doble clic en la parte derecha, esto hará que aparezca el editor
de código, escriba el siguiente código:
En la figura anterior podemos ver un formulario con un componente QuickRep y este con
un componente QRBand en el. El componente QRBand representa las diferentes secciones
de un reporte, este componente tiene una propiedad BandType que especifica banda el
lugar y la frecuencia de impresión del mismo. El componente QRBand puede ser colocado
desde la paleta de componente o con la ventana de configuración de QuickReport. Cuando
se coloca un componente QRBand, el valor por defecto de la propiedad BandType es
rbTitle. Este tipo de banda se imprimirá solamente una vez al inicio del reporte.
Tipos de bandas
Tipo Ubicación
rbChild
rbColumnHeader Se imprime una vez por pagina y encima de cada columna del reporte.
rbDetail Se imprime una vez por cada registro del componente DataSet
rbGroupFooter Se imprime cada vez que el dato de la expresión cambia. Se imprime
debajo de la banda de detalle.
rbGroupHeader Se imprime cada vez que el dato de la expresión cambia. Se imprime
encima de la banda de detalle.
rbOverlay Una vez por página.
rbPageFooter Se imprime una vez en la parte inferior de la página.
Autor: José Uribe Página 224
Universidad del Caribe
Ventana de Configuración
Para llamar la ventana Report Settings de QuickReport solamente hay que hacer clic con el
botón de la derecha del mouse encima del componente QuickRep y seleccionar la opción
Report Settings del menú que aparece. Otra forma para llamar la ventana Report Settings
es haciendo doble clic sobre el componente QuickRep. Sea cual fuere la forma que usted
utilice para llamarla, la ventana Report Settings debe lucir como la figura siguiente:
En esta ventana se puede ajustar el tamaño del papel (Paper size), los margenes de la pagina
(Margins), el tipo de letra (Other), si la pagina va a tener un marco (Page frame) y lo mas
importante las bandas que va a tener el reporte(Bands). Como se puede apreciar la ventana
es bien facil de utilizar y como dijimos anteriormente, con unos cuantos clic podemos
definir nuestros reportes.
Nota: es muy importante mencionar que cualquiera de los métodos de llamar la ventana
Report Settings debe ser utilizado sobre el componente QuickRep, ya que si por
equivocación se selecciona el área de una banda, el resultado no será el esperado.
En este capitulo vamos a crear un reporte de clientes con la tabla Customer, el reporte
contendrá las siguientes columnas: Nombre, Dirección, Ciudad y Pais para los campos:
Company, Addr1, City y Country. Lo primero que vamos a necesitar es crear un nuevo
proyecto y formulario y agregar un componente QuickRep en él.
Normalmente las informaciones son almacenadas en archivos o base de datos. Sea cual
Autor: José Uribe Página 226
Universidad del Caribe
fuere el lugar donde se guardan las informaciones, al momento de crear nuestro reporte con
QuickReport, debemos decirle de donde el va a sacar los datos para generar el reporte.
Para especificar la fuente de los datos del reporte utilizaremos los componentes DataSet,
con los cuales ya usted esta familiarizado y que sirven para acceder a la información de la
base de datos vía el BDE. Al igual que con los formularios, el componente DataSet puede
residir localmente en el formulario o en un DataModule.
El próximo paso consiste en decirle a QuickReport desde donde va a obtener los datos, esto
lo haremos utilizando la propiedad DataSet del componente QuickRep. Seleccione el
componente QuickRep y en la propiedad DataSet seleccione el componente Table
respectivamente. Ahora nuestro reporte debe parecerse a la siguiente figura:
El paso siguiente para la creación de nuestro reporte es poner los letreros y encabezados de
nuestro reporte. En el grupo de componentes de QuickReport se encuentra un componente
llamado QRLabel. Este componente sirve para poner letreros o informaciones fijas en
nuestro reporte. El funcionamiento de este componente es parecido al componente Label,
Autor: José Uribe Página 227
Universidad del Caribe
con la ligera diferencia que el Label no puede ser utilizado con QuickReport. Para utilizar
el componente QRLabel solamente hay que seleccionarlo y colocarlo en la banda deseada.
Para nuestro ejemplo vamos a crear cuatro columnas de encabezados utilizando el
componente QRLabel y lo vamos a colocar en banda ColumnHeader. Les pondremos de
nombre: QRLabelNombre, QRLabelDireccion, QRLabelCiudad, QRLabelPais
respectivamente. Y en la propiedad Caption le pondremos: Nombre, Dirección, Ciudad,
País respectivamente. Nuestro reporta ahora debe lucir como la figura siguiente:
Después de haber terminado de construir los encabezados, el paso siguiente es colocar los
datos del reporte. Para colocar los datos de la base de datos en el reporte se utilizan los
componentes QRDB de QuickReport. estos componentes no son mas que todos los
comoponentes que comienzan con estas siglas y que denotan que son componentes de
QuickReport para base de datos. El componente que utilizaremos en nuestro ejemplo es el
QRDBText. Este componente sirve para mostrar información proveniente de la base de
datos, este componente tiene dos propiedades que sirven para conectarlo con la tabla de
base de datos y con el campo, esta propiedades son: DataSet y DataField respectivamente.
Para crear un componente QRDBText solamente haga clic en la paleta de componente y
colóquelo en la banda deseada del reporte. Para nuestro caso, crearemos cinco QRDBText
en la banda de detalle. Estos objetos corresponden a los QRLabel creados anteriormente en
la banda ColumnHeader y deben ir alineados con ellos.
Conecte los componentes QRDBText con el componente Table vía la propiedad DataSet
del componente QRDBText. Una vez se ha conectado el componente QRDBText con el
componente DataSet, se puede conectar el mismo con el campo de la tabla de base de datos
vía la propiedad DataField. Para conectar el componente QRDBText con el campo
solamente hay que seleccionar el campo de la lista de campos de la propiedad DataField.
Conecte los componentes QRDBText con los campos Company, Addr1, City y Country
respectivamente.
Vamos ahora a colocar un encabezado con el nombre del reporte y el numero de pagina en
la banda PageHeader. Coloque un componente QRLabel en la banda PageHeader y en la
propiedad Caption del QRLabel escriba “Reporte de Clientes”, centralice el letrero al
centro de la venta. Ahora vamos a colocar el numero de pagina del reporte, para colocar el
numero de pagina en el encabezado, necesitaremos un componente QRSysData: este
componente sirve para poner informaciones del sistema en el reporte. Coloque un
componente QRSysData en la esquina superior derecha de la banda PageHeader. Ahora en
la propiedad Data del componente QRSysdata seleccione el valor qrsPageNumber y en la
propiedad Text del mismo introduzca “Numero de Página: ”, este será el letrero que
aparecerá antes del numero de página. Nuestro reporte debe lucir ahora como la figura a
continuación:
Vamos a ver como luce nuestro reporte, pero primero debemos activar la tabla para que los
datos estén disponibles. Seleccione la tabla y en la propiedad Active de la tabla seleccione
el valor True, ahora haga clic con el botón de la derecha del mouse encima del componente
Autor: José Uribe Página 229
Universidad del Caribe
QuickRep y seleccione la opción Preview del menú de acceso directo o bien llame la
ventana Report Settings y haga clic sobre el botón preview.
Los campos de totales se construyen en la banda de total (rbSummary), por lo tanto cada
vez que deseemos calcular totales en nuestro reporte debemos agregar una banda de este
tipo. El próximo paso a seguir es crear el campo de total. En la página Qreport de la paleta
de componente hay un componente llamado QRExpr. Este componente sirve para crear
campos calculados.
Bibliografía
Joyanes, Luis: Borland Delphi Iniciación y Referencia, McGraw Hill,
México, 2da Edición,1998