|
Hay muchos objetos en la barra de componentes de Delphi. Todos estos objetos están escritos en Object Pascal, y en conjunto forman la librería VCL.
Un componente es un objeto que "sabe" como comportarse en modo de diseño, y puede ser añadido a una forma. Todos los objetos de la barra de componentes de Delphi heredan directa o indirectamente de TComponent, que es de donde heredan su comportamiento en tiempo de diseño, y sus capacidades de añadirse a y grabar su estado en el archivo de Forma (dfm).
Como Delphi es completamente orientado a objetos, usted puede heredar un objeto que se comporta exactamente como el objeto del cual heredó. Este concepto es lo que hace tan sencillo el extender la barra de herramientas de Delphi para nuestros requerimientos.
La programación de componentes es muy distinta a la programación de aplicaciones. Cuando usted programa aplicaciones, usted sólo se debe de preocupar por la manera en que su objeto se debe de comportar durante la aplicación. Pero cuando usted programa un componente, usted debe de tomar en cuenta la manera en que su componente se comportará en tiempo de diseño también.
Delphi no es tramposo, y utiliza una versión compilada de su componente para mostrar el componente en tiempo de diseño. Esto quiere decir que cada vez que usted añada una propiedad publica al componente, debe usted asegurarse de que esta propiedad también funcione en tiempo de diseño, o que al menos su componente pueda distinguir si está en tiempo de diseño para que el desarrollador que está añadiendo el componente no obtenga errores extraños al tratar de usar su creación.
Como Delphi está corriendo su código cuando usted crea un componente, usted puede añadir menús, editores especiales y muchas cosas más como ayudas de diseño para el usuario (que en este caso es el desarrollador que tiene Delphi y está creando un programa haciendo su componente.
La tecnología de paquetes es parte integral de la habilidad que tiene Delphi para extender sus capacidades usando componentes y ayudas de desarrollo. Usted también puede utilizar la misma tecnología para extender sus propios programas.
Todos los componentes viven en un paquete. Un paquete es una clase de DLL especial que tiene funciones para pasar tipos de datos especiales (los DLLs, en su forma nativa, sólo pueden pasar cadenas de texto, números y punteros). Los paquetes de Delphi son integrales para el diseño de componentes, porque cuando un componente está en modo de diseño Delphi utiliza la librería de paquetes para cargarlo en memoria.
Usted puede Activar y Desactivar paquetes con el menú de "Project-Install Packages" en Delphi. Además, cuando usted abre un proyecto, el proyecto recuerda los paquetes que usted estaba utilizando y los activa, para asegurarse de que todos los componentes estén funcionando cuando usted despliegue la forma.
Usted puede crear sus propios paquetes en Delphi. Un archivo fuente de cabecera de un paquete tiene la extension .dpk. Un paquete compilado tiene la extension .dpl.
La extensión .DPL de los paquetes es únicamente para que Delphi los diferencíe de un DLL. Si usted cambia la extensión a DLL podrá abrirlo con quick view o cualquier programa de desarrollo que pueda mostrar las funciones exportadas de un DLL (aquí nomás curioseando). Cambie la extensión de nuevo a .DPL para utilizarlo en Delphi.
Por sí solo, un TComponent no puede hacer nada más que exportar las propiedades de su sección "published" en formato DFM, y mostrar una cajita en la forma que no se muestra en modo de ejecución (esto es, un componente no visual). Así que rara vez querrá usted crear un componente "desde cero". Lo que usted probablemente hará es extender un componente existente, o al menos utilizar algunos de los descendientes abstractos directos de TComponent para crear su propio componente.
Para escribir componentes, dos cosas le serán de extrema utilidad:
Es por esto que todas las versiones de Delphi en vez de la estándar vienen con el código fuente de la librería de componentes. A veces, cuando heredamos componentes, es importante asomarnos a ver cómo los programadores de Borland escribieron métodos específicos, para saber si podemos reutilizar este código o si necesitamos hacer override al código existente (o en la mayoría de los casos, alguna combinación de ambos).
Un componente es muy, muy parecido a una clase, pero escribir un componente debe tomar en cuenta las siguientes reglas:
Cuando usted crea un componente y desea que su propiedad sea parte del inspector de objetos, usted deberá declararlas en la sección published de su componente. Las propiedades de la sección published son mostradas en el inspector de objetos y son grabadas en el archivo DFM.
Para crear un componente, es obligatorio hacer métodos GetXXX y SetXXX para cambiar un miembro.
Por ejemplo, considere el código siguiente:
private procedure SetVariable( Value : String ); function GetVariable: String; protected FVariable : String; published property Variable : String read GetVariable write SetVariable; |
Esta es la manera correcta de cambiar una propiedad en un componente. Su variable FVariable está "protegida", esto es, sólo la clase y sus descendientes pueden accesarla. La propiedad Variable es de tipo String y se puede leer y modificar con los métodos GetVariable y SetVariable, respectivamente. La versión protegida de su variable puede tener cualquier nombre, pero el estilo típico en Delphi es añadir una letra "F" antes de la variable.
Esto se hace así para permitirle a usted hacer tareas automáticas, como inabilitar el control cuando la variable tiene un valor específico, o cambiar el color de un control automáticamente cuando el valor de una propiedad cambia. En este ejemplo, el color del control cambia a verde cuando la propiedad Variable tiene la cadena "Hola Chavos".
Para que se muestre en la paleta de objetos, su componente debe haber sido registrado con anterioridad. Cuando usamos el Wizard de creación de componente, Delphi registra el componente automáticamente añadiendo el siguiente procedimiento a su código:
procedure Register; begin RegisterComponents('Samples', [TSuComponente]); end; |