Advertisement
Guest User

obter progresso de uma consulta com CallBack

a guest
Aug 10th, 2018
75
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Delphi 3.95 KB | None | 0 0
  1.  
  2.  
  3.  
  4. {Hoje quero me concentrar em um tópico que me foi solicitado
  5. muitas vezes: como podemos obter o progresso de uma consulta
  6. em execução e como podemos até cancelá-la? O Advantage Data
  7. Architect faz isso, então deve ser possível;)
  8. Olhando para as fontes de TAdsExtendedDataSet (adsfunc.pas),
  9. você encontrará métodos wrapper em torno de duas funções da API ACE:
  10. AdsRegisterCallbackFunction101 e AdsClearProgressCallback.
  11. TAdsExtendedDataSet é um ancestral de TAdsQuery, portanto, ele herda esses métodos.}
  12.  
  13. {**********************************************************
  14. *  Module:  TAdsExtendedDataSet.AdsRegisterCallbackFunction101
  15. *  Date Created:  4-25-2012
  16. *  Description:
  17. **********************************************************}
  18.  
  19.  
  20. procedure  TAdsExtendedDataSetTAdsExtendedDataSet.AdsRegisterCallbackFunction101(
  21.                                             Value : TAdsCallbackFunction101; qCallbackID : Int64Int64);
  22. begin
  23.       ACECheck2( self, ACEACECheck2( self, ACE.AdsRegisterCallbackFunction101(
  24.                                                                         TCallbackFunction101( Value ),qCallbackID ));
  25. end;;
  26.  
  27. {**********************************************************
  28. *  Module:  TAdsExtendedDataSet.AdsClearCallbackFunction
  29. *  Date Created:  05/24/2001
  30. *  Description:
  31. **********************************************************}
  32. procedure  TAdsExtendedDataSet.AdsClearCallbackFunction;
  33. begin
  34.       ACECheck2( self, ACECheck2( self, ACE.AdsClearCallbackFunction );
  35. end;
  36.  
  37. {Como você pode ver, para registrar um retorno de chamada, você precisa
  38. passar um ponteiro de função (não ponteiro de método!)
  39. E um identificador de retorno de chamada. A função de retorno de chamada
  40. é definida da seguinte forma:}
  41.  
  42.  
  43. { This data type defines what type of function to pass to
  44.   AdsRegisterCallbackFunction(). }
  45. TCallbackFunction101 = function( usPercent: Word; qCallbackID: Int64 ): Longint;
  46.  
  47.  
  48.  
  49. {Na verdade, existem duas definições de funções diferentes sendo usadas: uma é
  50. válida para o Delphi anterior ao Delphi 4 (ponteiro de 32 bits) e a outra para
  51. o Delphi 4 e mais recente (ponteiro de 64 bits). Isso deve ser mantido em mente
  52. se for usado de maneira geral. No meu exemplo, concentro-me apenas nas versões
  53. mais recentes do Delphi.
  54. Agora há uma pergunta sobre como combinar uma função e um objeto, para que a
  55. função de retorno de chamada (geral) possa atualizar o objeto. A solução é fácil
  56. - e muito perigosa ao mesmo tempo: use o identificador de retorno de chamada para
  57.  
  58. passar um ponteiro para o objeto e devolvê-lo à função de retorno de chamada.
  59. Para o meu exemplo, adicionei um método público ao meu Mainform.}
  60.  
  61.  
  62. public
  63.   function QueryCallback(usPercent: word):longint;
  64. {Esse método faz uma atualização na barra de progresso do mainform e verifica
  65. se há um sinalizador (bcancel, definido pelo evento “stop button click”).
  66. Se o valor de retorno do método for diferente de 0, a consulta deve ser interrompida.}
  67.  
  68.  
  69.  
  70. function TMainform.QueryCallback(usPercent: word): longint;
  71. begin
  72.   ProgressBar1.Min:=0;
  73.   ProgressBar1.Max:=100;
  74.   ProgressBar1.Position:=usPercent;
  75.   Application.ProcessMessages;
  76.   if bcancel then result:=1
  77.   else result:=0;
  78. end;
  79.  
  80. {A função de retorno de chamada está sendo chamada a cada 2 segundos pelo Advantage
  81. Client Engine até que a consulta seja concluída. Dentro da função, pegamos o ponteiro
  82. e o convertemos para o TMainform antes de chamar o método QueryCallback.}
  83.  
  84.  
  85. // Callback useda para cancelar a query
  86. function ACECallback(usPercent:word; CallbackID:Int64):longint; stdcall;
  87. begin
  88.   result := TMainform(Pointer(CallbackID)).QueryCallback(uspercent);
  89. end;
  90.  
  91.  
  92. {Finalmente, registre a função a qualquer momento antes de abrir a consulta.
  93. Não se esqueça de apagar quando o retorno de chamada não estiver mais sendo necessário.}
  94.  
  95.  
  96.     bcancel:=false;
  97.     AdsQuery1.AdsRegisterCallbackFunction101(@ACECallback,Int64(self));
  98.     AdsQuery1.Open;
  99.     AdsQuery1.AdsClearProgressCallback();
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement