Compilação Condicional
Diretivas de compilação condicional podem facilitar bastante a vida do desenvolvedor. Pacotes grandes de componentes as utilizam para customizar a sua instalação, configurando preferências do usuário e adaptando-se à versão do Delphi em uso. Eu uso compilação condicional no dia-a-dia para lidar com tarefas rotineiras de desenvolvimento. As que eu uso mais frequentemente são NOLOGIN, LOCALHOST e DEBUG.
{$IFDEF NOLOGIN}
Sabe quando você precisa passar sucessivamente vezes pelo ciclo “editar-compilar-executar” e é obrigado a passar toda hora pela chateação de fazer login na sua própria aplicação? Você não sente que é um abuso isso? Afinal, você é o pai, o criador, o gênio por traz daquele sistema que tem a desfaçatez de exigir a sua identificação! Logo você, que ensinou tudo que ele sabe. É uma falta de respeito.
Você pode resgatar a sua autoridade de Criador perante a sua aplicação desabilitando o login no código com uma simples diretiva condicional que indique você quer fazer um login automático com o seu (todo-poderoso) usuário de desenvolvedor e pular a caixa de diálogo de login. Você só precisa escrever uma vez algo como:
{$IFDEF NOLOGIN} CodigoUsuario := 1; NomeUsuario := 'Meu Nome'; {$ELSE} if not Login(CodigoUsuario, NomeUsuario) then begin ShowMessage('Usuario inválido'); Application.Terminate; end; {$ENDIF}
A princípio, o código entre {$IFDEF} e {$ELSE} será simplesmente ignorado pelo compilador, porque a diretiva NOLOGIN não existe ainda. Somente o código entre {$ELSE} e {$ENDIF} será executado, que seria o código regular para ambiente de produção.
Basta escrever NOLOGIN no campo “Conditional defines” de “Project | Options…”, dar um Build no seu projeto (importante!) e a diretiva {$IFDEF NOLOGIN} será avaliada como verdadeira pelo compilador. Aí o código entre {$IFDEF} e {$ELSE} será compilado e o código entre {$ELSE} e {$ENDIF} é que será ignorado. Dessa forma podemos configurar o programa sem alterar o código e sem deixar vestígios do código de testes no executável de produção.
É importante entender que as diretivas de compilação são interpretadas em tempo de compilação, não de execução. As diretivas de compilação condicional só podem ser definidas nas opções do projeto (”Conditional defines”) ou no próprio código, através da diretiva {$DEFINE xxx} e serão avaliadas uma única vez durante o build do projeto. Nenhum código adicional é gerado para a interpretação de diretivas de compilação.
{$IFDEF LOCALHOST}
Você já precisou ficar alternando a configuração do componente de conexão de banco de dados (ou de servidor de aplicação) entre o endereço do servidor local e do servidor de produção? Alguma vez já esqueceu de reconfigurar para produção o projeto e mandou para os usuários por engano um executável que procurava o servidor na máquina do próprio usuário? Uma boa idéia é definir uma diretiva de compilação condicional para indicar que está em fase de desenvolvimento e quer usar uma conexão local.
No evento OnCreate do data module onde estão os componentes de conexão, adicione um código como esse:
{$IFDEF LOCALHOST} Connection.Host := 'localhost'; {$ELSE} Connection.Host := 'myserver'; {$ENDIF}
Este exemplo supõe uma propriedade Host no componente de conexão, mas pode ser adaptada facilmente para qualquer tipo de conectividade com o servidor de banco de dados ou servidor de aplicação. A idéia é sempre a mesma: configurar por código o componente para conectar na máquina do desenvolvedor ou no servidor de produção, conforme o caso.
{$IFDEF DEBUG}
DEBUG é uma diretiva condicional bem comum. Geralmente é usada pra escrever em logs, mostrar mensagens de debug e qualquer outra medida de apoio a testes. É bem mais prático e seguro que ficar colocando e retirando comentários em torno do código de debug toda hora.
Por exemplo:
{$IFDEF DEBUG} ShowMessage('Passei por aqui'); Log('O valor da variável ''x'' era ' + IntToStr(x)); {$ENDIF}
Conclusão
Faz sentido usar uma diretiva de compilação quando você precisa frequentemente ativar e desativar blocos de código. Seja criativo e invente novas aplicações úteis à sua rotina de trabalho.
Comments
One Response to “Compilação Condicional”
Deixe uma Resposta

Muito bom! Sou um leitor de feed. Sempre quis saber como usar essas diretivas, mas nunca lembrava de ir atrás.
Ótimo artigo!