Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Nuevo evento (https://www.clubdelphi.com/foros/showthread.php?t=979)

hgiacobone 30-05-2003 16:08:05

Nuevo evento
 
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

Cita:

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:

Código:

  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:

Código:

  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

Cita:

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.

Código:

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:
Código:

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!


La franja horaria es GMT +2. Ahora son las 18:47:02.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi