Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   AfterScroll Suave con DBGrid Scroll (https://www.clubdelphi.com/foros/showthread.php?t=89578)

Delfino 16-12-2015 17:43:44

AfterScroll Suave con DBGrid Scroll
 
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

Código Delphi [-]
  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

Código Delphi [-]
  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?

Código Delphi [-]
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:

Código Delphi [-]
procedure TForm1.AfterScroll(DataSet: TDataSet);
begin
  if DataSet.ControlsDisabled then
    Exit;

  ...
  ...
  ...
end;
Un saludo.

Delfino 17-12-2015 09:48:58

Cita:

Empezado por olbeup (Mensaje 500634)
Hola Delfino,

Yo lo resuelvo con esto:

Código Delphi [-]procedure TForm1.AfterScroll(DataSet: TDataSet); begin if DataSet.ControlsDisabled then Exit; ... ... ... end;

Un saludo.

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


La franja horaria es GMT +2. Ahora son las 11:24:24.

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