Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 15-09-2010
ElDuc ElDuc is offline
Miembro
 
Registrado: jul 2004
Posts: 197
Poder: 20
ElDuc Va por buen camino
Lightbulb ¿Se puede "robar" un evento?

Hola a todos,

Estoy haciendo una clase en una unidad independiente, desde la cual me interesaría "utilizar" (no "robar", ahora comprenderéis lo de robar) el evento OnResize del formulario que la utiliza.

No estoy haciendo un componente derivado de la clase TForm, lo que deseo es que cuando el formulario cambia de tamaño, mi nueva clase se entere, ejecute un código y devuelva el control al evento OnResize del formulario por si hay codigo en él.

Todo esto debería ser opaco para el formulario.

Por el momento he conseguido "robar" el evento del Formulario:

Código Delphi [-]
...
 
Interface
 
Type
  MyClass=Class
  Private
    FTheForm:TForm;
    Procedure MyOnResize(Sender:TObject);
  Public
    Constructor Create(AOwner:TForm);
  End;
 
Implementation
 
Procedure MyClass.MyOnResize(Sender:TObject);
Begin
Beep;
End;
 
Constructor MyClass.Create(AOwner:TForm);;
Begin
FTheForm:=AOwner;
FTheForm.OnResize:=MyOnResize
End;
 
End.

Con este código si si se cambia el tamaño del formulario se ejecuta el código de MyOnResize y genera un pitido, pero lo que hago es "ROBAR" el evento ya que si en el evento OnResize del formulario hemos puesto código. éste no se ejecuta.

Me imagino que esto sucede porque al apuntar el evento OnResize del formulario a mi propio evento MyOnResize ya no se ejecuta el antiguo evento.

Me imagino que debe haber una forma de almacenar el evento antiguo antes de reasignarlo para que una vez ejecutado el código del nuevo evento pudiera llamar al código del evento OnResize del formulario pero no sé como hacerlo.

¿Podéis ayudarme?

Última edición por ElDuc fecha: 15-09-2010 a las 10:14:47.
Responder Con Cita
  #2  
Antiguo 15-09-2010
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.286
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Cita:
Empezado por ElDuc Ver Mensaje
Me imagino que debe haber una forma de almacenar el evento antiguo antes de reasignarlo para que una vez ejecutado el código del nuevo evento pudiera llamar al código del evento OnResize del formulario pero no sé como hacerlo.
¿Podéis ayudarme?
Pues tú mismo te has dado la solución.

Código Delphi [-]
  FTheForm := Value;
  // Me guardo el antiguo
  oldResize := FTheForm.OnResize;
  // Apunto al mío
  FTheForm.OnResize := MyOnResize
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #3  
Antiguo 15-09-2010
ElDuc ElDuc is offline
Miembro
 
Registrado: jul 2004
Posts: 197
Poder: 20
ElDuc Va por buen camino
Solucionado

Ya lo he solucionado, lo explico por si a alguien le puede interesar.

Código Delphi [-]
...

Interface

Type
  MyClass=Class
  Private
    FOld:NotifyEvent;   // Aquí almacenaremos el viejo evento
    FTheForm:TForm;
    Procedure MyOnResize(Sender:TObject);
  Public
    Constructor Create(AOwner:TForm);
  End;

Implementation

Procedure MyClass.MyOnResize(Sender:TObject);
Begin
Beep;   // Ejecutamos nuestro código
 
FTheForm.OnResize:=FOld;   // Apuntamos al evento del TForm
FTheForm.OnResize(Sender);   // Lo llamamos
FTheForm.OnResize:=MyOnResize   // Volvemos a apuntar a nuestro código
End;
 
Constructor MyClass.Create(AOwner:TForm);;
Begin
FTheForm:=AOwner;
FOld:FTheForm.OnResize;   // Almacenamos el evento del TForm
FTheForm.OnResize:=MyOnResize
End;
 
End.

Co este código se consigue lo que yo deseaba, es decir, ejecutar nuestro código y posteriormente el que hay en el evento OnResize del Formulario.

Saludos.
Responder Con Cita
  #4  
Antiguo 15-09-2010
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.286
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Es más o menos eso, aunque creo que no es necesario que cada vez hagas la asignación de los eventos.
Al principio (al crear el componente o al asignar el form) te quedas con el apuntador al form y luego sólo debes lanzar el evento cuando toque.
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #5  
Antiguo 20-09-2010
[maeyanes] maeyanes is offline
Capo de los Capos
 
Registrado: may 2003
Ubicación: Campeche, México
Posts: 2.732
Poder: 24
maeyanes Va por buen camino
La forma correcta, tal como dice Neftali sería:

Código Delphi [-]
constructor MyClass.Create(AOwner: TComponent);
begin
  inherited;
  FTheForm := AOwner;
  FOldResize := FTheForm.OnResize;
  FTheForm.OnResize := MyOnResize
end;

procedure MyClass.MyOnResize(Sender: TObject);
begin
  // Mi código...
  if Assigned(FOldResize) then
    FOldResize(Sender)
end;

Ahora, si tu clase es un componente, la asignación del evento deberías hacerla redefiniendo el método Loaded:

Código Delphi [-]
  MyClass = class(TComponent)
  protected
    procedure Loaded; override;
  end;

implementation

procedure MyClass.Loaded;
begin
  inherited;
  // Verificamos que estemos en tiempo de ejecución y solo así cambiamos la asigación
  // del evento OnResize
  if not (csDesigning in ComponentState) then
  begin
    FOldResize := FTheForm.OnResize;
    FTheForm.OnResize := MyOnResize
  end
end;


Saludos...
__________________
Lee la Guía de Estilo antes que cualquier cosa. - Twitter
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Un programa hecho en "Delphi for PHP" puede funcionar en un Hosting PHP normal? cocute Varios 3 28-02-2011 19:36:45
"Robar" lineas de un fichero Angel Vicente Varios 2 10-09-2010 08:45:12
Microsoft México - invita al evento "Mentes aplicadas" Héctor Randolph Noticias 0 27-11-2006 20:08:23
como se puede solucionar "Stream read error"? JuanErasmo Firebird e Interbase 0 08-08-2006 15:40:25
Error aplicacion corba "no se puede abrir midas.idl" CORBATIN Providers 0 25-08-2004 14:37:37


La franja horaria es GMT +2. Ahora son las 00:01:42.


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
Copyright 1996-2007 Club Delphi