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
Confira outros conteúdos:
Por
Fernando
Em 2009
Crie sua conta grátis e baixe o e-book
Dê um upgrade no início da sua jornada.
Perguntas frequentes
Quem somos?
Por que a programação se tornou a profissão mais promissora da atualidade?
Como faço para começar a estudar?
Em quanto tempo de estudo vou me tornar um programador?
Sim, você pode se tornar um programador e não precisa ter diploma de curso superior!
O que eu irei aprender estudando pela DevMedia?
Principais diferenciais da DevMedia
Qual o investimento financeiro que preciso fazer para me tornar um programador?
Nossos casos de sucesso
Eu sabia pouquíssimas coisas de programação antes de começar a estudar com
vocês, fui me especializando em várias áreas e ferramentas que tinham na plataforma, e com essa
bagagem consegui um estágio logo no início do meu primeiro
período na faculdade.
Estudo aqui na Dev desde o meio do ano passado!
Nesse período a Dev me ajudou a crescer muito aqui no trampo.
Fui o primeiro desenvolvedor contratado pela minha
empresa. Hoje eu lidero um time de desenvolvimento!
Minha meta é continuar estudando e praticando para ser um
Full-Stack Dev!
Economizei 3 meses para assinar a plataforma e sendo sincero valeu muito a
pena, pois a plataforma é bem intuitiva e muuuuito
didática a metodologia de ensino. Sinto que estou EVOLUINDO a cada dia. Muito
obrigado!
Nossa! Plataforma maravilhosa. To amando o curso de desenvolvimento
front-end, tinha coisas que eu ainda não tinha visto. A
didática é do jeito que qualquer pessoa consegue aprender. Sério, to apaixonado,
adorando demais.
Adquiri o curso de vocês e logo percebi que são os melhores do Brasil. É
um passo a passo incrível. Só não aprende quem não quer.
Foi o melhor investimento da minha vida!
Foi um dos melhores investimentos que já fiz na vida e tenho aprendido
bastante com a plataforma. Vocês estão fazendo parte da minha jornada nesse mundo da
programação, irei assinar meu contrato como programador
graças a plataforma.
Wanderson Oliveira
Comprei a assinatura tem uma semana,
aprendi mais do que 4 meses estudando outros cursos. Exercícios práticos que não tem
como não aprender, estão de parabéns!
Obrigado DevMedia, nunca presenciei uma plataforma de ensino tão presente na vida acadêmica de
seus alunos, parabéns!
Eduardo Dorneles
Aprendi React na plataforma da DevMedia há cerca de 1 ano e meio... Hoje estou há 1 ano empregado trabalhando 100% com
React!
Adauto Junior
Já fiz alguns cursos na área e nenhum é tão bom quanto o de vocês. Estou aprendendo
muito, muito obrigado por existirem. Estão de parabéns... Espero um dia conseguir um emprego na
área.