Ver Mensaje Individual
  #2  
Antiguo 31-01-2006
Avatar de jmariano
jmariano jmariano is offline
Miembro
 
Registrado: jul 2005
Posts: 376
Reputación: 19
jmariano Va por buen camino
Se considera una mala práctica hacer que los módulos de datos accedan a los formularios (por lo general, son los formularios los que conocen y utilizan los módulos de datos pero no al revés).

Lo que yo te recomendaría es que utilizaras los eventos del DataSource para detectar los cambios de estado o de datos de la tabla en sí y codificar ahí tus operaciones (revisa los eventos: OnDataChange, OnStateChange y OnUpdateData, aunque, en tu caso, el evento que más te va a interesar es el relacionado con el cambio de estado, OnStateChange).

Si el DataSource lo tienes en el mismo formulario, entonces, sólo has de especificar las operaciones en el evento de éste que mas de convenga, pero si lo tienes en un módulo de datos, entonces, lo que podrías hacer es, por ejemplo, crear propiedades de tipo "evento" para el módulo y capturar luego éstas en el formulario:

Módulo de datos
Código Delphi [-]
type
  TDataModule1 = class(TDataModule)
    DataSource1: TDataSource;
    ...   
    procedure DataSource1StateChange(Sender: TObject);
  private
    FAlCambiarEstado: TNotifyEvent;
  public
    // Para capturar el cambio de estado del DataSet
    property AlCambiarEstado: TNotifyEvent read FAlCambiarEstado write FAlCambiarEstado;
  end;
  ...
implementation

procedure TDataModule1.DataSource1StateChange(Sender: TObject);
begin
  if Assigned(FAlCambiarEstado) then
    FAlCambiarEstado(Self);
end;
...

Formulario
Código Delphi [-]
type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
    ...   
  private
    // Método a ejecutar cuando cambia el estado del DataSet
    procedure AlCambiarEstado(Sender: TObject);
  ...
  end;
  ...
implementation

procedure TForm1.FormCreate(Sender: TObject);
begin
  DataModule1.AlCambiarEstado := AlCambiarEstado; // Capturamos el evento 
end;

procedure TForm1.AlCambiarEstado(Sender: TObject);
begin
  // Operación a realizar cuando cambia el estado del DataSet
end;
...

(Esta misma técnica la puedes utilizar para capturar otros eventos del DataSet, pero lo mejor es utilizar los del DataSource cuando se trata de sincronizar la interfaz)

Saludos!

P.D: Mejorando el ejemplo, también podrías crearte un tipo de evento propio que reciba el estado del DataSet (y así saber si está en inserción, edición, etc.).

Módulo de datos
Código Delphi [-]
type
  TEventoCambioEstado = procedure(Sender: TObject; Estado: TDataSetState);

  TDataModule1 = class(TDataModule)
  ...
  private
    FAlCambiarEstado: TEventoCambioEstado;
  public
    property AlCambiarEstado: TEventoCambioEstado read FAlCambiarEstado write FAlCambiarEstado;
    ...
  end;
  ...
implementation

procedure TDataModule1.DataSource1StateChange(Sender: TObject);
begin
  if Assigned(FAlCambiarEstado) then
    FAlCambiarEstado(Self, DataSource1.State);
end;
...

Formulario
Código Delphi [-]
type
  TForm1 = class(TForm)
  ...
  private
    procedure AlCambiarEstado(Sender: TObject; Estado: TDataSetState);
  end;
  ...
implementation

procedure TForm1.AlCambiarEstado(Sender: TObject; Estado: TDataSetState);
begin
  // Operación a realizar cuando cambia el estado
end;
...

Última edición por jmariano fecha: 31-01-2006 a las 13:04:08.
Responder Con Cita