PDA

Ver la Versión Completa : AfterScroll Suave con DBGrid Scroll


Delfino
16-12-2015, 17:43:44
Tengo una Dataset que tiene el evento AfterScroll asignado que hace una serie de tareas.
Al hacer scroll en el DBGrid relacionado con el Dataset se hace lento porque por cada scroll del DBGrid se para para ejecutar el evento AfterScroll.
No hay alguna manera de que no ejecute el AfterScroll hasta que deje de hacer scroll del DBGrid?
bien por click en la ScrollBar del DBGrid o bien por MouseWheel o Flechas del teclado

AgustinOrtu
16-12-2015, 18:10:09
Podes probar con


DataSet.DisableControls;
try
{ tareas }
finally
DataSet.EnableControls;
end;


A ver si mejora

Si no mejora, lo unico que podes hacer es quitar el evento y volverlo a asignar


DataSet.AfterScroll := NIL;
DataSet.AfterScroll := DataSetAfterScroll; // manejador que tendras definido en el form/datamodule me imagino

Delfino
16-12-2015, 18:15:08
Cuando quitar el evento y cuando volver a asignarlo?

AgustinOrtu
16-12-2015, 19:21:30
Con un poco de imaginacion?


procedure TForm1.ClientDataSet1AfterScroll(DataSet: TDataSet);
begin
Caption := 'procesando...';
Sleep(1000); // 1 segundo
ShowMessage('procesado');
Caption := 'Form1';
end;

procedure TForm1.ClientDataSet1BeforeScroll(DataSet: TDataSet);
begin
ClientDataSet1.AfterScroll := NIL;
Timer1.Enabled := False;
Timer1.Enabled := True;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
Timer1.Enabled := False;
Timer1.Interval := 500; // 500 ms
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
// pasaron 0,5 segundos desde el ultimo scroll, habilitar evento
Timer1.Enabled := False;
if not Assigned(ClientDataSet1.AfterScroll) then
begin
ClientDataSet1.AfterScroll := ClientDataSet1AfterScroll;
// hay que llamar al evento
ClientDataSet1AfterScroll(ClientDataSet1);
end;
end;


Rustico, pero puede servir :)

olbeup
17-12-2015, 09:10:18
Hola Delfino,

Yo lo resuelvo con esto:

procedure TForm1.AfterScroll(DataSet: TDataSet);
begin
if DataSet.ControlsDisabled then
Exit;

...
...
...
end;

Un saludo.

Delfino
17-12-2015, 09:48:58
Hola Delfino,

Yo lo resuelvo con esto:

Código Delphi [-] (http://www.clubdelphi.com/foros/#)procedure TForm1.AfterScroll(DataSet: TDataSet); begin if DataSet.ControlsDisabled then Exit; ... ... ... end;

Un saludo.

Excelente truco donde los haya ;)
Gracias olbeup, me sirvio..