
Una de las tareas que más se repiten cuando nos encontramos desarrollando es el llenado de componentes TComboBox con información proveniente de un campo en específico en una tabla. Esta tarea podemos simplificarla creando un componente ComboBox que cargue la información requerida. Con Delphi esta tarea es sumamente sencilla pues además de poder diseñar visualmente el componente usando la herramienta de modelado que integra, nos ahorra trabajo al generar el código de la clase diseñada. Entonces, con este requerimiento podemos establecer que vamos a crear un componente tipo combobox al que le asignemos un objeto TAdoConnection y a la indicación de tabla y campo, debe ser responsable de cargar la información en su lista de valores para mostrarla al usuario. Con esto en mente comencemos…
Importante: Para este artículo he usado Delphi 2010 pero lo que veremos es aplicable a todas las versiones Delphi 2005 en adelante.
Para iniciar ejecutaremos Delphi, después daremos click en File / New / Package Delphi. Los paquetes en Delphi nos permiten agrupar en un solo binario tanto forms, unidades, componentes, etc. Es en un modo general como una DLL pero con algunas ventajas sobre ellas. Una vez que hemos creado el Package, vamos a guardar nuestro proyecto. File / Save All e indicaremos como nombre del proyecto: “PkgDaDbCombo.dproj”. Aquí, como comentario adicional me gustaría mencionar que es importante establecer un estándar al nombrar nuestros proyectos, unidades, formularios, etc. Esto con la finalidad de mantener un orden de los mismos y además, facilitar a nuevos programadores la integración a nuestro código. En este caso usaremos el prefijo PKG seguido del nombre de nuestro proyecto para indicar que se trata de un Package.
Así es como se vería nuestro proyecto una vez que lo hemos creado y guardado en el disco. En la parte inferior del panel del Project manager
En la base de la ventana de nuestro panel “Project Manager” tenemos tres pestañas, la primera que tiene como caption el nombre de nuestro proyecto, la segunda que dice “Model View” y una tercera que lleva como caption “Data Explorer”. Daremos click en la pestaña “Model view” y al hacerlo Delphi nos mostrará el mensaje:
Esto lo hace Delphi para saber si en verdad deseamos habilitar la herramienta de modelado. Le diremos que sí y a continuación la pestaña de modelado se activará mostrándonos el árbol del proyecto. Ahora, seleccionaremos la rama del proyecto “PkgDaDbCombo” y daremos click con el botón derecho. En el menú que nos aparecerá vamos a seleccionar “Open Diagram”. La apertura del diagrama nos mostrará la pantalla de modelado.
Ya tenemos habilitado el soporte para modelar nuestros objetos. Ahora vamos a crear nuestra clase destinada al componente que necesitamos. Seleccionamos en Delphi ” File / New / Other ” y en la ventana que se nos mostrará las opciones “Delphi files / Component “.
En este momento se nos abrirá un asistente donde como primer paso nos pide seleccionar el ancestro de nuestro nuevo componente. Para este caso, el componente debe heredar a TComboBox. Así que buscamos esta clase la seleccionamos y presionamos Next.
En esta nueva pantalla del asistente vamos a establecer el nombre de la Clase de nuestro componente, su ubicación en la paleta y dónde será grabada esta unidad. Así definiremos nuestro componente:
- Class name: TDaDbCombo
- Palete Page: DelphiAccess
- Unit name: DaDbComboBox.pas
Establecidos estos valores daremos click en “Finish” para terminar con el asistente y generar el código base de nuestro componente y además el diagrama de clases de nuestra clase DaDbComboBox, como veremos en la siguiente imagen:
Delphi nos permite comenzar a editar nuestra clase desde el diagrama de clases o hacerlo desde el “Model view”. Ambos son totalmente válidos y su uso dependerá del programador. En este caso lo haremos desde el Model View. Para ello agregaremos la primera propiedad de nuestra clase: “Connection” esta propiedad está destinada a recibir como valor un objeto TAdoConnection. Entonces seleccionaremos la clase TDaDbCombo, daremos click con el botón derecho sobre ella y en el menú que nos aparece seleccionaremos “Add / Field ” este será el atributo Connection cuya finalidad será establecer la referencia al Objeto TadoConnection responsable con las comunicaciones con la base de datos. Una vez creado en el inspector de objetos definiremos los siguientes valores para el atributo:
- Name: FConnection
- Type: TAdoConnection
- Visibility: strict private
Agregaremos dos atributos más, FTableName y FFieldName estos dos tendrán como valores:
- Type: String
- Visibility: strict private
Una vez creados los atributos vamos a crear las propiedades responsables de establecer el valor de los mismos seleccionamos nuestra clase y despés de dar click con el botón derecho del mouse seleccionaremos del menú “Add / Property” . A esta propiedad le daremos como nombre “Connection”. Luego en el inspector de objetos vamos a establecer las siguientes propiedades:
- Visibility: published
- Type: TAdoConnection
Despúes agregaremos dos nuevas propiedades TableName y FieldName que compartiran la misma configuración:
- Visibility: published
- Type: String
Ahora como último paso vamos a crear el método responsable de la carga de los datos en nuestro Combobox. Seleccionamos nuevamente nuestra clase TdaDbCombo y daremos click derecho y seleccionaremos “add / Procedure” y lo vamos a configurar de la siguiente manera:
- Name: Fill
- Visibility: public
Hecho todo lo anterior daremos doble click en la rama TDaDbCombo de nuestro modelo para ver el código generado hasta este momento. Como podemos ver en la imagen siguiente, Delphi ha generado todo el código de acuerdo a nuestro diagrama de clase. Esta herramienta es sumamente útil pues además de permitirnos modelar nuestras clases, nos ahorra el trabajo de escribir todo el código respectivo.
Ya que hemos terminado de modelar nuestra clase. Comenzaremos a agregar todo el código necesario para darle la funcionalidad deseada:
type TDaDbCombo = class(TComboBox) private { Private declarations } protected { Protected declarations } public { Public declarations } published strict private function GetConnection: TAdoConnection; procedure SetConnection(val: TAdoConnection); published property Connection: TAdoConnection read GetConnection write SetConnection; strict private var /// <author>Edgar</author> FConnection: TAdoConnection; public procedure Fill; strict private var FTableName: String; strict private FFieldName: String; function GetTableName: String; procedure SetTableName(val: String); published /// <associates> /// </associates> property TableName: String read GetTableName write SetTableName; strict private function GetFieldName: String; procedure SetFieldName(val: String); published property FieldName: String read GetFieldName write SetFieldName; end;
Ya que hemos dado toda la funcionalidad al componente, guardamos todos los cambios, seleccionamos la pestaña “Project manager” y allí seleccionamos nuestro paquete PkgDaDbCombo y damos click con el botón derecho del mouse y en el menú contextual seleccionamos “Compile”, después de finalizada la compilación repetimos la acción pero ahora seleccionamos “Install”. Hecho lo anterior nos aparecerá el siguiente mensaje:
Ahora, tendremos un nuevo bloque de componentes llamado DelphiAccess, en este aparecerá nuestro TDaDbCombo y podremos usarlo en nuestros proyectos.
Su uso es muy sencillo. Creamos un nuevo proyecto Vcl Forms, y en el formulario principal colocaremos un TAdoConnection y un TDaDbCombo. En el TadoConnection configuramos la cadena de conexión para establecer comunicación con el motor de base de datos de nuestra elección. Hecho esto seleccionamos nuestro DaDbcombo y en el inspector de objetos seleccionamos en su propiedad conecction al componete Ado Connection, después en sus propiedades TableName y FieldName definiremos tanto la tabla como el campo que deseamos cargar.
Por último, colocamos un botón y en su evento Onclick escribiremos el código DaDbCombo1.Fill; y eso es todo, así de siempre ahora nuestros controles dbcombo cargaran las listas de valores que requerimos en nuestras aplicaciones. Esta es una pantalla de como quedaría el componente ya funcionando:
El código completo, tanto del componente como del proyecto de prueba podrán encontrarlo en la zona de descargas del foro delphi access: Código fuente
Me ha gustado tu tutorial, muy bien explicado amigo, nunca he usado el Model View, yo a la antigua, escribiendo directamente en la unidad 🙂
Voy a hacer un ejercicio con el Model View 🙂
Saludos
Gracias amigo. 🙂 Me alegra saber que este artículo ha sido de utilidad.
Excelente tuto !!! Nunca había creado un componente pero a partir de ésta explicación se me ocurren un montón de componentes que me facilitarían mucho la vida… 😉
Efectivamente, en delphi es muy sencillo crear componentes que nos permitiran aplicar una de las máximas de la programación orientada a Objetos: Encapsulación y Reutilización de código
Gracias por el tutorial. La verdad, no había usado nunca el model view (yo, a la brava, como hacía Eliseo) y veo que es más sencillo de lo que me imaginaba.
Por otro lado, es un placer ver que estas de vuelta en los blogs.
Saludos
Si amigo, uasr el model view nos permite diseñar de manera más sencilla nuestras clases además de que al generarnos el código respectivo nos ahorra mucho trabajo a la hora de codificar…. Un saludo