PDA

Ver la Versión Completa : problemas con evento statechange del DataSource


Joser
25-09-2012, 19:05:51
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:
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:

application.createform(tformusuarios, formusuarios);
datamodule.CLIENTusuarios.active:= true;
formusuarios.showmodal;

cuando cierro el formulario en el evento onclose coloco lo siguiente:
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:

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