Curso de C++ Builder


Acceso a bases de datos

Un ejemplo completo



Database Desktop

Es una herramienta incluida en los entornos de desarrollo de Borland/Inprise (Delphi, C++Builder y JBuilder) que permite crear, visualizar, consultar y ordenar tablas almacenadas en distintos formatos (como Paradox o dBase).

Visualización de tablas

Visualizar el contenido de las tablas BCDEMOS:holdings.dbf (en formato dBase) y BCDEMOS:vendors.db (en formato Paradox).

Creación de tablas

Crear una tabla Paradox llamada AGENDA.DB con los siguientes campos:

BDE Administrator

Panel de control de Windows

Es la utilidad que permite gestionar los alias del motor de bases de datos de Borland.

Creación de alias

Creamos un nuevo alias de tipo STANDARD (el usado para tablas Paradox y dBase) y lo denominamos AGENDA. En su propiedad PATH ponemos la ruta al directorio donde hemos almacenado anteriormente la tabla AGENDA.DB.

NOTA: La creación de alias la prodríamos haber realizado desde la opción Alias Manager del Database Desktop e incluso desde el código de nuestra aplicación.

C++Builder

Desarrollo de la aplicación

Creamos un proyecto llamado Agenda y su formulario principal lo guardamos con el nombre FormAgenda.

Creamos un módulo de datos que contendrá un componente TTable denominado TableAgenda con su TDataSource asociado (dsAgenda). Tenemos que establecer las propiedades DatabaseName y TableName del componente TTable, así como la propiedad DataSet del TDataSource. Al módulo de datos lo llamamos dmAgenda y la unidad correspondiente la guardamos como DataAgenda.

Con el "Fields Editor" del menú contextual de TableAgenda creamos los cinco componentes TField correspondientes a las cinco columnas de nuestra tabla.

Añadimos al formulario principal los componentes necesarios para poder manejar nuestra agenda. Para que los componentes del módulo de datos sean visibles desde el formulario hemos de añadir el #include correspondiente en el fichero .cpp del formulario. En la propiedad DataSource de todos los componentes data-aware seleccionaremos dmAgenda->dsAgenda.

Hemos de llamar al método Open de nuestra tabla cuando se produce el evento OnActivate del formulario. De la misma forma interceptamos el evento OnDeactivate del formulario e invocamos al método Close de la tabla. Esto es equivalente a mantener la propiedad Active del conjunto de datos a true (aunque es preferible porque no tiene sentido mantener conexiones abiertas cuando no se están utilizando).

Para introducir fotos en nuestra base de datos podemos utilizar el componente OpenPictureDialog, un botón que lo llame y el método LoadFromFile de TGraphicField. También podemos utilizar el portapapeles de Windows para poner la imagen.

NOTA: El conjunto de datos debe estar en modo edición para poder establecer el valor de la imagen.

Para evitar que los mensajes asociados al TDBNavigator aparezcan en inglés debemos interceptar el evento BeforeAction de este componente. Así mismo, podemos traducir las pistas asociadas a los distintos botones del TDBNavigator (propiedad Hints) y permitir su visualización (ShowHints).

Sería aconsejable establecer las validaciones oportunas a nivel de campos para que se sólo se puedan introducir direcciones de correo electrónico válidas. Así mismo, deberíamos tratar mejor la introducción de fechas (para lo cual lo ideal es crear un componente derivado de TDateTimePicker).

Para permitir búsquedas en nuestro conjunto de datos podemos utilizar filtros

NOTA: Se podría crear un cuadro de diálogo genérico que nos permita realizar búsquedas sobre cualquier conjunto de datos. Para ello, nuestro diálogo TDBDlgSearch debería tener una propiedad DataSet (definida utilizando la palabra reservada __property) así como métodos que permitan realizar la búsqueda (vg: find, findNext y findPrior), los cuales devolverán un valor booleano según la búsqueda se haya realizado con éxito o no.

También podríamos permitir la impresión de fichas con los datos de nuestra tabla. Para ello tendríamos que utilizar un TQuickReport o acceder directamente al canvas de la impresora (TPrinter).

Finalmente, una vez que tengamos nuestra aplicación terminada, podríamos distribuirla generando un programa de instalación con, por ejemplo, el InstallShield Express for C++Builder...


Índice de la sección