Olá, leitores!
Neste artigo iremos abordar o uso de diretivas de compilação com Delphi e também veremos vários exemplos do seu uso.
📥 Repositório com exemplos
O projeto de exemplo, pode ser encontrado e baixado em nosso GitHub no seguinte link: https://github.com/Code4Delphi/diretivas-de-compilacao-delphi
▶️ Vídeo de demonstração
🚀 O QUE SÃO DIRETIVAS DE COMPILAÇÃO
Uma diretiva de compilação é um comentário com uma sintaxe especial. A diretiva de compilação começa com um $ (sinal de dólar) como o primeiro caractere após o delimitador de comentário de abertura, imediatamente seguido por um nome (uma ou mais letras) que designa a diretiva específica. Você pode incluir comentários após a diretiva e quaisquer parâmetros necessários.
As diretivas de compilação podem ser colocadas onde quer que os comentários sejam permitidos. Exemplos de diretivas:
{$hints off}
(*$hints off*)DEFINIR/INDEFINIR
- CRIAR/DEFINIR UMA DIRETIVA
{$DEFINE NAME_DIRECTIVE_TEST}- DESATIVAR/INDEFINIR UMA DIRETIVA
{$UNDEF NAME_DIRECTIVE_TEST}CONDIÇÕES IF, ELSEIF E ELSE
- IF e ELSE PARA TESTAR SE A DIRETIVA ESTA DEFINIDA
{$IFDEF NAME_DIRECTIVE_TEST}
Memo1.Lines.Add('Diretiva NAME_DIRECTIVE_TEST está definida');
{$ELSE}
Memo1.Lines.Add('Diretiva NAME_DIRECTIVE_TEST NÃO está definida');
{$ENDIF}- IF, ELSEIF e ELSE
{$DEFINE VALOR_02}
{$IFDEF VALOR_01}
Memo1.Lines.Add('Diretiva VALOR_01 definida');
{$ELSEIF DEFINED(VALOR_02)}
Memo1.Lines.Add('Diretiva VALOR_02 definida');
{$ELSEIF DEFINED(VALOR_03)}
Memo1.Lines.Add('Diretiva VALOR_03 definida');
{$ELSE}
Memo1.Lines.Add('Diretivas VALOR_01, VALOR_02 E VALOR_03 não estão definidas');
{$ENDIF}- IF com NOT
{$IF NOT DEFINED(DIRETIVA_NOT)}
Memo1.Lines.Add('Diretiva DIRETIVA_NOT não definida');
{$ELSE}
Memo1.Lines.Add('Diretiva DIRETIVA_NOT definida');
{$ENDIF}CONSTANTES
- Verificar o valor de uma constantes
procedure TViewMain.btnComContantesClick(Sender: TObject);
const
VERSAO = 6.8;
begin
{$IF VERSAO <= 5}
Memo1.Lines.Add('Valor da constante VERSAO é menor ou igual 5');
{$ELSEIF (VERSAO > 5) AND (VERSAO <= 10)}
Memo1.Lines.Add('Valor da constante VERSAO é maior que 5 e menor que 10');
{$ELSE}
Memo1.Lines.Add('Valor da constante VERSAO é maior que 10');
{$IFEND}
end;- Verificar o valor de uma constantes Integer
procedure TViewMain.btnComContantesIntegerClick(Sender: TObject);
const
TEST_INTEGER: Integer = 3;
begin
{$IF SizeOf(TEST_INTEGER) <= 5}
Memo1.Lines.Add('Valor da constante TEST_INTEGER é menor ou igual 5');
{$ELSE}
Memo1.Lines.Add('Valor da constante TEST_INTEGER é maior que 5');
{$IFEND}
end;- Permitir a alteração do valor de constantes
procedure TViewMain.btnAlterarValorConstantesClick(Sender: TObject);
//NAO PERMITE ALTERAR CONSTANTES (E O PADRAO DA IDE) : {$J-} OU {$WRITEABLECONST OFF}
{$J-}
//PERMITE ALTERAR CONSTANTES : {$J+} OU {$WRITEABLECONST ON}
{$WRITEABLECONST ON}
const
MINHA_CONST: Integer = 2023;
begin
Memo1.Lines.Add('Valor da constante é: ' + MINHA_CONST.ToString);
MINHA_CONST := 2024;
Memo1.Lines.Add('Valor constante após alteração é: ' + MINHA_CONST.ToString);
end;- Ao definir um valor de constante
procedure TViewMain.btnAoDefinirValorDeConstantesClick(Sender: TObject);
const
{$IFDEF DEBUG}
DEBUG_OR_RELEASE = 'Debug';
{$ELSE}
DEBUG_OR_RELEASE = 'Release';
{$ENDIF}
begin
Memo1.Lines.Add('A IDE esta em modo: ' + DEBUG_OR_RELEASE);
end;
MESSAGES
- Gerar Messages ao compilar ou dar build no projeto (as mensagens geradas sao exibidas nas abas “Build” e “Output”)
//EMITS A HINT
{$MESSAGE 'Meu Hint teste ao compilar'}
//EMITS A HINT
{$MESSAGE Hint 'Mais um Hint ao compilar'}
//EMITS A WARNING
{$MESSAGE Warn 'Meu Warning teste ao compilar.'}
//EMITS AN ERROR, CONTINUES COMPILING
{$Message Error 'Exibe mensagem de erro, e não permite a continuação da compilação'}
//EMITS AN ERROR, TERMINATES COMPILER
{$Message Fatal 'Exibe mensagem de terminate, e não permite a continuação da compilação'}SISTEMAS OPERACIONAIS
- Verificar qual o Sistema Operacional
procedure TViewMain.btnSOClick(Sender: TObject);
var
LSO: string;
begin
{$IF LINUX}
LSO := 'LINUX';
{$ELSEIF DEFINED(MSWINDOWS)}
LSO := 'MSWINDOWS';
{$ELSEIF DEFINED(ANDROID)}
LSO := 'ANDROID';
{$ELSEIF DEFINED(IOS)}
LSO := 'IOS';
{$ELSEIF DEFINED(MACOS)}
LSO := 'MACOS';
{$ELSEIF DEFINED(POSIX)}
LSO := 'POSIX';
{$ELSE}
LSO := 'Não encontrada';
{$ENDIF}
Memo1.Lines.Add('Sistema operacional selecionado: ' + LSO);
end;DEBUG OU RELEASE
- Verificar se IDE está em Debug ou Release
procedure TViewMain.btnIdeEmDebugOuReleaseClick(Sender: TObject);
begin
{$IFDEF DEBUG}
Memo1.Lines.Add('Modo de Debug');
{$ELSEIF DEFINED(RELEASE)}
Memo1.Lines.Add('Modo de Release');
{$ELSE}
Memo1.Lines.Add('Modo diferente de Debug e Release');
{$ENDIF}
end;PLATAFORMAS
- Verificar qual a Plataforma
procedure TViewMain.btnPlataformasClick(Sender: TObject);
var
LPlataforma: string;
begin
{$IFDEF CONSOLE}
LPlataforma := 'CONSOLE';
{$ELSEIF DEFINED(WIN32)}
LPlataforma := 'WIN32';
{$ELSEIF DEFINED(WIN64)}
LPlataforma := 'WIN64';
{$ELSEIF DEFINED(LINUX32)}
LPlataforma := 'LINUX32';
{$ELSEIF DEFINED(LINUX64)}
LPlataforma := 'LINUX64';
{$ELSEIF DEFINED(ANDROID32)}
LPlataforma := 'ANDROID32';
{$ELSEIF DEFINED(ANDROID64)}
LPlataforma := 'ANDROID64';
{$ELSEIF DEFINED(IOS64)}
LPlataforma := 'IOS64';
{$ELSEIF DEFINED(MACOS32)}
LPlataforma := 'MACOS32';
{$ELSEIF DEFINED(MACOS64)}
LPlataforma := 'MACOS64';
{$ELSE}
LPlataforma := 'Não encontrada';
{$ENDIF}
Memo1.Lines.Add('Plataforma atual: ' + LPlataforma);
end;FRAMEWORK
- Verificar qual o Framework (VCL ou FMX)
procedure TViewMain.btnVclOuFmxClick(Sender: TObject);
var
LFramework: string;
begin
//AS SEGUINTES CONDICIONAIS ESTÃO DISPONÍVEIS A PARTIR DO RAD STUDIO 11.1 Alexandria, Release 1
//FRAMEWORK_VCL : Definido se o projeto usa o framework VCL
//FRAMEWORK_FMX : Definido se o projeto usa o framework FMX
//PARA VERSOES ANTERIORES AO 11.1 Alexandria, PODE SER DEFIDA MANUALMENTE. EXEMPLO:
{$IF CompilerVersion < 35.0)}
{$DEFINE FRAMEWORK_VCL}
{$ENDIF}
{$IFDEF FRAMEWORK_VCL}
LFramework := 'VCL';
{$ELSEIF DEFINED(FRAMEWORK_FMX)}
LFramework := 'FMX';
{$ELSE}
LFramework := 'Não encontrado';
{$ENDIF}
Memo1.Lines.Add('Plataforma atual: ' + LFramework);
end;VERSÃO DO DELPHI
- Verificar qual a versão do Delphi (VERXX)
procedure TViewMain.btnVersaoDelphiVERXXClick(Sender: TObject);
var
LNomeVersao: string;
begin
{$IFDEF VER300}
LNomeVersao := 'Delphi 10 Seattle (VER300)';
{$ELSEIF DEFINED(VER310)}
LNomeVersao := 'Delphi 10.1 Berlin (VER310)';
{$ELSEIF DEFINED(VER320)}
LNomeVersao := 'Delphi 10.2 Tokyo (VER320)';
{$ELSEIF DEFINED(VER330)}
LNomeVersao := 'Delphi 10.3 Rio (VER330)';
{$ELSEIF DEFINED(VER340)}
LNomeVersao := 'Delphi 10.4 Sydney (VER340)';
{$ELSEIF DEFINED(VER350)}
LNomeVersao := 'Delphi 11.0 Alexandria (VER350)';
{$ELSEIF DEFINED(VER360)}
LNomeVersao := 'Delphi 12.0 Athens (VER360)';
{$ELSE}
LNomeVersao := 'Versão ANTERIOR a Delphi 10 Seattle ' + sLineBreak + 'Sua versão é a: ' + CompilerVersion.ToString;
{$ENDIF}
Memo1.Lines.Add('A versão do seu Delphi é a: ' + LNomeVersao);
end;- Verificar qual a versão Delphi (CompilerVersion)
procedure TViewMain.btnVersaoDelphiCompilerVersionClick(Sender: TObject);
var
LNomeVersao: string;
begin
{$IF CompilerVersion = 30.0}
LNomeVersao := 'Delphi 10 Seattle';
{$ELSEIF CompilerVersion = 31.0)}
LNomeVersao := 'Delphi 10.1 Berlin';
{$ELSEIF CompilerVersion = 32.0)}
LNomeVersao := 'Delphi 10.2 Tokyo';
{$ELSEIF CompilerVersion = 33.0)}
LNomeVersao := 'Delphi 10.3 Rio';
{$ELSEIF CompilerVersion = 34.0)}
LNomeVersao := 'Delphi 10.4 Sydney';
{$ELSEIF CompilerVersion = 35.0)}
LNomeVersao := 'Delphi 11.0 Alexandria';
{$ELSEIF CompilerVersion = 36.0)}
LNomeVersao := 'Delphi 12.0 Athens';
{$ELSEIF CompilerVersion >= 37.0)}
LNomeVersao := 'Delphi maior ou igual a 37.0';
{$ELSE}
LNomeVersao := 'Versão ANTERIOR a Delphi 10 Seattle';
{$ENDIF}
Memo1.Lines.Add('A versão do seu Delphi é a: ' + LNomeVersao + ' - Número da CompilerVersion: ' + CompilerVersion.ToString);
if(CompilerVersion = 33)then
Memo1.Lines.Add('Function CompilerVersion = 33. Versão do seu delphi é 10.3 Rio')
else
Memo1.Lines.Add('Function CompilerVersion = ' + CompilerVersion.ToString);
end;- Verificar qual a versão Delphi (RTLVersion)
procedure TViewMain.btnVersaoDelphiRTLVersionClick(Sender: TObject);
var
LNomeVersao: string;
begin
{$IF RTLVersion = 30.0}
LNomeVersao := 'Delphi 10 Seattle';
{$ELSEIF RTLVersion = 31.0)}
LNomeVersao := 'Delphi 10.1 Berlin';
{$ELSEIF RTLVersion = 32.0)}
LNomeVersao := 'Delphi 10.2 Tokyo';
{$ELSEIF RTLVersion = 33.0)}
LNomeVersao := 'Delphi 10.3 Rio';
{$ELSEIF RTLVersion = 34.0)}
LNomeVersao := 'Delphi 10.4 Sydney';
{$ELSEIF RTLVersion = 35.0)}
LNomeVersao := 'Delphi 11.0 Alexandria';
{$ELSEIF RTLVersion = 36.0)}
LNomeVersao := 'Delphi 12.0 Athens';
{$ELSEIF RTLVersion >= 37.0)}
LNomeVersao := 'Delphi maior ou igual a 37.0';
{$ELSE}
LNomeVersao := 'Versão ANTERIOR a Delphi 10 Seattle';
{$ENDIF}
Memo1.Lines.Add('A versão do seu Delphi é a: ' + LNomeVersao + ' - Número da RTLVersion: ' + FloatToStr(RTLVersion));
end;SCOPEDENUMS
- No estado {$SCOPEDENUMS ON}, as enumerações têm escopo e os valores de enum não são adicionados ao escopo global
{$SCOPEDENUMS ON}
TAssinado = (Sim, Nao);
TEnviado = (Sim, Nao);
{$SCOPEDENUMS OFF}HINTS
- Desabilita Hints ao compilar, ou seja, não será exibido nenhum Hints a partir do ponto que a diretiva estiver, a não ser que exista a diretiva {$HINTS ON} no mesmo escopo
{$HINTS OFF}- Habilitar Hints ao compilar
{$HINTS ON}WARNINGS
- Desabilitar Warnings ao compilar, ou seja, não será exibido nenhum Warning a partir do ponto que a diretiva estiver
{$WARNINGS OFF}- Habilitar Warnings ao compilar
{$WARNINGS ON}WARNING MESSAGES
- Estas diretivas dão um controle sobre mensagens de avisos (warnings) individuais
Sintaxe:
{$WARN identifier ON | OFF | ERROR | DEFAULT}
{$WARN identifier ON} Permite que o compilador exiba o aviso especificado pelo identificador
{$WARN identifier OFF} O aviso especificado não é exibido
{$WARN identifier ERROR} O aviso especificado é tratado como erro
{$WARN identifier DEFAULT} Usa as configurações padrão da caixa de diálogo Opções do Projeto
Exemplos:
//HABILITA OS WARNINGS DO TIPO SYMBOL_EXPERIMENTAL
{$WARN SYMBOL_EXPERIMENTAL ON}
//DESABILITA OS WARNINGS DO TIPO SYMBOL_EXPERIMENTAL
{$WARN SYMBOL_EXPERIMENTAL OFF}
//TRANSFORMA OS WARINGS TIPO SYMBOL_EXPERIMENTAL EM ERROS
{$WARN SYMBOL_EXPERIMENTAL ERROR}Dica: Para evitar mensagens como essa “W1000 Symbol ‘Name’ is deprecated” em componentes e bibliotecas de terceiros. Basta usar a seguinte diretiva no inicio da Unit:
{$WARN SYMBOL_DEPRECATED OFF}Lista completa:
https://docwiki.embarcadero.com/RADStudio/Athens/en/Warning_messages_(Delphi)
💡 Dica:
A partir da versão 10.3 do Delphi, se você usar um custom attribute que não for conhecido pelo compilador (porque você o digitou incorretamente ou uma unidade estiver faltando na instrução uses), você irá receber um Warning:
Warning: W1074 Unknown custom attributeÉ recomendado transformar esse Warning em um erro, para que seja obrigatório a correção, para isso insira:
{$WARN UNKNOWN_CUSTOM_ATTRIBUTE ERROR}REGION
- Controla a exibição de regiões recolhíveis
{$REGION 'Minha região'}
procedure ExibirMsgTeste;
begin
ShowMessage('Minha mensagem de teste');
end;
{$ENDREGION}ARQUIVOS .inc
- Incluí um arquivo .inc onde podem ser inseridas diversas diretivas de compilação. (normalmente declarado logo após o nome da unit)
Sintaxe:
{$I arquivo.inc} OU {$INCLUDE arquivo.inc};
Exemplos:
{$I C4D.inc}
{$INCLUDE Includes\arquivo_inc_teste.inc}O arquivo com nome “arquivo_inc_teste.inc” está dentro de um diretório com o nome “Includes”. E nesse arquivo pode-se colocar diversas diretivas de compilação como por exemplo:
{$DEFINE DIRETIVA_TESTE}
{$IF CompilerVersion < 35.0)}
{$DEFINE DIRETIVA_TESTE_35}
{$ENDIF}USANDO O IDE
-
Você pode definir muitas das diretivas de compilação na caixa de diálogo da IDE em Project > Options > Delphi Compiler > Conditional defines. Essas diretivas afetam todas as unidades sempre que seu código-fonte é recompilado.
-
Se você estiver trabalhando no Editor de Código e quiser uma maneira rápida de ver as diretivas de compilação em vigor, pressione Ctrl + O + O. As configurações atuais das diretivas são inseridas em uma linha horizontal no topo do seu arquivo, junto com outras configurações atuais, como avisos do compilador (as configurações da diretiva $WARN). Essas listas são adicionadas ao início do seu arquivo de origem, a menos que você desfaça (Ctrl + Z) ou exclua manualmente a lista:

🔗 LINKS ÚTEIS
- Diretivas de compilação Delphi
- Lista de diretivas de compilação
- Conditional compilation
- Lista de Compiler Versions
- Lista de Warning Messages
Não esqueça de deixar seu comentário com dúvidas, dicas ou sugestões.
Abraços!


[…] Você também pode conferir tudo sobre diretivas de compilação aqui em nosso blog acessando o seguinte link: Diretivas de compilação no Delphi […]
Adorei conhecer seu blog, tem muito artigos bem interessantes.
Olá, Eduarda! Agradeço pelo comentário. Estamos trabalhando em novos artigos e logo teremos mais conteúdo para compartilhar!
Adorei conhecer seu blog, tem muito artigos bem interessantes.
Olá, muito obrigado!
Que interessante essa matéria que acabei de ler, até compartilhei no meu Facebook.
Olá Liliane, que bom que gostou! Obrigado por compartilhar.