Diretivas de Compilação...
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
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
Curtidas 0
Respostas
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:
E pra demonstrar o uso disso no evento onClick de um botão qualquer experimente isso?
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
16/01/2006
Olá [b:21dc8801b2]Titanius[/b:21dc8801b2]!
Vc pode usar a diretiva [b:21dc8801b2]$IFDEF[/b:21dc8801b2]:
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
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
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
;-)
[]´s
GOSTEI 0
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
[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
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
16/01/2006
Valeu pessoal, era disso que eu precisava, vai quebrar um galhão.. :D
Obrigado,
[]s
Obrigado,
[]s
GOSTEI 0
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:
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.
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
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:
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.
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
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:
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.
{$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}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
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´
Vou dar uma estuadada melhor, sobre a utilização ou não de ´Diretivas´
GOSTEI 0
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
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
16/01/2006
Tenho uma dúvida um pouco diferente, mas ainda sobre o mesmo assunto de diretiva.
Imaginem que eu tenho 3 projetos:
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:
Isso existe ou estou falando besteira ???!
Valeu
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