Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Sobrescribir un evento y ejecutar también el que estaba previamente (https://www.clubdelphi.com/foros/showthread.php?t=46162)

Piratta 25-07-2007 17:10:15

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

jhonny 25-07-2007 17:28:36

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 ;).

Neftali [Germán.Estévez] 25-07-2007 17:36:21

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;

  ...

Piratta 25-07-2007 19:32:24

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.

Piratta 25-07-2007 19:37:06

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).

jhonny 25-07-2007 20:31:35

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.

Neftali [Germán.Estévez] 26-07-2007 11:00:44

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);


La franja horaria es GMT +2. Ahora son las 12:34:24.

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