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