Diretivas de Compilação...

Delphi

16/01/2006

Olá, tenho um arquivo, onde tenho varias funcoes....e este arquivo é usado em todos os meus aplicativos, porem algumas funcoes so podem ser executadas se tiver um form dentro do projeto.. então eis minha pergunta:

existe alguma diretiva que eu possa colocar no arquivo, que impossibilite do compilador compila-la caso o form nao esteja no projeto?


desde já agradeço.

[]s


Titanius

Titanius

Curtidas 0

Respostas

Adriano Santos

Adriano Santos

16/01/2006

Titanius vc msm pode criar suas próprias directivas de compilação. Veja um exemplo:

1) Project >> Options do seu projeto.
2) Directories/Conditionals
3) No campo Conditional Defines vc coloca suas diretivas separadas por pont e virgula.

No código fonte vc vai testar se a diretiva existe:

{$IFDEF MINHA_DIRETIVA}
uses Unit2;
{$ENDIF}


E pra demonstrar o uso disso no evento onClick de um botão qualquer experimente isso?

procedure TForm1.Button1Click(Sender: TObject);
begin
  {$IFDEF MINHA_DIRETIVA}
    Form2 := TForm2.Create(Self);
    try
      Form2.ShowModal;
    finally
      FreeAndNil(Form2);
    end;
  {$ELSE}
    ShowMessage(´Form2 não existe´);
  {$ENDIF}
end;



GOSTEI 0
Michael

Michael

16/01/2006

Olá [b:21dc8801b2]Titanius[/b:21dc8801b2]!

Vc pode usar a diretiva [b:21dc8801b2]$IFDEF[/b:21dc8801b2]:

{$IFDEF MEUPROJETO}
  procedure A....
  function B...
{$ELSE}
  procedure C...
  function D...
{$ENDIF}


Depois, basta ir no menu [b:21dc8801b2]Project[/b:21dc8801b2]->[b:21dc8801b2]Options[/b:21dc8801b2], e na aba/nó [b:21dc8801b2]Directories[/b:21dc8801b2]/[b:21dc8801b2]Conditionals[/b:21dc8801b2], na caixa [b:21dc8801b2]Conditional defines[/b:21dc8801b2], digite ´MEUPROJETO´. Essa informação ficará salva com o arquivo de projeto da sua aplicação.

[]´s


GOSTEI 0
Michael

Michael

16/01/2006

Humpf, já é a terceira vez em menos de uma semana que eu preparo a resposta e envio depois que alguém já repondeu... :cry:

;-)

[]´s


GOSTEI 0
Dopi

Dopi

16/01/2006

Se vc faz referencia a uma Variavel do tipo TForm, não seria mais fácil usar algo do tipo:
[i:a7ec854685]if Assigned( VariavelSeuForm ) then ...[/i:a7ec854685]

Mas não é uma boa prática uma função usar o pre-suposto que uma determinada variavel já existe... Seria mais correto essas funções receberem a variavel do Form como parâmetro.

PS.: Se for usar o [i:a7ec854685]Assigned()[/i:a7ec854685], lembre-se de ´NILzar´ a variavel do Form depois de destrui-la:

Ex: [i:a7ec854685]FreeAndNil( VariavelSeuForm ) ; [/i:a7ec854685]
ou
[i:a7ec854685]VariavelSeuForm.Free ;
VariavelSeuForm := nil ; [/i:a7ec854685]

caso contrário o Assigned retornará True mesmo após vc efetuar o Free


GOSTEI 0
Adriano Santos

Adriano Santos

16/01/2006

Humpf, já é a terceira vez em menos de uma semana que eu preparo a resposta e envio depois que alguém já repondeu... :cry: ;-) []´s


Esquenta não irmão estamos em casa. :lol:


GOSTEI 0
Titanius

Titanius

16/01/2006

Valeu pessoal, era disso que eu precisava, vai quebrar um galhão.. :D


Obrigado,

[]s


GOSTEI 0
Vitor Alcantara

Vitor Alcantara

16/01/2006

Aproveitando esse tópico eu gostaria de saber se existe algum modo de eu atribuir um valor para um ´Diretiva´ (não sei se o termo é esse)?
Por exemplo eu tenho uma aplicação que roda em modo varejo e atacado com campos destintos na descrição do produto (Ex: Leite pó 12x400g e Lite pó 400g) então eu gostaria dependendo do tipo do ponto (Varejo ou Atacado) fosse feito uma coisa tipo:

{$IF atacado = 0  }
        if PerguntaS(Screen.ActiveForm.Handle,´Confirma a alteração no kit do produto "´+kit.CxNome +´" pelo produto "´+DmDados.SpLocProdutoCxNome.Value +´" ?´) then
        {$ELSE}
        if PerguntaS(Screen.ActiveForm.Handle,´Confirma a alteração no kit do produto "´+kit.UnNome +´" pelo produto "´+DmDados.SpLocProdutoUnNome.Value +´" ?´) then
        {$IFEND}

Onde a ´diretiva´ atacado seria passado na hora da inicialização do programa que iria verificar no banco de dados um campo com o nome atacado (onde 0 indica atacado e 1 varejo).

Agradeço desde já
Atenciosamente Vitor Araújo Alcântara.


