Performance - acelerando consultas com timer

Top  Previous  Next

================================ SOLUCAO 1 ====================================

 

var

  Tempo: TTime;

 

procedure TMainPagarForm.FormCreate(Sender: TObject);

begin

  AtualizaClient;

end;

 

procedure TMainPagarForm.ForneQyAfterScroll(DataSet: TDataSet);

begin

  Tempo            := Time; // reseta var

  AtuTimer.Enabled := True;

end;

 

procedure TMainPagarForm.AtuTimerTimer(Sender: TObject);

begin

  if MilliSecondOf(Time - Tempo) > 300 then

  begin

    AtuTimer.Enabled := False;

    AtualizaClient;

  end;

end;

 

================================ SOLUCAO 2 ====================================

 

Situação: Tem 2 grids cada uma ligada com uma tabela.

          A 2ª é resultado de calculos baseados no registro selecionado na 1ª grid.

--------------------------------------------------------------------------------------

Problema: Ao se pressionar seta acima ou abaixo na 1ª grid, o cursor vai

          "correr" os registros, porém isto pode fazer o scroll ficar "tussindo"

          ou seja lento por causa dos registros da 2ª grid que são calculos baseados

          na primeira. Entre os problemas, além de tussir e lentidão pode ocasionar

          problemas de visualização na 1ª grid.

--------------------------------------------------------------------------------------

Solução:  Só atualizar a 2ª grid quando os botões de navegação não estão pressionados

          e foi modificado o registro da 1ª grid.

--------------------------------------------------------------------------------------

Como faz: 1 - Crie uma procedure que irá atualizar a 2ª grid.

          2 - Crie uma procedure para limpar a 2ª grid.

          3 - Cria uma variável global que conterá um código que identifica qual

              registro está selecionada na 1ª grid.

          4 - No OnChange do DataSource da 1ª grid que caso esteja pressionada

              alguma tecla de navegação (cima,baixo,pgdown...) ele chama a procedure

              que limpa a grid.

          5 - No Timer (sugestão: 50 milisegundos): se a tabela não estiver ativa

              dá exit. Se a variável global for igual ao campo código (ou outro que

              representa registro único) então também dá exit.

              Se estiver pressionada tela de navegação também dá exit.

              Chama a procedure que atualiza grid.

              Seta a variável global para o campo código atual.

--------------------------------------------------------------------------------------

Conclusão: O programa vai ficar 500% mais rápido. Acredite, faça o teste, quanto

           mais complexo forem os cálculos para a 2ª grid mais rápido irá ficar

           a consulta com este novo código.

--------------------------------------------------------------------------------------

Exemplo:

 

var 

  CodigoAnterior : String;

 

procedure LimpaGrid;

begin

  // corre a grid (no caso de StringGrid) e coloca vazios

end;

 

procedure AtualizaGrid;

begin

  // Baseando-se na 1ª grid ele faz os cálculos necessários e preenche a 2ª grid.

end;

 

procedure OnChange_DataSource;

begin

  if KeyPressed(vk_down) or KeyPressed(vk_up) then LimpaGrid;

end;

 

procedure OnTimer;

begin

  if not Query.Active                         then Exit;

  if CodigoAnterior = Query.Campo('codigo')   then Exit;

  if KeyPressed(vk_down) or KeyPressed(vk_up) then Exit;

  AtualizaGrid;

  CodigoAnterior := Query.Campo('codigo');

end;