
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