Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

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

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 25-07-2007
Piratta Piratta is offline
Registrado
 
Registrado: jun 2005
Posts: 4
Poder: 0
Piratta Va por buen camino
Sobrescribir un evento y ejecutar también el que estaba previamente

Hola
En un TFrame estoy creando una especie de navegador (TNavegator) de tablas que funcione con campos TEdit (en vez de TDBEdit).
Una de las propiedades es DataSource (que guardo en FDataSource).

Esta propiedad se asigna a mano antes de utilizar el navegador, de manera que apunte a un TDataSource ya existente (bien en un TDataModule o bien en la misma ficha donde esté el TFrame).

Mi problema viene con el evento OnStateChange.
En mi clase navegador sobrescrivo este envento con uno propio mío, ya que me interesa que cada vez que haya un cambio en State se ejecute un determinado código,
pero:
si (en el TDataSource original) había otro OnStateChange asignado previamente, ¿cómo hago para ejecutar el que ya estaba antes y después el mío?

Saludos
Paco Ruiz
Responder Con Cita
  #2  
Antiguo 25-07-2007
Avatar de jhonny
jhonny jhonny is offline
Jhonny Suárez
 
Registrado: may 2003
Ubicación: Colombia
Posts: 7.058
Poder: 30
jhonny Va camino a la famajhonny Va camino a la fama
Espero que sea esto lo que necesites...
Código Delphi [-]
if Assigned(DataSourceOriginal.OnStateChange) then
  DataSource.OnStateChange;

//Luego el codigo tuyo...

Espero me haya hecho entender y que además de que sea lo que necesites, te sirva .
__________________
Lecciones de mi Madre. Tema: modificación del comportamiento, "Pará de actuar como tu padre!"

http://www.purodelphi.com/
http://www.nosolodelphi.com/
Responder Con Cita
  #3  
Antiguo 25-07-2007
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.293
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 Piratta
Esta propiedad se asigna a mano antes de utilizar el navegador, de manera que apunte a un TDataSource ya existente (bien en un TDataModule o bien en la misma ficha donde esté el TFrame).
Guarda un apuntador conel posible evento que ya esté asignado, antes de asignar el tuyo. Luego cuando vayas a ejecutar tu evento preguntas si el anterior estaba asignado y en ese caso usas el apuntador para ejecutarlo...

Código Delphi [-]
  // Apuntador al evento existente
  OldActiveDataSet := TMyDataSet(Self.DataSource).OnActive;
  // Reasigno el evento
  TMyDataSet(Self.DataSource).OnActive := _OnActiveDataSet;

Luego cuando ejecutes el tuyo deberás hacer:

Código Delphi [-]
  ...
  // Asignado?
  if Assigned(OldActiveDataSet) then
    OldActiveDataSet(parametros_segun_tipo);
  end;

  ...
__________________
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
  #4  
Antiguo 25-07-2007
Piratta Piratta is offline
Registrado
 
Registrado: jun 2005
Posts: 4
Poder: 0
Piratta Va por buen camino
Cita:
Empezado por Neftali

// Apuntador al evento existente
// ¿¿ de qué tipo es OldActiveDataSet ??
OldActiveDataSet := TMyDataSet(Self.DataSource).OnActive;
Aunque lo haces sobre un evento de un DataSet en vez de sobre un DataSource, capto la idea.
El único detalle que me queda es cómo declaro la variable que tú llamas OldActiveDataSet. La otra (_OnActiveDataSet) es el nombre del procedimiento que tengo.
Responder Con Cita
  #5  
Antiguo 25-07-2007
Piratta Piratta is offline
Registrado
 
Registrado: jun 2005
Posts: 4
Poder: 0
Piratta Va por buen camino
Gracias por tu respuesta jhonny, pero te limitas a hacer lo mismo que yo, sobrescribes el evento y "pasas" del que pudiera estar asignado antes.
Es más, si originariamente no hubiera ninguno asignado, tú tampoco le asignas ahora otro nuevo (peor aún que lo que yo hacía).
Responder Con Cita
  #6  
Antiguo 25-07-2007
Avatar de jhonny
jhonny jhonny is offline
Jhonny Suárez
 
Registrado: may 2003
Ubicación: Colombia
Posts: 7.058
Poder: 30
jhonny Va camino a la famajhonny Va camino a la fama
Cita:
Empezado por Piratta
Gracias por tu respuesta jhonny, pero te limitas a hacer lo mismo que yo, sobrescribes el evento y "pasas" del que pudiera estar asignado antes.
Si tienes razón, en cuanto a la pregunta que le haces a Neftali, me supongo que debes declarar OldActiveDataSet del tipo TNotifyEvent.
__________________
Lecciones de mi Madre. Tema: modificación del comportamiento, "Pará de actuar como tu padre!"

http://www.purodelphi.com/
http://www.nosolodelphi.com/
Responder Con Cita
  #7  
Antiguo 26-07-2007
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.293
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 Piratta
Aunque lo haces sobre un evento de un DataSet en vez de sobre un DataSource, capto la idea.
El único detalle que me queda es cómo declaro la variable que tú llamas OldActiveDataSet. La otra (_OnActiveDataSet) es el nombre del procedimiento que tengo.
Sí, perdona; Escribí rápido y no revisé los detalles; Como tú bien dices lo importante es la idea; Dejar un apuntadr a la anterior, antes de asignar la nueva;
Para la declaración puedes coger de muestra la cabecera del evento que estás redeclarando; El procedimiento debe tener los mismos parámetros para que puedes asignarlo.

Por ejemplo si estás "sobreescribiendo" el evento OnDataChange (por decir uno) que está definido así:
Código Delphi [-]
type TDataChangeEvent = procedure(Sender: TObject; Field: TField) of object;
property OnDataChange: TDataChangeEvent;

Pues la definición de tu procedimiento _MyOnDataChange/OldDataChange será:
Código Delphi [-]
procedure MyOnDataChange(Sender: TObject; Field: TField);
__________________
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
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
Como ejecutar un procedimiento en mis forms mostrados, cuando ocurra un evento?? jcapitan OOP 5 21-06-2007 18:16:56
Como ejecutar un evento antes de mostrar un form hperez Varios 5 18-05-2007 07:12:25
Ejecutar Evento Onclick con un Enter en un TreeView cesar_picazo Varios 1 20-09-2004 17:59:17
Error de units de Zeos previamente compiladas nefy Conexión con bases de datos 3 12-06-2004 01:08:31
ir a un registro guardado previamente pepe2000 Tablas planas 7 14-01-2004 11:35:19


La franja horaria es GMT +2. Ahora son las 16:22:25.


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