segunda-feira, 7 de abril de 2014

Tratando erros em ApplyUpdates com FIREDAC.


Quando invocamos o método ApplyUpdates em uma FDQuery devemos lembrar que exceções não serão geradas para a aplicação, porem o FireDac registra o erro em uma estrutura de registro de dados interna e continua a processar atualizações até que o número de erros seja igual ou superior a AMaxErrors.

Após chamar o método ApplyUpdates , devemos incluir rtHasErrors em FilterChanges para filtrarmos os registros que contenham erros. Em seguida, navegamos através do conjunto de dados e lemos a propriedade RowError que conterá um objeto de exceção associado ao registro atual. Como mostra o exemplo abaixo:

var
  oErr: EFDException;
begin
if FDQuery1.ApplyUpdate > 0 then begin
  FDQuery1.FilterChanges := [rtModified, rtInserted, rtDeleted, rtHasErrors];
  try
    FDQuery1.First;
    while not FDQuery1.Eof do begin
      oErr := FDQuery1.RowError;
      if oErr <> nil then begin
        raise Exception.Create(oErr.Message);
      end;
      FDQuery1.Next;
    end;
  finally
    FDQuery1.FilterChanges := [rtUnmodified, rtModified, rtInserted];
  end;
end;

terça-feira, 1 de abril de 2014

Aplicação Móvel efetuando chamadas. Delphi XE5.

Neste post vou mostrar um exemplo básico, porem muito interessante o qual iremos fazer chamadas a partir de uma aplicação  móvel desenvolvida com Delphi XE5. 
Criaremos então uma aplicação(FireMonkey Mobile) que terá apenas um TEdit e um TButton.





Antes de iniciarmos a implementação do código que ira efetuar a chamada, devemos adicionar a cláusula uses os seguintes Namespaces: FMX.PhoneDialer, FMX.Platform.








Agora, no evento OnClick do nosso botão  implementaremos o seguinte código.
TPlatformServices.Current.SupportsPlatformService retorna se o serviço passado como parâmetro está disponível na plataforma que o aplicativo está sendo executado. 




quinta-feira, 27 de março de 2014

Thread,Delphi. (Anonymous Thread)

O que é uma Thread.

Um bom motivo para usarmos Thread é quando precisamos executar um ou vários processos relativamente pesados, porem não queremos que nossa aplicação fique bloqueada devido a execução dos mesmo. Para criarmos uma Thread devemos invocar o método CreateAnonymousThread  o qual cria uma instância derivado de um TThread que simplesmente irá executar um método anônimo do tipo tproc passado como parâmetro na chamda do método. Quando invocamos o método CreateAnonymousThread   a Thread vem com a Property  FreeOnTerminate default True, o que faz com que a instancia da Thread seja destruída apos sua execução. Para manter a Thread criado set FreeOnTerminate = False, porem você deve destruir a instancia da Thread manualmente invocando o método Terminate; Vale lembrar que uma Thread é criada suspensa, para inicia-la você deve invocando o método Start().

Outra questão que devemos ter cuidado é quando necessitamos atualizar a tela, ou seja, manipular componentes visuais. Sempre que necessário devemos utilizar o método synchronize da Thread  onde os processos executados dentro deste método são direcionados para a Thread principal executar, pois os objetos da VCL não podem ser diretamente atualizados em uma Thread que não seja a principal.

Agora que já entendemos a teoria, vamos para a melhor parte. Usaremos de exemplo 2 TProgressBar, onde vamos alimentar o Position ao mesmo tempo e veremos que nossa aplicação em momento algum vai "Travar".


No botão "Normal" alimentaremos as TProgressBar dentro de um de instrução FOR de forma normal.

Já no botão Thread implementamos o mesmo código executado no botão normal, porem quem processa é a nossa Thread.


Implementaremos também no botão mensagem, onde executamos o método ShowMessage apenas para demostrar que nossa aplicação não está travada quando executado pela Thread.


Após executarmos nossa aplicação podemos concluir que usando uma Thread nosso aplicativo não ficou travado, como mostra o vídeo abaixo.