<-- Capítulo

Índice del tutor de Delphi
© Copyright 1998,99
por David Martínez.

Todos los derechos reservados

Capítulo -->

Capítulo 7.1. Dos modos fáciles de escribir un componente

Ahora veamos cómo podemos escribir un componente para que otros desarrolladores puedan utilizarlo. En este ejemplo, usted creará un paquete con dos componentes sencillos, uno visual y otro no visual.

La creación de componentes bajo Delphi es totalmente independiente de la creación de una aplicación, pero yo siempre creo una aplicación vacía de prueba para poder poner mi componente en la forma y probarlo en tiempo de diseño al mismo tiempo que lo modifico. Así que simplemente comience Delphi con un proyecto nuevo.

Nuestro primer componente es un Label que dice "Buenos Días" en varios idiomas.

Cuando hagamos nuestro componente, necesitaremos crear un paquete. Muchos programadores mantienen dos paquetes de componentes; el de "prueba", donde preparan sus componentes prototipo y los mejoran, y el "real", que es el que utilizan para integrar sus aplicaciones. Pero como mínimo, usted necesitará al menos un paquete para sus componentes, así que crearemos uno primero.

Desde el menú de Delphi, seleccione "File-New" y haga click en el ícono de "Package". A continuación podrá ver el Editor de paquetes.

Grabe este paquete como "Tutor". A continuación, seleccione "Component-New Component" (también puede usar "File-New" y seleccionar "Component"). A continuación podrá ver el wizard de creación de Componentes.

Cuando usted crea componentes, el tipo de ancestro es una de las cosas más importantes y más difíciles de determinar, especialmente si usted quiere hacer un componente totalmente nuevo. Es muy importante conocer la jerarquía del VCL y qué componentes proveen qué servicios para saber de qué componente es más conveniente heredar.

Por ejemplo, usted puede hacer su propio ComboBox, pero si el componente que usted quiere hacer difiere mucho de TComboBox, podría ser más recomendable heredar de TCustomComboBox, que provee los primitivos de un ComboBox pero mantiene muchas propiedades privadas.

Ahora presione el botón "Install..." para decirle a Delphi que queremos añadirlo a un paquete. Seleccione "existing package" (pudo haber creado un paquete nuevo desde aquí tambien utilizando "Into New Package"), y seleccione nuestro Tutor.dpk.

A continuación verá un mensaje diciendole que el paquete va a ser construido y después instalado. Seleccione "Yes" y el compilador de Delphi se pondrá a trabajar. Una vez hecho esto, Delphi nos dice que el paquete "Tutor.dpk" ha sido instalado y usted tiene un nuevo componente llamado THolaLabel.

Note que ahora hay una página "Tutor Delphi" en su paleta de componentes, con un componente THolaLabel en ella.

Ahora podemos comenzar a escribir código. Nuestro "proyecto" es ahora el archivo DPK, así que para compilar simplemente utilizamos el Botón Compile de la ventana del Paquete.

Nuestro componente va a saludar en varios idiomas, así que comencemos por definir los idiomas en que va a saludar. La mejor manera de hacer esto es el definir un tipo. Lo llamaré idiomas, y va a contener todos los idiomas posibles para mi componente. Como habrá una propiedad de este tipo, lo debemos definir antes que el componente:


type
  TIdioma = ( idEspanol, idIngles, idFrances,
                  idItaliano, idAleman );
  THolaLabel = class(TLabel)

Ahora que tenemos un tipo que nos será útil para definir los idiomas, necesitamos una variable y funciones set y get para guardar qué idioma vamos a usar.

  private
    { Private declarations }
    FIdioma : TIdioma;
    procedure SetIdioma( Valor : TIdioma );
    function GetIdioma : TIdioma;

Por supuesto, no basta con definir las funciones; también debemos escribirlas:

function THolaLabel.GetIdioma : TIdioma;
begin
  Result := FIdioma;
end;

procedure THolaLabel.SetIdioma( Valor : TIdioma );
var
  sMensaje : String;
begin

  FIdioma := Valor;
  case FIdioma of  // Dependiendo del idioma es el mensaje.
    idEspanol  : sMensaje := 'Buenos Días!';
    idIngles   : sMensaje := 'Good Morning!';
    idFrances  : sMensaje := 'Bonjour!';
    idItaliano : sMensaje := 'Bonjorno';
    idAleman   : sMensaje := 'Gutten Mörgen!';
  end;
  Self.Text := sMensaje;  // Reemplaza nuestro texto con el mensaje