GOSTEI 0
Emerson Nascimento

Emerson Nascimento

16/01/2006

[quote:666a402d17=´Vitor Araujo Alcantara´]Aproveitando esse tópico eu gostaria de saber se existe algum modo de eu atribuir um valor para um ´Diretiva´ (não sei se o termo é esse)?
Por exemplo eu tenho uma aplicação que roda em modo varejo e atacado com campos destintos na descrição do produto (Ex: Leite pó 12x400g e Lite pó 400g) então eu gostaria dependendo do tipo do ponto (Varejo ou Atacado) fosse feito uma coisa tipo:

{$IF atacado = 0  }
        if PerguntaS(Screen.ActiveForm.Handle,´Confirma a alteração no kit do produto "´+kit.CxNome +´" pelo produto "´+DmDados.SpLocProdutoCxNome.Value +´" ?´) then
        {$ELSE}
        if PerguntaS(Screen.ActiveForm.Handle,´Confirma a alteração no kit do produto "´+kit.UnNome +´" pelo produto "´+DmDados.SpLocProdutoUnNome.Value +´" ?´) then
        {$IFEND}

Onde a ´diretiva´ atacado seria passado na hora da inicialização do programa que iria verificar no banco de dados um campo com o nome atacado (onde 0 indica atacado e 1 varejo).

Agradeço desde já
Atenciosamente Vitor Araújo Alcântara.[/quote:666a402d17]
talvez no seu caso seja melhor trabalhar com parâmetros de linha de comando. procure por ParamStr() e veja se atende ao que você precisa.


GOSTEI 0
Adriano Santos

Adriano Santos

16/01/2006

[quote:1f634202cf=´Vitor Araujo Alcantara´]Aproveitando esse tópico eu gostaria de saber se existe algum modo de eu atribuir um valor para um ´Diretiva´ (não sei se o termo é esse)? Por exemplo eu tenho uma aplicação que roda em modo varejo e atacado com campos destintos na descrição do produto (Ex: Leite pó 12x400g e Lite pó 400g) então eu gostaria dependendo do tipo do ponto (Varejo ou Atacado) fosse feito uma coisa tipo:
{$IF atacado = 0  }
        if PerguntaS(Screen.ActiveForm.Handle,´Confirma a alteração no kit do produto "´+kit.CxNome +´" pelo produto "´+DmDados.SpLocProdutoCxNome.Value +´" ?´) then
        {$ELSE}
        if PerguntaS(Screen.ActiveForm.Handle,´Confirma a alteração no kit do produto "´+kit.UnNome +´" pelo produto "´+DmDados.SpLocProdutoUnNome.Value +´" ?´) then
        {$IFEND}
Onde a ´diretiva´ atacado seria passado na hora da inicialização do programa que iria verificar no banco de dados um campo com o nome atacado (onde 0 indica atacado e 1 varejo). Agradeço desde já Atenciosamente Vitor Araújo Alcântara.

talvez no seu caso seja melhor trabalhar com parâmetros de linha de comando. procure por ParamStr() e veja se atende ao que você precisa.[/quote:1f634202cf]
Também opto pela dica do [b:1f634202cf]emerson.en[/b:1f634202cf], porém é possível ´atribuir´ um valor a uma diretiva usando arquivos .inc se não me falha a memória. Alguém me corrija por favor?


GOSTEI 0
Vitor Alcantara

Vitor Alcantara

16/01/2006

Adriano, Emerson.En muito obrigado pela atenção.
Vou dar uma estuadada melhor, sobre a utilização ou não de ´Diretivas´


GOSTEI 0
Massuda

Massuda

16/01/2006

[quote:aad985b116=´Vitor Araujo Alcantara´]Onde a ´diretiva´ atacado seria passado na hora da inicialização do programa que iria verificar no banco de dados um campo com o nome atacado (onde 0 indica atacado e 1 varejo).[/quote:aad985b116]Diretivas não funcionam dessa forma. Elas são ´variáveis´ avaliadas pelo compilador durante a compilação. O programa resultante nem tem consciencia de que as diretivas existem. Siga a dica do emerson.en.


GOSTEI 0
Vitor Alcantara

Vitor Alcantara

16/01/2006

Muito obrigado Massuda pelo seu esclarecimento. Agora eu consegui ter uma idéia melhor da utilização de ´Diretivas´.


GOSTEI 0
Powerlog Tecnologia

Powerlog Tecnologia

16/01/2006

Tenho uma dúvida um pouco diferente, mas ainda sobre o mesmo assunto de diretiva.

Imaginem que eu tenho 3 projetos:

- PROJETO_A - PROJETO_B - PROJETO_C


Tenho alguns forms que são em comum a todos os projetos, então a chamada deles fica fora dos ´IFDEFs´.

Porém alguns forms são compartilhados por dois projetos, A e B / A e C , etc.

Como eu resolvi hoje: dentro das diretivas, repliquei o código do create form.

Minha dúvida: existe alguma forma de colocar um ´OR´ de diretiva?

Ex:

{$IFDEF PROJETO_A} OR {$IFDEF PROJETO_B}


Isso existe ou estou falando besteira ???!

Valeu


GOSTEI 0
POSTAR