Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Acceder a form modal desde módulo de datos (https://www.clubdelphi.com/foros/showthread.php?t=29726)

jcheco 31-01-2006 08:52:08

Acceder a form modal desde módulo de datos
 
Hola,

Me gustaría saber cómo podría acceder a una form modal desde un módulo de datos, me explico:

Tengo una form modal con componentes de acceso a campos de una tabla que está en un módulo de datos, en el evento OnNewRecord (por ejemplo) de la tabla quisiera poner el código para que se activara un botón que está en la form modal (FModal.Boton_X.Enabled:=True, por ejemplo).

Un saludo y muchas gracias.

jmariano 31-01-2006 12:50:32

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

Jonnathan 31-01-2006 13:08:59

Hola jcheco, para añadir un poco mas al comentario de jmariano, yo lo que hago siempre para estos casos es dejar los datasets en el DataModule y pongo los DataSources en los formularios. En el evento OnStateChange pongo un código mas o menos asi:

Código Delphi [-]
procedure DataSource1StateChange(Sender: TObject);
begin
   Case TDataSource(Sender).State of
   dsInsert: begin
                   //AQUI PONGO MI CODIGO A EJECUTAR CUANDO SE  
                   //INSERTAN REGISTROS, COMO ACTIVAR BOTON DE GUARDAR Y DESACTIVAR BOTONES DE NAVEGACION y DESACTIVAR BOTON GUARDAR
             end;
   dsEdit:   begin
                    //AQUI PONGO MI CODIGO A EJECUTAR CUANDO SE 
                    //EDITAN REGISTROS, COMO ACTIVAR BOTON DE GUARDAR Y DESACTIVAR BOTONES DE NAVEGACION
             end;
   else
             begin
                    //AQUI PONGO EL CÓDIGO CUANDO SE ESTA 
                    //NAVEGANDO POR LOS REGISTROS, ACTIVAR BOTONES DE NAVEGACION
             end; 
  end; //end case
end;

Osorio 31-01-2006 17:18:22

Hola,

Código Delphi [-]
(FModal.Boton_X.Enabled:=True

Bueno, no se puede acceder asi olimpicamente, pero con el poder de los objetos.


Código Delphi [-]
        if (TControl((Screen.ActiveForm).Components[i]) is TButton) then
                if TControl((Screen.ActiveForm).Components[i]).Name = 'botongrabar' then
                        TControl((Screen.ActiveForm).Components[i]).enabled:=not sw;

es un ejemplo que te puede servir.


Saludos


La franja horaria es GMT +2. Ahora son las 22:34:48.

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