Crear un componente DbCombo con Delphi

 

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 

 

6 Comments

  1. 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

  2. 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… 😉

  3. 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

Deja un comentario