PDA

Ver la Versión Completa : Nuevo evento


hgiacobone
30-05-2003, 16:08:05
Que tal amigos...

Tal vez esta sección del foro sepa la respuesta.
¿Es posible adicionarle un evento a un componente?

La cosa es así: el componente nativo TAnimate para mostrar archivos AVI tienen pocos eventos (los necesarios) como OnShow y OnHide entre otros.

Yo necesito responder a la acción de acer Click sobre éste, o sea, generar un evento OnClick y atender a este.

¿Cómo se hace?

Kafu
30-05-2003, 16:14:41
Sí que lo es. Es relativamente sencillo, lo complicado puede ser elegir en qué momento dispararlo. Un evento es una propiedad de tipo procedure of object. Puedes poner a tu componente una propiedad de tipo tnotifyevent directamente o crearte un tipo
type
procedure (sender: tobject; parametros.... ) of object
Luego en la parte que elijas del componente lo disparas. Normalmente se hace en función de algún mensaje recibido o en el método set de alguna propiedad.
Esto no es para explicarlo en cuatro líneas. Te recomiendo rastrear la VCL por ejemplo mirando el onclick de un tcontrol. Es como se aprende. Un saludo,






F.T.G.

hgiacobone
30-05-2003, 16:56:55
Posteado originalmente por Kafu
Es relativamente sencillo, ...
F.T.G.

Que? !!!
Gracias por tu respuesta, pero sinceramente no entendí nada de lo que dijite.
¿Me podés hacer un ejmplo con el TAnimate, así es más fácil?

delphi.com.ar
30-05-2003, 17:18:22
Lo que dijo Kafu, es que es muy fácil definir un evento, pero hay que saber cuando dispararlo, de nada sirve tener eventos que nunca se disparen:

TMiClase = class(TWinControl)
private
FMiEvento : TNotifyEvent;
published
property MiEvento : TNotifyEvent read FMiEvento write FMiEvento;
end;

Viendo la herencia del TAnimate, se puede ver que viene de TControl, y TControl tiene definido el evento OnClick pero no lo tiene publicado, entonces podemos hacer lo siguiente:

TMiAnimate = class(TAnimate)
published
property OnClick;
end;

Como no lo he probado, no te garantizo de que se dispare el evento, Saludos!

Kafu
30-05-2003, 18:44:05
Disculpa mi forma de expresarme, tengo la capacidad de embrollar lo sencillo (es que soy de letras).
El camino que te indica Delphi.com.ar es el apropiado, diría yo.
Al publicar esa propiedad-evento ya no necesitas crearte uno nuevo. No te puedo decir si el animate responderá como tcontrol al hacer click y disparará el doclick, pero si no es así (yo tampoco lo he probado), rastrea el doclick o doonclick en tcontrol a ver cómo y en qué circunstancias es disparado.
Espero no haberte liado más, un saludo,

hgiacobone
21-07-2003, 22:44:49
Posteado originalmente por delphi.com.ar
Viendo la herencia del TAnimate, se puede ver que viene de TControl, y TControl tiene definido el evento OnClick pero no lo tiene publicado, entonces podemos hacer lo siguiente...
Como no lo he probado, no te garantizo de que se dispare el evento, Saludos!


Yo lo he intentado, puse sobre un Form vacío un TAnimate con su animación ya caragada como correspnde y declaré la otra variable para capturar el evento pero no me funciona. Por favor, fijate el código y orientame porque no entiendo.


type
TForm1 = class(TForm)
Animate1: TAnimate;
procedure Anima1Click(Sender: TObject);
private
public
end;

TMiAnimate = class(Animate1)
published
property OnClick;
end;

var
Form1: TForm1;
Anima1: TMianimate;

implementation
{$R *.dfm}

procedure TForm1.Anima1Click(Sender: TObject);
begin
showmessage('Pum...!');
end;
end.

delphi.com.ar
21-07-2003, 23:13:24
Es que la idea no es heredarlo de tu form, sino del TAnimate... Si lees atentamente lo que he escrito anteriormente esta todo dicho!
Puedes crearlo en tiempo de ejecución si es que no quieres registrar un componente nuevo, haciendo algo como esto:
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ComCtrls;

type
TForm1 = class(TForm)
Animate1: TAnimate;
procedure FormCreate(Sender: TObject);
private
procedure MiAnimateClick(Sender: TObject);
public
end;

TMiAnimate = class(TAnimate)
published
property OnClick;
end;

var
Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.FormCreate(Sender: TObject);
var
Animate1: TMiAnimate;
begin
Animate1 := TMiAnimate.Create(Self);
with Animate1 do
begin
Parent := Self;
CommonAVI := aviCopyFile;
OnClick := MiAnimateClick;
Active := True;
end;

end;

procedure TForm1.MiAnimateClick(Sender: TObject);
begin
ShowMessage('Pum...!');
end;

end.


Y sinó puedes hacer un cast de tu TAnimate a TMiAnimate, va a funcionar pero no soy muy partidario de este tipo de prácticas

Saludos!