O Poder dos Wizards: Extensão do Delphi com a Open Tools API
Neste artigo veremos 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.
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.
"
[...] continue lendo...
Artigos relacionados
-
Artigo
-
Artigo
-
Artigo
-
Artigo
-
Artigo