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

Leitores, hoje é dia de assunto inédito no blog!
Você sabiam que é possível programar ações personalizadas na IDE do Delphi? Com algumas Interfaces especiais, chamadas de Open Tools API, podemos adicionar novos menus na IDE para executar ações específicas, codificadas por nós mesmos.
Para exemplificar este recurso, desenvolveremos um visualizador de DataSets em runtime que ficará disponível no menu Help do Delphi.

Introdução

Você provavelmente utiliza – ou já utilizou – add-ins no Delphi para aprimorar a produtividade, como o GExperts, MMX, CnPack ou o DDevExtensions, certo? Essas extensões são tecnicamente conhecidas como “wizards” no RAD Studio e geralmente adicionam um novo menu na IDE do Delphi com várias opções para auxiliar nas atividades de programação. Porém, alguma vez você já se perguntou como estes wizards foram criados?

A resposta é simples. A Embarcadero disponibiliza um conjunto de Interfaces para trabalhar com as propriedades internas da IDE, chamadas de Open Tools API. Através dessas Interfaces, podemos, por exemplo, acessar o menu da IDE, o Project Manager, o editor de códigos ou a paleta de componentes. Com essa liberdade, é possível “estender” a IDE, adicionando ações personalizadas conforme desejamos. O uso dessas Interfaces é extremamente útil, por exemplo, para desenvolver add-ins que aprimorem a produtividade dos desenvolvedores de uma equipe.

Para este artigo, faremos um wizard bem simples, mas muito útil, para visualizar os dados de um DataSet em tempo de execução (runtime). Essa funcionalidade pode nos ajudar bastante no rastreamento de erros e na análise da execução de rotinas. Imagine, por exemplo, que uma exceção esteja ocorrendo na iteração dos registros de um DataSet em uma classe não-visual. A princípio, não conseguimos verificar os dados que estão carregados naquele momento de maneira fácil. Seria interessante, portanto, se houvesse uma forma de exibir esses dados em uma Grid, não acham? 🙂

Bom, vamos partir para o hands-on!

1) Criar um pacote para adicionar o wizard

Existem basicamente dois meios de distribuir um wizard: por pacote ou por DLL. Neste artigo, abordaremos a primeira modalidade por ser mais didático.

Acesse o menu File > New > Other e selecione Package na janela New Items. O nome e diretório do pacote é de sua preferência.

2) Adicionar a referência ao “designide.dcp” na seção Requires

Essa inclusão nos permitirá ter acesso às bibliotecas do Open Tools API em design-time. O arquivo “designide.dcp” está localizado na pasta ..lib\win32\release\ do RAD Studio. Para adicioná-lo, clique com o botão direito na seção Requires e acione a opção Add Reference, informando-o no campo Package Name.

Inclusão da referência ao arquivo "designide.dcp" na seção Requires

3) Adicionar uma nova unit no pacote

Só precisaremos de uma única unit para criar o nosso wizard. Clique com o botão direito no pacote e acesse o menu Add New > Unit, nomeando-a com o nome que desejar. A nova unit será anexada à seção Contains do pacote.

Inclusão de uma nova unit na seção Contains

4) Escrever a classe

Antes de iniciar, adicione a unit ToolsAPI na uses da unit para utilizarmos as Interfaces.

Pois bem, para que o Delphi reconheça o nosso pacote como um wizard, a classe deverá implementar a Interface IOTAWizard, na qual exige a implementação dos oito métodos descritos abaixo:

No nosso exemplo, implementaremos somente os quatro métodos a seguir:

  • GetState: para indicar se o wizard está habilitado;
  • GetIDString: para informar o identificador do wizard;
  • GetName: para informar o nome do wizard;
  • Execute: ação que o wizard irá executar.

Os outros métodos podem ficar vazios.

Uma vez que a nossa classe implementa a Interface IOTAWizard, podemos registrá-la com o método RegisterPackageWizard, informando uma instância da classe como parâmetro. A chamada deste método deve ser declarada dentro do procedimento padrão de registro de componentes do Delphi, ou seja, com o método Register. Na verdade, essa etapa é semelhante ao registro de componentes do Delphi, quando usamos o RegisterComponents.

Neste momento, ao instalar o pacote (botão direito > Install), o wizard já será automaticamente registrado na IDE. Porém, se você navegar pelos menus do Delphi, não irá encontrá-lo. O motivo é que ainda não programamos o código para que ele fique visível. Avançaremos, então, para o próximo passo.

5) Implementar a Interface IOTAMenuWizard

Já sabemos que, no Delphi, uma classe pode implementar várias Interfaces, correto? Bom, este será o nosso caso. Além de IOTAWizard, a classe também implementará a Interface IOTAMenuWizard, que exige apenas a implementação do método GetMenuText. Este método, conforme já podemos presumir, é o texto do menu que aparecerá na IDE do Delphi:

Opa, agora, sim!

Quando instalarmos novamente o nosso pacote, um novo submenu será adicionado no menu Help > Help Wizards do Delphi, conforme ilustrado na imagem abaixo.

Menu do wizard visível na IDE do Delphi

Por fim, ao clicarmos no menu, a mensagem que codificamos no método Execute será exibida:

Ação do wizard ao clicar no menu

Interessante, não? 🙂

Nota: caso você receba uma mensagem informando que não foi possível instalar o pacote, desinstale-o primeiro (botão direito > Uninstall) antes de instalá-lo novamente. Na verdade, ao realizar as alterações na unit, não é necessário reinstalar o pacote. A operação de Build, por si só, já atualiza o binário gerado, refletindo as alterações no wizard.

Na próxima parte do artigo, trabalharemos exclusivamente no método Execute, que ficará responsável por salvar os dados do DataSet.

Até amanhã, pessoal!


[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