[Delphi] Visualizador de DataSets com Open Tools API – Notificador

Finalmente chegamos ao fim dessa pequena série sobre Open Tools API. Agradeço a todos vocês por terem acompanhado e compartilhado os artigos!
Essa última parte, na verdade, envolve a implementação de uma melhoria para solucionar um problema de conflito de acesso ao arquivo de dados gerado. Para isso, utilizaremos uma Interface do Open Tools API chamada IOTAThreadNotifier. Let’s do it!

Notificador na thread

Em termos gerais, o nosso wizard já está praticamente pronto, porém, instável. Conforme mencionado no artigo anterior, o desenvolvedor pode receber eventuais erros informando que o arquivo já está sendo utilizado por outro processo, que, neste caso, é a própria geração do arquivo. Quando isso ocorre, significa que a avaliação da expressão demorou um pouco mais do que o esperado.

Como solução, adicionaremos um notificador na thread para que seja possível identificar o término da avaliação da expressão.

Lembram-se que mencionei os valores de retorno do método Evaluate na segunda parte da série? Apenas para recordá-los, são eles: erOK, erError, erDeferred e erBusy. Observem também que, antes de abrir o visualizador, verifico se os valores são diferentes de erError e erBusy. Bom, já que erOK indica que foi a avaliação foi executada com sucesso, então o que seria o erDeferred?

Bom, este retorno indica que o método Evaluate está utilizando threads adicionais e/ou acessando outros contextos para avaliar a expressão, logo, não podemos considerá-lo como um erro de execução. O nosso dever é adicionar uma instrução de espera até que a avaliação seja concluída. Pois bem, a Interface IOTAThreadNotifier nos fornece esse mecanismo. Acompanhe os passos.

1) Incluir IOTAThreadNotifier na lista de implementações da classe

Além de IOTAWizard e IOTAMenuWizard, adicionaremos também a Interface IOTAThreadNotifier na lista de implementações, na qual exige a implementação de três métodos:

Porém, o único método que nos interessa é EvaluteComplete. Curiosamente, o nome do método está incorreto – falta um “a” em “Evalute”. Mesmo assim, pelo nome, já podemos deduzir que este método é chamado sempre que o depurador termina a avaliação de uma expressão. É o que precisamos.

Com esse recurso, faremos o seguinte: quando o retorno do método Evaluate for erDeferred, utilizaremos uma variável boolean para identificar que a avaliação da expressão foi concluída, definindo-a como True no método EvaluteComplete.

Vamos prosseguir com os próximos passos.

2) Declarar a variável boolean na seção private

3) Atribuir True ao término da avaliação da expressão

4) Alterar o método Execute para adicionar a rotina de espera

Nesse passo, faremos uso de um método chamado ProcessDebugEvents dentro de uma instrução while para que a thread processe os eventos de depuração pendentes. Este método pode ser comparado ao Application.ProcessMessages que utilizamos em algumas ocasiões. Além disso, como a nossa classe já implementa a Interface IOTAThreadNotifier, podemos adicioná-la como “observadora” da thread, de forma que o EvaluteComplete seja chamado para alterar o valor da nossa variável. Confira a codificação a seguir:

Problema solucionado! Com essa alteração, certificamos de que o arquivo sempre estará disponível quando o formulário carregá-lo.

Melhorias no wizard

Pessoal, o principal objetivo dessa série de artigos foi apresentar e demonstrar os recursos do Open Tools API, mas, mesmo assim, nada impede que você aplique algumas melhorias no código, como condições de guarda para verificar se existe um texto selecionado no editor, bem como garantir que o processo de depuração (CurrentProcess) e a thread (CurrentThread) estão acessíveis ao acionar o menu.

No formulário de dados, por sua vez, uma boa ideia é adicionar novos campos para exibir o filtro do DataSet (propriedade Filter), índices (propriedade IndexFieldNames) e a quantidade de registos (propriedade RecordCount). Quanto mais informações para análise, melhor! 🙂

O wizard da DB1

Na DB1 Group, empresa em que trabalho, desenvolvi um wizard com o Open Tools API, mas não somente para criar um visualizador de DataSets.

Tirei proveito das Interfaces para adicionar também atalhos para ferramentas externas, configurações de acesso às bases de dados, compilações de conjuntos de projetos e algumas rotinas de apoio específicas do projeto que trabalhamos. Só pelo fato de estarem acessíveis diretamente na IDE do RAD Studio, conforme demonstrado na imagem abaixo, contribuiu muito para a produtividade da equipe de desenvolvimento.

Imagem do wizard desenvolvido para a DB1

Fico por aqui, amigos! Toda a codificação abordada nessa série de artigos está disponível no GitHub:

https://github.com/AndreLuisCelestino/Exemplos-Blog/tree/master/PacoteWizard

Espero essa série de artigos tenha sido útil. Nos vemos em breve!


[Delphi] Visualizador de DataSets com Open Tools API – Pacote
[Delphi] Visualizador de DataSets com Open Tools API – Evaluate
[Delphi] Visualizador de DataSets com Open Tools API – Formulário
[Delphi] Visualizador de DataSets com Open Tools API – Notificador


André Celestino