Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

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

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 31-01-2006
jcheco jcheco is offline
Miembro
 
Registrado: dic 2005
Posts: 14
Poder: 0
jcheco Va por buen camino
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.
Responder Con Cita
  #2  
Antiguo 31-01-2006
Avatar de jmariano
jmariano jmariano is offline
Miembro
 
Registrado: jul 2005
Posts: 376
Poder: 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
  #3  
Antiguo 31-01-2006
Avatar de Jonnathan
Jonnathan Jonnathan is offline
Miembro
 
Registrado: may 2005
Ubicación: Isla de Margarita, Venezuela
Posts: 64
Poder: 19
Jonnathan Va por buen camino
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;
__________________
"En el siglo de la estupidez todas las casas comienzan por la fachada" (Fuckowsky)
Planeta Insólito, La Pluma Inspirada
Responder Con Cita
  #4  
Antiguo 31-01-2006
Avatar de Osorio
Osorio Osorio is offline
Miembro
 
Registrado: may 2003
Ubicación: Colombia
Posts: 251
Poder: 21
Osorio Va por buen camino
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
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 importar informacion a mi base de datos desde un disket ibbeth Firebird e Interbase 13 20-01-2007 10:18:38
Imposible hacer visible un form desde otro form SMTZ .NET 13 16-01-2006 21:41:08
Crear un Form desde un componente nemo OOP 2 16-07-2003 04:51:02
Módulo de datos con DbExpress Gisela Conexión con bases de datos 4 02-07-2003 16:10:33
Acceder a Firebird desde ASP.NET victork_py Conexión con bases de datos 0 12-05-2003 16:50:43


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


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