Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   problemas con evento statechange del DataSource (https://www.clubdelphi.com/foros/showthread.php?t=80918)

Joser 25-09-2012 19:05:51

problemas con evento statechange del DataSource
 
buenas, nuevamente para pedir ayuda.
resulta que en una aplicacion de delphi 7 con db en sql server, tengo lo siguiente:
en el evento state change del data source habilito o no los botones y otros objetos de la siguiente forma:
Código Delphi [-]
if formusuarios <> nil then
  begin
    formusuarios.BTcancelar.enabled:= dsusuarios.state in [dsinsert, dsedit];
    formusuarios.BTnuevo.enabled:= dsusuarios.state = dsbrowse;
    .............
    .............
  end;

en el menu principal cuando llamo al formulario, con el cual tengo problemas, lo hago de la siguiente forma:
Código Delphi [-]
application.createform(tformusuarios, formusuarios);
datamodule.CLIENTusuarios.active:= true;
formusuarios.showmodal;

cuando cierro el formulario en el evento onclose coloco lo siguiente:
Código Delphi [-]
datamodule.CLIENusuarios.actve:= false;
formusuarios.release;
formusuarios:=nil;

y el problema es que cuando llamo al formulario a veces realiza el evento onstatechange del datasource y otras no.

si alguien me puede dar una mano con esto...

desde ya muchas gracias.

Joser 27-09-2012 16:54:36

si no me supe expresar alguien me puede decir??
gracias por su tiempo...

Casimiro Notevi 27-09-2012 18:06:44

Seguramente necesitamos ver más código o más explicaciones de tu parte, con esa información sólo podemos intentar adivinar.

ecfisa 27-09-2012 19:12:28

Hola Joser.

Como comenta Casimiro, hay varios detalles que faltan conocer. Por tu código da la impresión que el TDataModule tiene acceso (incluye) a formusuarios, particularmente prefiero entablar la relación de modo inverso.

Quitando a formusuarios del comando uses de DataModule1, podrías hacer:
Código Delphi [-]
...
type
  Tformusuarios = class(TForm)
    BTCancelar: TButton;
    BTNuevo: TButton;
    procedure FormCreate(Sender: TObject);
    ... 
    procedure BTNuevoClick(Sender: TObject);
    procedure BTCancelarClick(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
  private
    FNotifyEvent: TNotifyEvent;
    procedure dsusuariosChange(Sender: TObject);
  public
  end;

var
  formusuarios: Tformusuarios;

implementation  

uses Unit2, // DataModule1
     DB;

procedure Tformusuarios.dsusuariosChange(Sender: TObject);
begin
  with DataModule1 do
  begin
    BTCancelar.Enabled := dsusuarios.State in[dsEdit, dsInsert];
    BTNuevo.Enabled    := dsusuarios.State = dsBrowse;
  end
end;

procedure Tformusuarios.FormCreate(Sender: TObject);
begin
  with DataModule1 do
  begin
    FNotifyEvent             := dsusuarios.OnStateChange; 
    dsusuarios.OnStateChange := dsusuariosChange;
    CLIENTusuarios.active    := True;  
    BTCancelar.Enabled       := dsusuarios.State in[dsEdit, dsInsert];
    BTNuevo.Enabled          := dsusuarios.State = dsBrowse;
  end
end;

...

procedure Tformusuarios.BTNuevoClick(Sender: TObject);
begin
  DataModule1.CLIENTusuarios.Insert;
end;

procedure Tformusuarios.BTCancelarClick(Sender: TObject);
begin
  DataModule1.CLIENTusuarios.Cancel;
end;

procedure Tformusuarios.FormClose(Sender: TObject;  var Action: TCloseAction);
begin
   DataModule1.dsusuarios.OnStateChange := FNotifyEvent;
end;

...

end.

Saludos.

Joser 28-09-2012 05:38:07

Gracias por su respuesta... lo probé y de 10!!! muchísimas gracias...
éxitos...


La franja horaria es GMT +2. Ahora son las 12:39:35.

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