delphi.gif - 582,0 K
Curso de creación de componentes en Delphi

Unidad 4. Añadiendo posibilidades a un componente existente: TBlinkLabel

delphi.gif - 582,0 K
Volver al índice Por Luis Roche emailed.gif - 15503,0 K

blinklbl.gif - .966 K En esta unidad aprenderemos a añadir posibilidades a un componente Delphi ya existente. Conoceremos cómo utilizar objetos (componentes) en nuestro propio componente, y qué son y cómo se declaran los constructores y destructores.

Todo esto, claro está, en base a un ejemplo concreto: TBlinkLabel.


Bverde.gif - .325 KObjetivo del componente

Nuestro propósito es crear un componente idéntico al tipo TLabel (etiqueta), pero con una capacidad añadida: el parpadeo. Es decir, nuestro componente nos debe mostrar el mensaje introducido en la propiedad caption parpadeando con una determinada frecuencia. Además, si la frecuencia de parpadeo introducida es nula, el mensaje debe permanecer fijo en la pantalla (emulando lo que sucede con una etiqueta normal).


Bverde.gif - .325 KUtilizando un componente existente en nuestro propio componente. Timers.

Como acabamos de decir, nuestro componente debe parpadear con una cierta frecuencia. Para ello necesitamos poder medir el tiempo que debe transcurrir entre el encendido y apagado del mensaje. Afortunadamente, Delphi nos proporciona un objeto que se amolda perfectamente a nuestros requisitos de medición de tiempo: TTimer.

Aunque no es este el lugar donde explicar las características del objeto Timer (la información básica de este componente se puede encontrar en la propia ayuda en línea de Delphi), conviene detenernos un instante en la propiedad del timer que vamos a utilizar: la propiedad interval. Esta propiedad nos permite especificar el intervalo de tiempo que queremos medir (en milisegundos). Cuando se alcanza el valor establecido se ejecuta el método especificado en el evento OnTimer.

El método que nosotros especificaremos para el evento OnTimer se encargará de visualizar y ocultar alternativamente el mensaje.

La teoría está muy bien, pero... ¿cómo añadimos el objeto timer a nuestro componente? En tiempo de diseño es sencillo. Basta con seleccionar el timer en la paleta de componentes y situarlo en nuestro form.

Pero al escribir un componente no podemos utilizar este sistema, si no que debemos hacerlo a mano. Los pasos generales que se deben seguir son los siguientes:

En la siguiente sección profundizaremos en estos dos últimos pasos.


Bverde.gif - .325 KConstructores y destructores.
Bamar.gif - .326 KConstructores

Los objetos que declaramos en un componente no existen en memoria hasta que el objeto es creado (también se dice que se crea una instancia del objeto) por una llamada al método constructor del objeto.

Un constructor no es más que un método que proporciona memoria para el objeto y apunta (mediante un puntero) hacia él. Llamando al método create, el constructor asigna la instancia del objeto a una variable.

Conviene hacer notar que todos los componentes heredan un método denominado create que se encarga de "crear" (en el sentido que acabamos de ver) el componente en memoria. De forma adicional, en el método create se pueden inicializar los valores de determinados campos del componente (comúnmente asignarles un valor por defecto)

En el método create del componente podemos crear objetos adicionales que necesite nuestro componente. En nuestro caso, en el método create de TBlinkLbl crearemos el timer.

Bamar.gif - .326 KDestructores

Cuando terminamos de utilizar un objeto, debemos destruirlo, es decir, liberar la memoria que ocupaba el objeto. Esta operación se realiza mediante el método destroy que todos los componentes heredan de TComponent.

Si hemos creado algún objeto adicional, también debemos destruirlo escribiendo el código necesario en el método destroy.

Delphi crea y destruye automaticamente nuestro componente cuando es necesario, ya que como se ha dicho, los métodos create y destroy se heredan de TComponent.

Pero si queremos utilizar algún objeto en nuestro componente, Delphi no lo crea y destruye automaticamente, sino que debemos hacerlo nosotros de forma manual. Este proceso se realiza añadiendo el código necesario a los métodos create y destroy. Es importante notar que nos se escriben los métodos de nuevo, sino que se sobrecargan con el nuevo código.