end;

Note que la funcion SetIdioma no sólo guarda el idioma, sino cambia el texto del Label (self) de acuerdo al idioma que el usuario seleccionó. Esto nos permite que el Label muestre el cambio de inmediato al cambiar mi propiedad, incluso en modo de diseño!

Por último mi propiedad, curiosamente, se llamará "Idioma". Quiero que sea publicada en el inspector de objetos, así que la pongo en la sección de "published", para que se anuncie y se grabe con la forma en tiempo de diseño.

  published
    { Published declarations }
    property Idioma : TIdioma read GetIdioma write SetIdioma;

Felicidades! Acaba usted de hacer su propio componente. No fué difícil, verdad? Por cierto, el concepto de JavaBeans en Java es casi idéntico a la creacion de componentes en Delphi (y no por casualidad; Borland está en la mesa directiva del consorcio de estándares de Java).

Ahora necesitamos probarlo, por supuesto. Como ya está instalado, sólo tenemos que recompilar el paquete. Vaya a la ventana de "Tutor.dpk" y presione el botón "Compile".

En el caso especial de los paquetes, los controles normales de compilación (Control-F9, etc) no funcionan, porque compilan el proyecto, no el paquete. Usted debe usar el botón de compilar dentro de la ventana del paquete.

A continuación, vaya a la página "Tutor Delphi" en la paleta, muestre la forma principal de su proyecto y ponga un THolaLabel en el mismo. En el inspector de objetos, busque la propiedad Idioma:

Note que al compilar para modo de Diseño, Delphi analizó su código y su propiedad Idioma es perfectamente legible, utilizando los mismos valores que usted escribió en su nuevo tipo TIdioma. Aún con esta ayuda en modo de diseño, el optimizador compilará un valor entero para mayor velocidad. Pero por ahora, usted puede cambiar la propiedad. Cambiemos nuestro HolaLabel a italiano:

He cambiado mi Font a algo más grande para que sea legible. Cuando usted cambia la propiedad, Delphi ejecuta la función SetIdioma que usted ha escrito, y cambia el texto a italiano.

Aunque esto es muy útil, recuerde que Delphi esta ejecutando su código, lo cual quiere decir que cualquier loop infinito o error en el código que Delphi ejecuta en modo de diseño puede trabar a Delphi. Asegúrese de grabar antes de compilar sus paquetes.

Platicando con Otros Lenguajes de Windows - Controles OCX

Hacer un Control para su uso en Visual Basic y otros lenguajes es tan sencillo que ni siquiera amerita un capítulo propio. En esta pequeña sección (que no es necesaria si usted no quiere utilizar su componente en otros lenguajes) crearemos un control OCX.

Nota: Windows no puede crear un Control ActiveX que no tenga un Handle de Windows (esta es una limitación de la tecnología ActiveX y no de Delphi). En Delphi, esto quiere decir que el control debe heredar de TWinControl. Desafortunadamente, nuestro THolaLabel hereda de TGraphicControl (para ahorrar recursos de Windows).

Desde el menú de Delphi, Seleccione "File-New". Vaya a la página de ActiveX y seleccione "ActiveX Library". Grabe el proyecto.

Ahora seleccione "File-New" y "ActiveX Control" (también desde la página de ActiveX).

Delphi le preguntará el nombre del control existente (haremos un TDateTimePicker), el nombre del nuevo componente ActiveX, el nombre de archivo para el .pas y el modelo de hilos de ejecucion. También le dará opciones para crear una caja de "About", versión y licencia.

Automáticamente, Delphi creará los archivos necesarios. Ahora sólo compile e instale el .OCX resultante en VB. Felicidades! Acaba de hacer usted un control OCX!

Nota: Si usted selecciona "Run Parameters", y pone el ejecutable de Visual Basic (o el lenguaje donde haya instalado el nuevo OCX) como "Host Application", podrá utilizar el debugger de Delphi en su control OCX.

Copiar el Código fuente (7K, formato Zip) para esta sección (Componente/Paquete)

Copiar el Código fuente (29K, formato Zip) para esta sección (ActiveX)

Capítulo -->