Esse artigo faz parte da revista Clube Delphi edição 27. Clique aqui para ler todos os artigos desta edição



Atenção: por essa edição ser muito antiga não há arquivo PDF para download. Os artigos dessa edição estão disponíveis somente através do formato HTML.

O Poder dos Wizards

Extensão do Delphi com a Open Tools API

Neste artigo irei abordar um recurso muito poderoso – a capacidade do ambiente de desenvolvimento do Delphi ser estendido pelo programador. Usando a Open Tools API, vamos criar um Wizard completo e explorar as interfaces necessárias para o desenvolvimento de Wizards.

Nova API

Um fato importante é que veremos a nova Open Tools API, baseada em interfaces COM. Quem já tiver desenvolvido algum projeto baseado em COM, provavelmente terá mais facilidade no entendimento das técnicas empregadas. Embora o uso de interfaces para delegar responsabilidades não seja uma técnica muito comum no Delphi, ela é bastante utilizada em outras linguagens.

Simplificando, podemos explicar o processo dessa forma: definimos classes que implementam as interfaces que desejamos e depois registramos estas classes. No momento adequado, a IDE chama os métodos definidos nas interfaces que implementamos, executando então nosso código. Podemos, ainda, obter referências para interfaces implementadas pela própria IDE, através das quais temos acesso a várias tarefas do Delphi/Kylix, como fechar todos os arquivos abertos, compilar um projeto etc.

A nova Open Tools API é cross-platform e baseada principalmente na unit ToolsAPI.pas. Esta unit é uma excelente fonte de informação sobre a API.

Wizards

Vamos ao estudo dos Wizards, muito comuns nas ferramentas visuais. Os Wizards, ou "assistentes", são normalmente criados para nos auxiliar em tarefas repetitivas, agilizando assim o desenvolvimento. Um exemplo simples é o Wizard para criação de um "Thread Object" (File | New > Thread Object) do próprio Delphi/Kylix (veja a Figura 1).

Nesse Wizard, basta que forneçamos o nome da classe desejada para que seja gerada automaticamente uma unit com a definição de um novo descendente de TThread. Dessa forma, não temos o trabalho de criar uma nova unit, criar a definição da classe etc.

Figura 1. Exemplo de Wizard no Delphi – criação de threads

Interface IOTAWizard

Antes de passarmos à prática vamos analisar as interfaces envolvidas na criação de Wizards. Começaremos com a IOTAWizard, que deve ser implementada obrigatoriamente para qualquer tipo de Wizard. Os métodos dessa interface, com exceção do método Execute, têm implementação trivial – são apenas configurações básicas do Wizard. No método Execute é colocada toda a funcionalidade do Wizard.

 

IOTAWizard

GetIDString: String

Retorna uma string que servirá como um ID único no ambiente. Normalmente é usado o formato NomeDoAutor.NomeDoExpert.

GetName: String

Retorna o nome do Wizard que será visualizado.

GetState: TWizardState

O retorno indica que o Wizard está “Enabled” e/ou “Checked”. Esta configuração tem efeito apenas em Wizards de menu.

Execute

Esta procedure é chamada quando for solicitado à IDE a execução deste Wizard. Aqui devemos programar o que nosso Wizard fará.

Interface IOTANotifier

Um detalhe importante a ser observado é que a interface IOTAWizard descende de IOTANotifier.  Portanto, a classe que implementar IOTAWizard terá que implementar também IOTANotifier. Analisando a unit ToolsApi.pas, no entanto, vemos que nenhum dos métodos dela é essencial para a implementação de Wizards. Justamente por isso, é provida uma classe chamada TNotifier, que declara métodos com os mesmos nomes daqueles na interface IOTANotifier, mas com implementação vazia. Dessa forma, para não precisarmos implementar os métodos de IOTANotifier podemos descender nossa classe de TNotifier, desta forma:

 

TWizardClass = class(

  TNotifier,

  IOTAWizard, ...)

Se, mesmo assim, optarmos por não usar a classe TNotifier, podemos usar a classe TInterfacedObject e prover implementação para os métodos da interface IOTANotifier. A declaração ficaria assim:

 

TWizardClass = class(

   TInterfacedObject,

   IOTANotifier,

   IOTAWizard, ...)

Wizards de Menu

Vejamos agora as formas de visualização dos Wizards. Neste artigo abordaremos os Wizards de menu e de "repository". Wizards de menu são muito simples de implementar. Basta que, além da IOTAWizard, seja implementada a interface IOTAMenuWizard, que tem um único método, GetMenuText.

 

IOTAMenuWizard

GetMenuText: String;

Retorna o Caption do item de menu usado para chamar o Wizard. Ele aparecerá como subitem do menu Help do Delphi. Este método é chamado todas as vezes que o menu Help é aberto, portanto seu valor de retorno pode ser alterado dinamicamente.

Wizards de repository

Para implementar um Wizard de repository, além da IOTAWizard, devemos implementar também IOTARepositoryWizard e IOTAFormWizard.

 

IOTARepositoryWizard

GetAuthor: String;

Deve retornar uma string contendo o nome do autor do Wizard.

GetComment: String;

Deve retornar um comentário a respeito do Wizard, normalmente descrevendo sua função.

GetPage: String;

Deve retornar o nome da página do Object Repository na qual o ícone de chamada do Wizard deverá aparecer. Por exemplo "New", "ActiveX", "Multitier" etc.

...

Quer ler esse conteúdo completo? Tenha acesso completo