De una forma general esto se hace de la siguiente forma: (un ejemplo más concreto lo tenemos en el propio código fuente del componente)


Bverde.gif - .325 KImplemementando el parpadeo.

En nuestro proceso de diseño del componente nos queda aún un paso importante: cómo hacer que el mensaje parpadee. Hemos dicho que cuando se produzca el evento OnTimer se ejecutará el método parpadea que se encargará de visualizar y ocultar el mensaje, es decir, de producir el parpadeo.

La solución es muy simple, ya que nuestro componente, al descender de TLabel incorporá una propiedad que determina si el componente debe estar visible o no. Esta propiedad se denomina visible.

De este modo, nuestro método parpadea lo único que hará será alternar el valor de la propiedad booleana visible según se produzca el evento OnTimer. Los detalles concretos de implementación se muestran en el código fuente.


Bverde.gif - .325 KOtros detalles en el diseño del componente. Valores por defecto.

Para que el diseño del componente este finalizado nos quedan por ver dos aspectos:


Bverde.gif - .325 KCódigo fuente del componente
unit Blinklbl;      { (c)1996 by Luis Roche }

interface

uses
  Classes, StdCtrls, ExtCtrls;    { TTimer se declara en ExtCtrls }

type
  TBlinkLabel = class(TLabel)    {TBlinkLabel deriva de TLabel}
  private
    FVelocidad : integer;        {Frecuencia de parpadeo}
    FTimer : TTimer;             {Timer para la frecuencia}
    procedure SetVelocidad(valor : integer);  {Almacena la velocidad}
  protected
    procedure parpadea(Sender : TObject);
  public
    constructor Create(AOwner : TComponent); override;    {Constructor}
    destructor Destroy; override;                         {Destructor}
  published
    property Velocidad : integer read FVelocidad write SetVelocidad default 400;
  end;

procedure Register;

implementation

constructor TBlinkLabel.Create(AOwner : TComponent);
begin
  inherited Create(AOwner);       {Llama al constructor original (heredado)}
  FTimer := TTimer.Create(Self);  {Creamos el timer}
  FVelocidad := 400;              {Frecuencia (velocidad) por defecto}
  FTimer.Enabled:=True;           {Activamos el timer}
  FTimer.OnTimer:=parpadea;       {Asiganamos el método parpadea}
  FTimer.Interval:=FVelocidad;    {Asignamos el intervalo del timer = frecuencia parpadeo}
end;

destructor TBlinkLabel.Destroy;
begin
  FTimer.Free;          {Liberamos el timer}
  inherited destroy;    {Llamamos al destructor original (heredado)}
end;

procedure TBlinkLabel.SetVelocidad (valor : integer);
begin
  If FVelocidad <> valor then        {Sólo si el valor introducido es distinto del almacenado}
  begin
    if valor < 0 then FVelocidad:=0;
    FVelocidad:=Valor;               {Asigna la velocidad}
    if FVelocidad=0 then FTimer.Enabled:=False else FTimer.Enabled:=True;
    {Si Fvelocidad=0 el mensaje debe estar siempre visible}
    FTimer.Interval:=FVelocidad;
    Visible:=True;
  end;
end;

procedure TBlinkLabel.parpadea(Sender : TObject);
begin
  if FTimer.Enabled then Visible := not(Visible);  {Alternativamente muestra y oculta el mensaje si el timer esta activado}
end;

procedure Register;        {Registro del componente}
begin
  RegisterComponents('Curso', [TBlinkLabel]);
end;

end.

Luis Roche revueltaroche@redestb.es
Ultima modificación 9.12.1996

Otros Links de Interés:

Cocina  -  Videos  -  Juegos Gratis  - Postales cachondas  - Cine  - Programas Gratis  -  Letras de Canciones

Listas de todos los Tutoriales Gratis. 1998- 2007 - -

Los tutoriales y cursos aquí reunidos son una recopilación de los mejores encontrados en Internet.
El crédito y copyright de los mismos si lo hubiere corresponde al autor de cada uno de ellos.
Si tu tutorial o curso está aquí, y deseas darlo de baja de esta recopilación o quieres añadir el tuyo, envíanos un mensaje desde
aquí

Publispain - Fun