Criando modelos formais de projetos para a IDE

No artigo anterior explicamos como usufruir de modelos de maneira mais informal, onde é uma solução simples e prática para o dia a dia, especialmente quando estamos tratando apenas de arquivos fontes e formulários. No entanto, a informalidade tem seu preço: má documentação e organização, por isso é bom ter o costume de ser organizado e documentar bem os arquivos usados para modelos.

Neste novo artigo veremos como criar modelos formais baseados nas instruções (em inglês):

https://wiki.lazarus.freepascal.org/Project_Templates

Ao final deste artigo, você estará apto a quando o usuário ir em File|New, e seus modelos serem listados diretamente na IDE, com explicação para cada uma delas:

A IDE com nossos modelos personalizados de projetos

Visão Geral

O IDE Lazarus permite registrar seus próprios tipos de projeto por meio de pacotes de designtime. O pacote projtemplates que vem pré-instalado permite simplesmente usar projetos existentes como templates.

Definindo a pasta de modelos(templates)

A primeira coisa que é preciso fazer é definir onde será nosso repositório de modelos, você pode escolher uma pasta compartilhada na rede ou um repositório local, mas eu prefiro uma pasta local com controle de versionamento usando git. Esta ultima é sensivelmente melhor e decentralizado.

Vá em Tools|Project Template Options…

Definindo a pasta de modelos(templates)

No exemplo acima, nossos modelos estarão em c:\projetos-fpc\laztemplates.

Regras claras

Siga as seguintes regras ou as coisas não funcionarão como esperado:

  • Dentro de nosso repositório deve ser criado uma subpasta para cada modelo.
  • Cada diretório é um modelo de projeto.
  • Referencias a variáveis – falamos delas adiante – devem conter dois underlines __ antes e depois do seu nome, sempre conte-os. Então se criar uma variável MAINUNIT para servir de nome da unit, então a unit que a usará deverá se chamar __MAINUNIT__ . Você não sabe o tamanho da zebra quando faz isso errado.
  • Seu modelo deve ser funcional, resumidamente, se não compila 100% então não use.

Criando nosso primeiro modelo

No nosso repositório de modelos – c:\projetos-fpc\laztemplates – crie uma pasta chamada “dialogo” e dentro dela crie um arquivo chamado project.ini com o seguinte conteúdo:

[Project]
Name=Projeto básico com DATAMODULE+TDI
Author=Gladiston Santana <email@servidor.com>
Description=Um projeto basico com datamodule e form principal TDI.
Recurse=0
Exclude=.gitignore;leiame.txt

O formato é padrão .ini e é bem simples e fácil de entender por si só, mesmo assim vamos a explicação:

  • Name: Nome do projeto/modelo. O nome e a descrição que será apresentado quando na IDE você selecioanr File|New…
  • Author: Autor do modelo, no caso de duvidas no uso, a equipe poderá procurar o autor.
  • Description: Descrição em uma única linha a respeito do projeto/modelo.
  • Recurse: Se as subpastas serão copiadas também ou não. Se sim, use “1”, caso contrário “0”.
  • Exclude: nomes de arquivos separados por virgula ou ponto-e-virgula que deverão ser ignorados durante a cópia para o novo projeto.

Ainda há seção chamada [Variables] onde adicionamos variáveis, elas nos permitem controlar os nomes de arquivos, formulários e objetos usados dentro do nosso projeto/modelo. Adicione ao arquivo project.ini o seguinte conteúdo:

[Variables]
MAINUNIT=Nome para o arquivo unit.pas principal|fprincipal
MAINFORM=Nome do formulário|fmPrincipal

Note que após a descrição há uma barra vertical conhecida como pipe |, o valor após ela será considerado o valor padrão.

Vamos a explicação, quando o modelo for selecionado, o IDE perguntará ao desenvolvedor os valores para MAINUNIT e MAINFORM, essas variáveis já virão com os valores pré-definidos como respectivamente fprincipal e fmPrincipal que podem ser modificados ou confirmados. Após a confirmação, os modelos serão copiados para dentro do projeto, mas onde houver __MAINUNIT __ e __MAINFORM__, dentro do seus arquivos ou fora deles, será substituído pelos valores informados. Além das variáveis que você pode criar, duas variáveis que sempre existirão:

  • ProjDir: Diretorio do projeto
  • ProjName: Nome do Projeto

Você entenderá melhor o funcionamentos das variáveis com o exemplo prático, mas com a experiência saberá quando melhorar essa habilidade.

Copie os arquivos necessários

Copie os arquivos do projeto/modelo que você deseja que sejam usados (*.lfm, *.pas, *.ico, *.lpi, *.lpr, *.res) para este novo diretório. Apenas uma sugestão, depois de copiar o projeto/modelo para a pasta do repositório, abra-o e faça as seguintes modificações:

  • Renomeie o projeto para __ProjName__.lpr.
  • Renomeie a unidade principal para __MAINUNIT__.pas e o nome desse formulário como __MAINFORM__.

Muito cuidado com a quantidade de underline(_), são apenas duas antes e depois do nome.

Este projeto deverá conter o básico de um projeto como tela de login, principal, configuração, datamodule, componentes de acesso, imagelist com imagens inclusas, etc… mas somente o que todo projeto para ser iniciado precisa, evite colocar coisas que nem todo projeto terá.

Vai ficar mais ou menos assim:

Pasta do modelo contendo todos os arquivos necessários

Reinicie o Lazarus

Os modelos só são visto durante a carga do Lazarus, por isso terá de reiniciar o Lazarus caso ele esteja em execução. Após carregar o Lazarus então verá os novos modelos que foram adicionados.

Nosso modelo poderá ser observado em File|New project from template:

E também pode ser observado em File|New… ou Project|New…

Nosso modelo está registrado na IDE

Quando você selecionar um modelo, veja o que acontece com as variáveis que criamos:

Todas as variáveis são confirmadas antes de processar a cópia e uso do modelo

Isso mesmo, as variáveis serão usadas para determinar o nome da unidade e do formulário principal.

CONCLUSION

Os modelos para projetos agilizam o processo de criação de novos projetos. Normalmente não criamos nada, apenas pegamos algo que já fizemos antes e adaptamos, por isso, relatórios, consultas REST, exportações e importações de arquivo, etc… deveriam ter modelos porque é o que fazemos em nosso dia dia. Quando um membro da equipe for incumbido de uma tarefa, saberá que há modelos existentes para se basear.