PDA

Ver la Versión Completa : Como añadir un nuevo evento a un componente


Javi2
20-12-2004, 10:27:22
Hola, necesito añadir un nuevo evento a un DBGrid y no tengo ni idea de como hacerlo. Creo que hay que crear un nuevo componente que herede del DBGrid y a partir de ahí añadir los eventos que se quiera.

Si alguien me puede ayudar le estaré muy agradecido y si pudiera ser con algún ejemplo mucho mejor pues he estado leyendo en varios sitios sobre el tema pero no me aclaro.

Muchas gracias.

Neftali [Germán.Estévez]
20-12-2004, 11:35:25
...necesito añadir un nuevo evento a un DBGrid y no tengo ni idea de como hacerlo. Creo que hay que crear un nuevo componente que herede del DBGrid y a partir de ahí añadir los eventos que se quiera.
Efectivamente, si quieres añadirle un evento no puedes hacerlo directamente, debes derivarlo en un nuevo componente y añadirselo.


...Si alguien me puede ayudar le estaré muy agradecido y si pudiera ser con algún ejemplo mucho mejor pues he estado leyendo en varios sitios sobre el tema pero no me aclaro.
Para crear un nuevo componente utiliza el asistente de Delphi;
(1) File/New/Other...
(2) Selecciona Component y pulsa OK.
(3) Ancestor Type=TDBGrid (DBGrids)
(4) ClassName=TMyDBGrid (por ejemplo)
(5) En Palette Page escribe "MY COMPS" (por ejemplo)
(6) Unit, la que quieras, es el PAS donde se va a guardar.
(7) Pulsa el botón INSTALL...
(8) Como package selecciona el de usuario; Normalmente lo puedes encontrar en: "c:\Archivos de programa\Borland\Delphi6\Lib\dclusr.dpk"
(9) Luego te pedirá que recompiles el package; Hazlo y lo Instalas.

Ahora ya debería aparecer la nueva pestaña con tu componente.
Abre en el IDE el .PAS que has generado y añádele el evento. Recuerda que para que los cambios que realices al componente funcionen debes ir recompilando el package en el que lo has instalado (el de arriba).

Para añadir el evento, en la parte published añade una nueva propiedad, por ejemplo:


// Evento antes de la ordenación
property OnBeforeSort:TNotifyEvent read FOnBeforeSort write FOnBeforeSort;


Cuando quieras hacer "saltar" el evento para que se active lo que tengas programado debes añadir lo siguiente:


...
// Lanzar el evento antes de ordenar...
if Assigned(Self.FOnBeforeSort) then begin
Self.OnBeforeSort(Self);
end;


Pruébalo, si tienes problemas ya dirás...

Javi2
20-12-2004, 11:57:11
Muchas gracias por tu ayuda. He seguido (creo) tus indicaciones y, aunque he creado el nuevo evento como published no me aparece en la paleta de eventos. ¿He hecho algo mal?

El código que indicas que tengo que añadir, ¿donde lo tengo que añadir exactamente?

Neftali [Germán.Estévez]
20-12-2004, 12:10:17
Si has seguido mis indicaciones habrás creado una nueva Unit (un nuevo fichero .PAS) que tiene tu nuevo componente. En ese fichero estará la definición de tu componente. Será una Unit con una pinta similar a ésta:


unit MydbGrid;
interface
uses
Windows, Messages, SysUtils, Classes, Controls, Grids, DBGrids;
type
TMyDBGrid= class(tdbGrid)
private
{ Private declarations }
protected
{ Protected declarations }
public
{ Public declarations }
published
{ Published declarations }
end;
procedure Register;
implementation
procedure Register;
begin
RegisterComponents('MY COMPS', [TMyDBGrid]);
end;
end.

Localiza esa Unit y en la parte published añades el código anterior. Es IMPRESCINDIBLE que luego vuelvas a recompilar el package donde has instalado (el de usuario) éste componente y lo instales de nuevo, sino no verás los cambios realizados, como te está pasando.

Una vez modificado, compilado e instalado, crea un nuevo proyecto y añade tu DBGrid.

Javi2
20-12-2004, 12:23:28
Muchísimas gracias!!! Efectivamente, me faltaba instalarlo una vez compilado. Ahora ya me aparece con el evento creado por mi.

Pero tengo una duda. ¿Cómo sabe Delphi o cómo le indico yo cuando se debe lanzar el evento (por ejemplo, el evento OnClick se lanza después de pulsar con el ratón sobre el componente)?

Neftali [Germán.Estévez]
20-12-2004, 13:18:53
Pero tengo una duda. ¿Cómo sabe Delphi o cómo le indico yo cuando se debe lanzar el evento (por ejemplo, el evento OnClick se lanza después de pulsar con el ratón sobre el componente)?
Pues colocando el código que te puesto arriba donde desees que se "lanze" el evento.


...
// Lanzar el evento antes de ordenar...
if Assigned(Self.FOnBeforeSort) then begin
Self.OnBeforeSort(Self);
end;


¿Exactamente qué evento deseas lanzar? ¿O cuando deseas lanzarlo?

Javi2
20-12-2004, 13:25:12
Perdona por las molestias pero después de escribir la duda he releido tu mensaje y lo he entendido.

Muchas gracias por tu ayuda porque me ha sido utilísima.

Que pases unas felices fiestas.

Feliz Navidad.