Ver Mensaje Individual
  #6  
Antiguo 14-12-2011
[maeyanes] maeyanes is offline
Capo de los Capos
 
Registrado: may 2003
Ubicación: Campeche, México
Posts: 2.732
Reputación: 26
maeyanes Va por buen camino
Hola...

Y si a ese componente le asignas un método en su evento OnDataChange, ¿este sigue comportándose como deseas? Has la prueba y verás que no.

Para redefinir el comportamiento de un evento, primero debes identificar cual es el método que dispara ese evento, mayormente en la VCL estos métodos se pueden redefinir, pero parece que para la clase TDataSource el método que llama al evento es privado (DataEvent).

Dicho lo anterior, tu componente debe quedar de la siguiente forma para que funcione:

Código Delphi [-]
type
  TMiDataSource = class(TDataSource)
  private
    // Campo para guardar el manejador de evento definido en tiempo de diseño...
    FOldDataChangeEvent: TDataChangeEvent;

    procedure DoOnDataChange (Sender: TObject; Field: TField);
  protected
    procedure Loaded; override;
  end;

implementation

procedure TMiDataSource.DoOnDataChange(Sender: TObject; Field: TField);
begin
  // Llamamos el manejador de eventos asignado en tiempo de diseño...
  if Assigned(FOldDataChangeEvent) then
    FOldDataChangeEvent(Sender, Field);
  // Aquí pones tu código...
end;

procedure TMiDataSource.Loaded;
begin
  inherited;
  // Si estamos en tiempo de ejecución, sustituimos el manejador de evento de OnDataChange con el nuestro...
  if not csDesigning in ComponentState then
  begin
    FOldDataChangeEvent := OnDataChangeEvent;
    OnDataChangeEvent := DoOnDataChange
  end
end;

Toma en cuenta que este código lo hago al vuelo, así que podría fallar. También ten en cuenta que si se cambia el manejador de evento de OnDataChange en tiempo de ejecución, el comportamiento de este código ya no será el deseado.



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